2006-10-08 Paul Brook <paul@codesourcery.com>
[binutils-gdb.git] / gdb / cp-abi.h
index bd5430d5a936179629c30aa9aaa88c8ab6666fc8..6c77824d15f8dbbc7e6c3329ea41defbacb49cc2 100644 (file)
@@ -1,7 +1,9 @@
 /* Abstraction of various C++ ABI's we support, and the info we need
    to get from them.
+
    Contributed by Daniel Berlin <dberlin@redhat.com>
-   Copyright 2001 Free Software Foundation, Inc.
+
+   Copyright (C) 2001, 2005 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 #ifndef CP_ABI_H_
 #define CP_ABI_H_ 1
 
+struct fn_field;
+struct type;
+struct value;
+
 /* The functions here that attempt to determine what sort of thing a
    mangled name refers to may well be revised in the future.  It would
    certainly be cleaner to carry this information explicitly in GDB's
@@ -99,9 +105,9 @@ extern int is_operator_name (const char *name);
    TYPE is the base type of *VALUEP whose method we're invoking ---
    this is the type containing F.  OFFSET is the offset of that base
    type within *VALUEP.  */
-extern value_ptr value_virtual_fn_field (value_ptr *valuep,
-                                        struct fn_field *f, int j,
-                                        struct type *type, int offset);
+extern struct value *value_virtual_fn_field (struct value **valuep,
+                                            struct fn_field *f, int j,
+                                            struct type *type, int offset);
 
 
 /* Try to find the run-time type of VALUE, using C++ run-time type
@@ -117,7 +123,7 @@ extern value_ptr value_virtual_fn_field (value_ptr *valuep,
        of the complete object to the start of the embedded subobject
        VALUE represents.  In other words, the enclosing object starts
        at VALUE_ADDR (VALUE) + VALUE_OFFSET (VALUE) +
-       VALUE_EMBEDDED_OFFSET (VALUE) + *TOP
+       value_embedded_offset (VALUE) + *TOP
      - If *USING_ENC is non-zero, then *TOP is the offset from the
        address of the complete object to the enclosing object stored
        in VALUE.  In other words, the enclosing object starts at
@@ -130,7 +136,17 @@ extern value_ptr value_virtual_fn_field (value_ptr *valuep,
 extern struct type *value_rtti_type (struct value *value,
                                      int *full, int *top, int *using_enc);
 
+/* Compute the offset of the baseclass which is
+   the INDEXth baseclass of class TYPE,
+   for value at VALADDR (in host) at ADDRESS (in target).
+   The result is the offset of the baseclass value relative
+   to (the address of)(ARG) + OFFSET.
+
+   -1 is returned on error. */
 
+extern int baseclass_offset (struct type *type, int index,
+                            const bfd_byte *valaddr, CORE_ADDR address);
+                  
 struct cp_abi_ops
 {
   const char *shortname;
@@ -142,18 +158,17 @@ struct cp_abi_ops
   enum dtor_kinds (*is_destructor_name) (const char *name);
   int (*is_vtable_name) (const char *name);
   int (*is_operator_name) (const char *name);
-  value_ptr (*virtual_fn_field) (value_ptr * arg1p, struct fn_field * f,
-                                int j, struct type * type, int offset);
-  struct type *(*rtti_type) (value_ptr v, int *full, int *top,
+  struct value *(*virtual_fn_field) (struct value **arg1p, struct fn_field * f,
+                                    int j, struct type * type, int offset);
+  struct type *(*rtti_type) (struct value *v, int *full, int *top,
                             int *using_enc);
+  int (*baseclass_offset) (struct type *type, int index,
+                          const bfd_byte *valaddr, CORE_ADDR address);
 };
 
 
-extern struct cp_abi_ops *cp_abis;
-extern int num_cp_abis;
-extern struct cp_abi_ops current_cp_abi;
-extern int register_cp_abi (struct cp_abi_ops abi);
-extern int switch_to_cp_abi (const char *short_name);
+extern int register_cp_abi (struct cp_abi_ops *abi);
+extern void set_cp_abi_as_auto_default (const char *short_name);
 
 #endif