diff options
author | Dodji Seketeli <dodji@redhat.com> | 2010-11-29 16:29:05 +0000 |
---|---|---|
committer | Dodji Seketeli <dodji@gcc.gnu.org> | 2010-11-29 17:29:05 +0100 |
commit | 34f3d643a8b8a83b6b2d06513884207103ab193d (patch) | |
tree | 7f5f6c6394af43677d14579fd0dec0020111c8a3 | |
parent | 7607219dc3b38d63a26df4121f89e412fb8b4da2 (diff) | |
download | gcc-34f3d643a8b8a83b6b2d06513884207103ab193d.zip gcc-34f3d643a8b8a83b6b2d06513884207103ab193d.tar.gz gcc-34f3d643a8b8a83b6b2d06513884207103ab193d.tar.bz2 |
re PR debug/46101 (ICE: in build_abbrev_table, at dwarf2out.c:10333 with -feliminate-dwarf2-dups -g)
Fix PR debug/46101
gcc/
* dwarf2out.c (lookup_type_die_strip_naming_typedef): New
function.
(scope_die_for, gen_type_die_for_member): Replace uses of
lookup_type_die with use of lookup_type_die_strip_naming_typedef.
gcc/testsuite/
* g++.dg/debug/dwarf2/typedef5.C: New test
From-SVN: r167246
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/dwarf2out.c | 26 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/debug/dwarf2/typedef5.C | 10 |
4 files changed, 47 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6793d6b..09fc957 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2010-11-29 Dodji Seketeli <dodji@redhat.com> + + PR debug/46101 + * dwarf2out.c (lookup_type_die_strip_naming_typedef): New + function. + (scope_die_for, gen_type_die_for_member): Replace uses of + lookup_type_die with use of lookup_type_die_strip_naming_typedef. + 2010-11-29 Iain Sandoe <iains@gcc.gnu.org> * config/darwin.c (darwin_mergeable_string_section): Remove blank line. diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index dfb5720..7e788a4 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -6264,6 +6264,7 @@ static void remove_child_TAG (dw_die_ref, enum dwarf_tag); static void add_child_die (dw_die_ref, dw_die_ref); static dw_die_ref new_die (enum dwarf_tag, dw_die_ref, tree); static dw_die_ref lookup_type_die (tree); +static dw_die_ref lookup_type_die_strip_naming_typedef (tree); static void equate_type_number_to_die (tree, dw_die_ref); static hashval_t decl_die_table_hash (const void *); static int decl_die_table_eq (const void *, const void *); @@ -8033,6 +8034,27 @@ lookup_type_die (tree type) return TYPE_SYMTAB_DIE (type); } +/* Like lookup_type_die, but if type is an anonymous type named by a + typedef[1], return the DIE of the anonymous type instead the one of + the naming typedef. This is because in gen_typedef_die, we did + equate the anonymous struct named by the typedef with the DIE of + the naming typedef. So by default, lookup_type_die on an anonymous + struct yields the DIE of the naming typedef. + + [1]: Read the comment of is_naming_typedef_decl to learn about what + a naming typedef is. */ + +static inline dw_die_ref +lookup_type_die_strip_naming_typedef (tree type) +{ + dw_die_ref die = lookup_type_die (type); + if (TREE_CODE (type) == RECORD_TYPE + && die->die_tag == DW_TAG_typedef + && is_naming_typedef_decl (TYPE_NAME (type))) + die = get_AT_ref (die, DW_AT_type); + return die; +} + /* Equate a DIE to a given type specifier. */ static inline void @@ -17887,7 +17909,7 @@ scope_die_for (tree t, dw_die_ref context_die) scope_die = comp_unit_die (); } else - scope_die = lookup_type_die (containing_scope); + scope_die = lookup_type_die_strip_naming_typedef (containing_scope); } else scope_die = context_die; @@ -18714,7 +18736,7 @@ gen_type_die_for_member (tree type, tree member, dw_die_ref context_die) gcc_assert (!decl_ultimate_origin (member)); push_decl_scope (type); - type_die = lookup_type_die (type); + type_die = lookup_type_die_strip_naming_typedef (type); if (TREE_CODE (member) == FUNCTION_DECL) gen_subprogram_die (member, type_die); else if (TREE_CODE (member) == FIELD_DECL) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7e7ef57..79a12a0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-11-29 Dodji Seketeli <dodji@redhat.com> + + PR debug/46101 + * g++.dg/debug/dwarf2/typedef5.C: New test + 2010-11-29 Iain Sandoe <iains@gcc.gnu.org> Mike Stump <mrs@gcc.gnu.org> diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/typedef5.C b/gcc/testsuite/g++.dg/debug/dwarf2/typedef5.C new file mode 100644 index 0000000..d9d058c --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/dwarf2/typedef5.C @@ -0,0 +1,10 @@ +// Origin: PR debug/46101 +// { dg-options "-g -feliminate-dwarf2-dups" } +// { dg-do compile } + +typedef struct +{ + virtual void f () { } +} A; + +A a; |