/* 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, 2006, 2007 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;
+struct ui_file;
+
/* 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
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
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
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);
+
+/* Describe the target of a pointer to method. CONTENTS is the byte
+ pattern representing the pointer to method. TYPE is the pointer to
+ method type. STREAM is the stream to print it to. */
+void cplus_print_method_ptr (const gdb_byte *contents, struct type *type,
+ struct ui_file *stream);
+
+/* Return the size of a pointer to member function for the current
+ architecture. */
+int cplus_method_ptr_size (void);
+
+/* Return the method which should be called by applying METHOD_PTR
+ to *THIS_P, and adjust *THIS_P if necessary. */
+struct value *cplus_method_ptr_to_value (struct value **this_p,
+ struct value *method_ptr);
+
+/* Create the byte pattern in CONTENTS representing a pointer to
+ member function at ADDRESS (if IS_VIRTUAL is 0) or with virtual
+ table offset ADDRESS (if IS_VIRTUAL is 1). This is the opposite
+ of cplus_method_ptr_to_value. */
+void cplus_make_method_ptr (gdb_byte *CONTENTS, CORE_ADDR address,
+ int is_virtual);
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);
+ void (*print_method_ptr) (const gdb_byte *contents, struct type *type,
+ struct ui_file *stream);
+ int (*method_ptr_size) (void);
+ void (*make_method_ptr) (gdb_byte *, CORE_ADDR, int);
+ struct value * (*method_ptr_to_value) (struct value **, struct value *);
};
-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