aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDodji Seketeli <dodji@redhat.com>2010-12-17 10:39:21 +0000
committerDodji Seketeli <dodji@gcc.gnu.org>2010-12-17 11:39:21 +0100
commitd997fbe8f13ec31efcb9f744913269d736054a8f (patch)
tree8598995a9270af7853b3d4b0110123f2918a1296 /gcc
parenta4ad1c7a089e4bbb21dc6e9f97d4beef52577d6a (diff)
downloadgcc-d997fbe8f13ec31efcb9f744913269d736054a8f.zip
gcc-d997fbe8f13ec31efcb9f744913269d736054a8f.tar.gz
gcc-d997fbe8f13ec31efcb9f744913269d736054a8f.tar.bz2
re PR debug/45088 (pointer type information lost in debuginfo)
Fix for PR debug/45088 gcc/ * dwarf2out.c (gen_type_die_with_usage): Do not try to emit debug info for a redundant typedef that has DECL_ORIGINAL_TYPE set. Use that underlying type instead. gcc/testsuite/ * g++.dg/debug/dwarf2/self-ref-1.C: New test. * g++.dg/debug/dwarf2/self-ref-2.C: Likewise. From-SVN: r167976
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/dwarf2out.c12
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C28
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C29
5 files changed, 79 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0e37943..571760f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2010-12-17 Dodji Seketeli <dodji@redhat.com>
+
+ * dwarf2out.c (gen_type_die_with_usage): Do not try to emit debug
+ info for a redundant typedef that has DECL_ORIGINAL_TYPE set. Use
+ that underlying type instead.
+
2010-12-16 Jan Hubicka <jh@suse.cz>
PR middle-end/44563
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index c985527..1fa3300 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -20251,13 +20251,23 @@ gen_tagged_type_die (tree type,
static void
gen_type_die_with_usage (tree type, dw_die_ref context_die,
- enum debug_info_usage usage)
+ enum debug_info_usage usage)
{
struct array_descr_info info;
if (type == NULL_TREE || type == error_mark_node)
return;
+ if (TYPE_NAME (type) != NULL_TREE
+ && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
+ && is_redundant_typedef (TYPE_NAME (type))
+ && DECL_ORIGINAL_TYPE (TYPE_NAME (type)))
+ /* The DECL of this type is a typedef we don't want to emit debug
+ info for but we want debug info for its underlying typedef.
+ This can happen for e.g, the injected-class-name of a C++
+ type. */
+ type = DECL_ORIGINAL_TYPE (TYPE_NAME (type));
+
/* If TYPE is a typedef type variant, let's generate debug info
for the parent typedef which TYPE is a type of. */
if (typedef_variant_p (type))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index df91d09..8cfa5c0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-12-17 Dodji Seketeli <dodji@redhat.com>
+
+ * g++.dg/debug/dwarf2/self-ref-1.C: New test.
+ * g++.dg/debug/dwarf2/self-ref-2.C: Likewise.
+
2010-12-16 Sebastian Pop <sebastian.pop@amd.com>
PR tree-optimization/46924
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C b/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C
new file mode 100644
index 0000000..81bcb27
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C
@@ -0,0 +1,28 @@
+// Origin: PR debug/45088
+// { dg-do compile }
+// { dg-options "-g -dA" }
+// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_pointer_type\\)\[\n\r\]{1,2}\[^\n\r\]*DW_AT_byte_size\[\n\r\]{1,2}\[^\n\r\]*DW_AT_type" 4 } }
+
+struct A
+{
+ virtual ~A();
+};
+
+struct B : public A
+{
+ virtual ~B(){}
+};
+
+struct C : public B
+{
+ A* a1;
+};
+
+int
+main()
+{
+ C c;
+ c.a1 = 0;
+ return 0;
+}
+
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C b/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C
new file mode 100644
index 0000000..b1c5401
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C
@@ -0,0 +1,29 @@
+// Origin: PR debug/45088
+// { dg-do compile }
+// { dg-options "-g -dA" }
+// { dg-final { scan-assembler-times "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_pointer_type\\)\[\n\r\]{1,2}\[^\n\r\]*DW_AT_byte_size\[\n\r\]{1,2}\[^\n\r\]*DW_AT_type" 4 } }
+
+template<class T>
+struct A
+{
+ virtual ~A();
+};
+
+struct B : public A<int>
+{
+ virtual ~B(){}
+};
+
+struct C : public B
+{
+ A<int>* a1;
+};
+
+int
+main()
+{
+ C c;
+ c.a1 = 0;
+ return 0;
+}
+