aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDodji Seketeli <dodji@redhat.com>2010-11-29 16:29:05 +0000
committerDodji Seketeli <dodji@gcc.gnu.org>2010-11-29 17:29:05 +0100
commit34f3d643a8b8a83b6b2d06513884207103ab193d (patch)
tree7f5f6c6394af43677d14579fd0dec0020111c8a3
parent7607219dc3b38d63a26df4121f89e412fb8b4da2 (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/dwarf2out.c26
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/typedef5.C10
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;