diff options
author | Doug Evans <xdje42@gmail.com> | 2015-01-31 21:21:01 -0800 |
---|---|---|
committer | Doug Evans <xdje42@gmail.com> | 2015-01-31 21:21:01 -0800 |
commit | 09e2d7c72040dd2d1833c140b5f04a85bc3f6a0f (patch) | |
tree | af43cb916c40daf7667f517c615abe47251046ec /gdb/gdbtypes.h | |
parent | 4bfb94b8648cebad2683d24ebe033ef539df1dbb (diff) | |
download | gdb-09e2d7c72040dd2d1833c140b5f04a85bc3f6a0f.zip gdb-09e2d7c72040dd2d1833c140b5f04a85bc3f6a0f.tar.gz gdb-09e2d7c72040dd2d1833c140b5f04a85bc3f6a0f.tar.bz2 |
Move TYPE_SELF_TYPE into new field type_specific.
This patch moves TYPE_SELF_TYPE into new field type_specific.self_type
for MEMBERPTR,METHODPTR types, and into type_specific.func_stuff
for METHODs, and then updates everything to use that.
TYPE_CODE_METHOD could share some things with TYPE_CODE_FUNC
(e.g. TYPE_NO_RETURN) and it seemed simplest to keep them together.
Moving TYPE_SELF_TYPE into type_specific.func_stuff for TYPE_CODE_METHOD
is also nice because when we allocate space for function types we assume
they're TYPE_CODE_FUNCs. If TYPE_CODE_METHODs don't need or use that
space then that space would be wasted, and cleaning that up would involve
more invasive changes.
In order to catch errant uses I've added accessor functions
that do some checking.
One can no longer assign to TYPE_SELF_TYPE like this:
TYPE_SELF_TYPE (foo) = bar;
One instead has to do:
set_type_self_type (foo, bar);
But I've left reading of the type to the macro:
bar = TYPE_SELF_TYPE (foo);
In order to discourage bypassing the TYPE_SELF_TYPE macro
I've named the underlying function that implements it
internal_type_self_type.
While testing this I found the stabs reader leaving methods
as TYPE_CODE_FUNCs, hitting my newly added asserts.
Since the dwarf reader smashes functions to methods (via
smash_to_method) I've done a similar thing for stabs.
gdb/ChangeLog:
* cp-valprint.c (cp_find_class_member): Rename parameter domain_p
to self_p.
(cp_print_class_member): Rename local domain to self_type.
* dwarf2read.c (quirk_gcc_member_function_pointer): Rename local
domain_type to self_type.
(set_die_type) <need_gnat_info>: Handle
TYPE_CODE_METHODPTR, TYPE_CODE_MEMBERPTR, TYPE_CODE_METHOD.
* gdb-gdb.py (StructMainTypePrettyPrinter): Handle
TYPE_SPECIFIC_SELF_TYPE.
* gdbtypes.c (internal_type_self_type): New function.
(set_type_self_type): New function.
(smash_to_memberptr_type): Rename parameter domain to self_type.
Update setting of TYPE_SELF_TYPE.
(smash_to_methodptr_type): Update setting of TYPE_SELF_TYPE.
(smash_to_method_type): Rename parameter domain to self_type.
Update setting of TYPE_SELF_TYPE.
(check_stub_method): Call smash_to_method_type.
(recursive_dump_type): Handle TYPE_SPECIFIC_SELF_TYPE.
(copy_type_recursive): Ditto.
* gdbtypes.h (enum type_specific_kind): New value
TYPE_SPECIFIC_SELF_TYPE.
(struct main_type) <type_specific>: New member self_type.
(struct cplus_struct_type) <fn_field.type>: Update comment.
(TYPE_SELF_TYPE): Rewrite.
(internal_type_self_type, set_type_self_type): Declare.
* gnu-v3-abi.c (gnuv3_print_method_ptr): Rename local domain to
self_type.
(gnuv3_method_ptr_to_value): Rename local domain_type to self_type.
* m2-typeprint.c (m2_range): Replace TYPE_SELF_TYPE with
TYPE_TARGET_TYPE.
* stabsread.c (read_member_functions): Mark methods with
TYPE_CODE_METHOD, not TYPE_CODE_FUNC. Update setting of
TYPE_SELF_TYPE.
Diffstat (limited to 'gdb/gdbtypes.h')
-rw-r--r-- | gdb/gdbtypes.h | 38 |
1 files changed, 24 insertions, 14 deletions
diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index 7f90ec6..50ffef3 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -439,7 +439,7 @@ enum field_loc_kind /* * A discriminant to determine which field in the main_type.type_specific union is being used, if any. - For types such as TYPE_CODE_FLT or TYPE_CODE_FUNC, the use of this + For types such as TYPE_CODE_FLT, the use of this discriminant is really redundant, as we know from the type code which field is going to be used. As such, it would be possible to reduce the size of this enum in order to save a bit or two for @@ -453,7 +453,9 @@ enum type_specific_kind TYPE_SPECIFIC_CPLUS_STUFF, TYPE_SPECIFIC_GNAT_STUFF, TYPE_SPECIFIC_FLOATFORMAT, - TYPE_SPECIFIC_FUNC + /* Note: This is used by TYPE_CODE_FUNC and TYPE_CODE_METHOD. */ + TYPE_SPECIFIC_FUNC, + TYPE_SPECIFIC_SELF_TYPE }; /* * Main structure representing a type in GDB. @@ -678,13 +680,6 @@ struct main_type VPTR_BASETYPE is the base class which defined the virtual function table pointer. - For types that are pointer to member types (TYPE_CODE_METHODPTR, - TYPE_CODE_MEMBERPTR), VPTR_BASETYPE is the type that this pointer - is a member of. - - For method types (TYPE_CODE_METHOD), VPTR_BASETYPE is the aggregate - type that contains the method. - Unused otherwise. */ struct type *vptr_basetype; @@ -712,9 +707,15 @@ struct main_type const struct floatformat **floatformat; - /* * For TYPE_CODE_FUNC types, */ + /* * For TYPE_CODE_FUNC and TYPE_CODE_METHOD types. */ struct func_type *func_stuff; + + /* * For types that are pointer to member types (TYPE_CODE_METHODPTR, + TYPE_CODE_MEMBERPTR), SELF_TYPE is the type that this pointer + is a member of. */ + + struct type *self_type; } type_specific; /* * Contains a location description value for the current type. Evaluating @@ -904,7 +905,7 @@ struct cplus_struct_type (This comment used to say "The return value of the method", but that's wrong. The function type is - expected here, i.e. something with TYPE_CODE_FUNC, and + expected here, i.e. something with TYPE_CODE_METHOD, and *not* the return-value type). */ struct type *type; @@ -1014,7 +1015,7 @@ struct gnat_aux_type struct type* descriptive_type; }; -/* * For TYPE_CODE_FUNC types. */ +/* * For TYPE_CODE_FUNC and TYPE_CODE_METHOD types. */ struct func_type { @@ -1039,6 +1040,11 @@ struct func_type DW_TAG_GNU_call_site's exist in such function. */ struct call_site *tail_call_list; + + /* * For method types (TYPE_CODE_METHOD), the aggregate type that + contains the method. */ + + struct type *self_type; }; /* struct call_site_parameter can be referenced in callees by several ways. */ @@ -1232,8 +1238,12 @@ extern void allocate_gnat_aux_type (struct type *); /* C++ */ +#define TYPE_SELF_TYPE(thistype) internal_type_self_type (thistype) +/* Do not call this, use TYPE_SELF_TYPE. */ +extern struct type *internal_type_self_type (struct type *); +extern void set_type_self_type (struct type *, struct type *); + #define TYPE_VPTR_BASETYPE(thistype) TYPE_MAIN_TYPE(thistype)->vptr_basetype -#define TYPE_SELF_TYPE(thistype) TYPE_MAIN_TYPE(thistype)->vptr_basetype #define TYPE_VPTR_FIELDNO(thistype) TYPE_MAIN_TYPE(thistype)->vptr_fieldno #define TYPE_NFN_FIELDS(thistype) TYPE_CPLUS_SPECIFIC(thistype)->nfn_fields #define TYPE_SPECIFIC_FIELD(thistype) \ @@ -1655,7 +1665,7 @@ extern struct type *lookup_memberptr_type (struct type *, struct type *); extern struct type *lookup_methodptr_type (struct type *); -extern void smash_to_method_type (struct type *type, struct type *domain, +extern void smash_to_method_type (struct type *type, struct type *self_type, struct type *to_type, struct field *args, int nargs, int varargs); |