X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fcp-abi.h;h=5e9ffbe3d24672d8867f0f2c6f6416489de515aa;hb=43816ebc335481c99808c4fdfffb9ea3f510b19a;hp=7c1e9521e033fbadbf3bc399f107deffe1b7aa75;hpb=1514d34ee09f4a99b7f87f308c642a8df525255a;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/cp-abi.h b/gdb/cp-abi.h index 7c1e9521e0..5e9ffbe3d2 100644 --- a/gdb/cp-abi.h +++ b/gdb/cp-abi.h @@ -1,15 +1,15 @@ /* Abstraction of various C++ ABI's we support, and the info we need to get from them. + Contributed by Daniel Berlin - Copyright 2001 Free Software Foundation, Inc. + + Copyright (C) 2001-2020 Free Software Foundation, Inc. This file is part of GDB. - This program is free software; you can redistribute it and/or - modify - it under the terms of the GNU General Public License as published - by - the Free Software Foundation; either version 2 of the License, or + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -18,14 +18,16 @@ GNU General Public License for more details. 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. */ + along with this program. If not, see . */ -#ifndef CP_ABI_H_ -#define CP_ABI_H_ 1 +#ifndef CP_ABI_H +#define CP_ABI_H +struct fn_field; +struct type; struct value; +struct ui_file; +struct frame_info; /* 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 @@ -66,7 +68,8 @@ enum dtor_kinds { `delete'. */ complete_object_dtor, - /* A destructor which finalizes a subobject of some larger object. */ + /* A destructor which finalizes a subobject of some larger + object. */ base_object_dtor }; @@ -102,8 +105,10 @@ extern int is_operator_name (const char *name); this is the type containing F. OFFSET is the offset of that base type within *VALUEP. */ extern struct value *value_virtual_fn_field (struct value **valuep, - struct fn_field *f, int j, - struct type *type, int offset); + 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 @@ -119,7 +124,7 @@ extern struct value *value_virtual_fn_field (struct value **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,44 +135,124 @@ extern struct value *value_virtual_fn_field (struct value **valuep, FULL, TOP, and USING_ENC can each be zero, in which case we don't provide the corresponding piece of information. */ extern struct type *value_rtti_type (struct value *value, - int *full, int *top, int *using_enc); + int *full, LONGEST *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), offset by EMBEDDED_OFFSET. VALADDR points to the raw + contents of VAL. The result is the offset of the baseclass value + relative to (the address of)(ARG) + OFFSET. */ + +extern int baseclass_offset (struct type *type, + int index, const gdb_byte *valaddr, + LONGEST embedded_offset, + CORE_ADDR address, + const struct value *val); + +/* 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 of type + TO_TYPE. */ +int cplus_method_ptr_size (struct type *to_type); + +/* 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 of type + TYPE 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 (struct type *type, gdb_byte *CONTENTS, + CORE_ADDR address, int is_virtual); + +/* Print the vtable for VALUE, if there is one. If there is no + vtable, print a message, but do not throw. */ + +void cplus_print_vtable (struct value *value); + +/* Implement 'typeid': find the type info for VALUE, if possible. If + the type info cannot be found, throw an exception. */ -/* 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. +extern struct value *cplus_typeid (struct value *value); - -1 is returned on error. */ +/* Return the type of 'typeid' for the current C++ ABI on the given + architecture. */ + +extern struct type *cplus_typeid_type (struct gdbarch *gdbarch); + +/* Given a value which holds a pointer to a std::type_info, return the + type which that type_info represents. Throw an exception if the + type cannot be found. */ + +extern struct type *cplus_type_from_type_info (struct value *value); + +/* Given a value which holds a pointer to a std::type_info, return the + name of the type which that type_info represents. Throw an + exception if the type name cannot be found. */ + +extern std::string cplus_typename_from_type_info (struct value *value); + +/* Determine if we are currently in a C++ thunk. If so, get the + address of the routine we are thunking to and continue to there + instead. */ + +CORE_ADDR cplus_skip_trampoline (struct frame_info *frame, + CORE_ADDR stop_pc); + +/* Return a struct that provides pass-by-reference information + about the given TYPE. */ + +extern struct language_pass_by_ref_info cp_pass_by_reference + (struct type *type); -extern int baseclass_offset (struct type *type, int index, char *valaddr, - CORE_ADDR address); - struct cp_abi_ops { const char *shortname; const char *longname; const char *doc; - /* ABI-specific implementations for the functions declared above. */ + /* ABI-specific implementations for the functions declared + above. */ enum ctor_kinds (*is_constructor_name) (const char *name); enum dtor_kinds (*is_destructor_name) (const char *name); int (*is_vtable_name) (const char *name); int (*is_operator_name) (const char *name); - 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, char *valaddr, - CORE_ADDR address); + 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, + LONGEST *top, int *using_enc); + int (*baseclass_offset) (struct type *type, int index, + const bfd_byte *valaddr, LONGEST embedded_offset, + CORE_ADDR address, const struct value *val); + void (*print_method_ptr) (const gdb_byte *contents, + struct type *type, + struct ui_file *stream); + int (*method_ptr_size) (struct type *); + void (*make_method_ptr) (struct type *, gdb_byte *, + CORE_ADDR, int); + struct value * (*method_ptr_to_value) (struct value **, + struct value *); + void (*print_vtable) (struct value *); + struct value *(*get_typeid) (struct value *value); + struct type *(*get_typeid_type) (struct gdbarch *gdbarch); + struct type *(*get_type_from_type_info) (struct value *value); + std::string (*get_typename_from_type_info) (struct value *value); + CORE_ADDR (*skip_trampoline) (struct frame_info *, CORE_ADDR); + struct language_pass_by_ref_info (*pass_by_reference) (struct type *type); }; -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); - -#endif +extern int register_cp_abi (struct cp_abi_ops *abi); +extern void set_cp_abi_as_auto_default (const char *short_name); +#endif /* CP_ABI_H */