diff options
author | Daniel Jacobowitz <drow@false.org> | 2010-09-08 19:09:43 +0000 |
---|---|---|
committer | Daniel Jacobowitz <drow@false.org> | 2010-09-08 19:09:43 +0000 |
commit | c767944bf25ae52241366d9bdc7ba14b493f17eb (patch) | |
tree | 322a298962eafe7852fad3d99848edcf3fd8cbc4 /gdb/dwarf2read.c | |
parent | 561d38252c8b1c7a006eb58f079d3d650bee5743 (diff) | |
download | gdb-c767944bf25ae52241366d9bdc7ba14b493f17eb.zip gdb-c767944bf25ae52241366d9bdc7ba14b493f17eb.tar.gz gdb-c767944bf25ae52241366d9bdc7ba14b493f17eb.tar.bz2 |
gdb/
* dwarf2read.c (read_structure_type): Move processing of
fields and member functions from here...
(process_structure_scope): ... to here.
gdb/testsuite/
* gdb.cp/templates.cc (Empty, FunctionArg): New classes.
(FunctionArg::method): New function.
(empty, arg): New variables.
(main): Call arg.method.
* gdb.cp/templates.exp (test_template_args): New function.
(do_tests): Call it.
Diffstat (limited to 'gdb/dwarf2read.c')
-rw-r--r-- | gdb/dwarf2read.c | 48 |
1 files changed, 26 insertions, 22 deletions
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c index 3720891..b7d3b21 100644 --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c @@ -6643,11 +6643,12 @@ quirk_gcc_member_function_pointer (struct type *type, struct objfile *objfile) } /* Called when we find the DIE that starts a structure or union scope - (definition) to process all dies that define the members of the - structure or union. + (definition) to create a type for the structure or union. Fill in + the type's name and general properties; the members will not be + processed until process_structure_type. - NOTE: we need to call struct_type regardless of whether or not the - DIE has an at_name attribute, since it might be an anonymous + NOTE: we need to call these functions regardless of whether or not the + DIE has a DW_AT_name attribute, since it might be an anonymous structure or union. This gets the type entered into our set of user defined types. @@ -6665,7 +6666,6 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu) struct type *type; struct attribute *attr; char *name; - struct cleanup *back_to; /* If the definition of this type lives in .debug_types, read that type. Don't follow DW_AT_specification though, that will take us back up @@ -6687,8 +6687,6 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu) return set_die_type (die, type, cu); } - back_to = make_cleanup (null_cleanup, 0); - type = alloc_type (objfile); INIT_CPLUS_SPECIFIC (type); @@ -6763,11 +6761,29 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu) /* set_die_type should be already done. */ set_descriptive_type (type, die, cu); + return type; +} + +/* Finish creating a structure or union type, including filling in + its members and creating a symbol for it. */ + +static void +process_structure_scope (struct die_info *die, struct dwarf2_cu *cu) +{ + struct objfile *objfile = cu->objfile; + struct die_info *child_die = die->child; + struct type *type; + + type = get_die_type (die, cu); + if (type == NULL) + type = read_structure_type (die, cu); + if (die->child != NULL && ! die_is_declaration (die, cu)) { struct field_info fi; struct die_info *child_die; VEC (symbolp) *template_args = NULL; + struct cleanup *back_to = make_cleanup (null_cleanup, 0); memset (&fi, 0, sizeof (struct field_info)); @@ -6918,24 +6934,12 @@ read_structure_type (struct die_info *die, struct dwarf2_cu *cu) *dest = *src; } } + + do_cleanups (back_to); } quirk_gcc_member_function_pointer (type, cu->objfile); - do_cleanups (back_to); - return type; -} - -static void -process_structure_scope (struct die_info *die, struct dwarf2_cu *cu) -{ - struct die_info *child_die = die->child; - struct type *this_type; - - this_type = get_die_type (die, cu); - if (this_type == NULL) - this_type = read_structure_type (die, cu); - /* NOTE: carlton/2004-03-16: GCC 3.4 (or at least one of its snapshots) has been known to create a die giving a declaration for a class that has, as a child, a die giving a definition for a @@ -6964,7 +6968,7 @@ process_structure_scope (struct die_info *die, struct dwarf2_cu *cu) attribute, and a declaration attribute. */ if (dwarf2_attr (die, DW_AT_byte_size, cu) != NULL || !die_is_declaration (die, cu)) - new_symbol (die, this_type, cu); + new_symbol (die, type, cu); } /* Given a DW_AT_enumeration_type die, set its type. We do not |