mirror of
https://github.com/openembedded/meta-openembedded.git
synced 2025-12-15 23:05:34 +01:00
105 lines
2.6 KiB
Diff
105 lines
2.6 KiB
Diff
2010-12-21 Ulrich Weigand <uweigand@de.ibm.com>
|
|
|
|
LP: #662324
|
|
Backport from mainline:
|
|
|
|
2010-12-17 Dodji Seketeli <dodji@redhat.com>
|
|
|
|
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.
|
|
|
|
=== modified file 'gcc/dwarf2out.c'
|
|
--- old/gcc/dwarf2out.c 2010-10-04 00:50:43 +0000
|
|
+++ new/gcc/dwarf2out.c 2010-12-21 18:46:10 +0000
|
|
@@ -18993,6 +18993,16 @@
|
|
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 (TYPE_NAME (type) && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL
|
|
|
|
=== added file 'gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C'
|
|
--- old/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C 1970-01-01 00:00:00 +0000
|
|
+++ new/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-1.C 2010-12-21 18:46:10 +0000
|
|
@@ -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;
|
|
+}
|
|
+
|
|
|
|
=== added file 'gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C'
|
|
--- old/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C 1970-01-01 00:00:00 +0000
|
|
+++ new/gcc/testsuite/g++.dg/debug/dwarf2/self-ref-2.C 2010-12-21 18:46:10 +0000
|
|
@@ -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;
|
|
+}
|
|
+
|
|
|