aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDodji Seketeli <dodji@redhat.com>2010-07-22 16:25:17 +0000
committerDodji Seketeli <dodji@gcc.gnu.org>2010-07-22 18:25:17 +0200
commit35ea1c5ac88fc328743f3cd370bfe1d834fc51be (patch)
tree4aceab85a0b196e0ed32687ec59376296d1556a1 /gcc
parentac0ab4f718b5c85c999dc3cdf1745bca627e3c69 (diff)
downloadgcc-35ea1c5ac88fc328743f3cd370bfe1d834fc51be.zip
gcc-35ea1c5ac88fc328743f3cd370bfe1d834fc51be.tar.gz
gcc-35ea1c5ac88fc328743f3cd370bfe1d834fc51be.tar.bz2
re PR debug/45024 (wrong nesting for inner template class)
Fix PR debug/45024 gcc/ChangeLog: PR debug/45024 * dwarf2out.c (scope_die_for): Don't fall back to the compilation unit DIE if we can find the scope DIE. gcc/testsuite/ChangeLog: PR debug/45024 * g++.dg/debug/dwarf2/nested-2.C: New test case. From-SVN: r162420
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/dwarf2out.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/nested-2.C37
4 files changed, 53 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 65f9d35..ada7a16 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2010-07-22 Dodji Seketeli <dodji@redhat.com>
+
+ PR debug/45024
+ * dwarf2out.c (scope_die_for): Don't fall back to the compilation
+ unit DIE if we can find the scope DIE.
+
2010-07-22 Bernd Schmidt <bernds@codesourcery.com>
* ira-build.c (ira_create_object): New arg SUBWORD; all callers changed.
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index ce35c91..183bbd3 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -17585,9 +17585,13 @@ scope_die_for (tree t, dw_die_ref context_die)
{
gcc_assert (debug_info_level <= DINFO_LEVEL_TERSE
|| TREE_ASM_WRITTEN (containing_scope));
+ /*We are not in the middle of emitting the type
+ CONTAINING_SCOPE. Let's see if it's emitted already. */
+ scope_die = lookup_type_die (containing_scope);
/* If none of the current dies are suitable, we get file scope. */
- scope_die = comp_unit_die;
+ if (scope_die == NULL)
+ scope_die = comp_unit_die;
}
else
scope_die = lookup_type_die (containing_scope);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 5eff7d4..79e3b60 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-07-22 Dodji Seketeli <dodji@redhat.com>
+
+ PR debug/45024
+ * g++.dg/debug/dwarf2/nested-2.C: New test case.
+
2010-07-22 H.J. Lu <hongjiu.lu@intel.com>
* gcc.dg/lto/20100722-1_0.c: Replace dg-require-lto-plugin
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/nested-2.C b/gcc/testsuite/g++.dg/debug/dwarf2/nested-2.C
new file mode 100644
index 0000000..2386baa
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/nested-2.C
@@ -0,0 +1,37 @@
+/*
+ Origin: PR debug/45024
+ { dg-options "-g -dA -fno-merge-debug-strings" }
+ { dg-do compile }
+*/
+
+struct S {
+ template<typename Z> struct T { };
+};
+
+S::T<int> tval;
+
+/*
+We want to express that the DIE of S::T<int> must be a child of the DIE of S, like in assembly this output:
+
+ .uleb128 0x2 # (DIE (0x9e) DW_TAG_structure_type)
+ .ascii "S\0" # DW_AT_name
+ .byte 0x1 # DW_AT_byte_size
+ .byte 0x1 # DW_AT_decl_file (../../prtests/test-PR45024.cc)
+ .byte 0x1 # DW_AT_decl_line
+ .long 0xbc # DW_AT_sibling
+ .uleb128 0x3 # (DIE (0xa8) DW_TAG_structure_type)
+ .ascii "T<int>\0" # DW_AT_name
+ .byte 0x1 # DW_AT_byte_size
+ .byte 0x1 # DW_AT_decl_file (../../prtests/test-PR45024.cc)
+ .byte 0x2 # DW_AT_decl_line
+ .uleb128 0x4 # (DIE (0xb3) DW_TAG_template_type_param)
+ .ascii "Z\0" # DW_AT_name
+ .long 0xbc # DW_AT_type
+ .byte 0 # end of children of DIE 0xa8
+ .byte 0 # end of children of DIE 0x9e
+
+Hence the slightly odd regexp:
+
+ { dg-final { scan-assembler "\[^\n\r\]*\\(DIE\[^\n\r\]*DW_TAG_structure_type\\)\[\n\r\]+\[^\n\r\]*\"S\\\\0\"\[ \t\]+#\[ \t\]+DW_AT_name\[\n\r\]+\(.*\)?\\(DIE\[^\n\r\]*DW_TAG_structure_type\\)\[\n\r\]+\[^\n\r\]*\"T<int>\\\\0\"\[ \t\]+\(.*\)?\\(DIE\[^\n\r\]*DW_TAG_template_type_param\\)\[\n\r\]+\[^\n\r\]*\[\n\r\]+\[^\n\r\]*\[\n\r\]+\[^\n\r\]*#\[ \t\]+end of children of DIE\[^\n\r\]*\[\n\r\]+\[^\n\r\]*end of children of DIE\[^\n\r\]*" } }
+
+ */