From: Dodji Seketeli Date: Thu, 22 Jul 2010 16:25:17 +0000 (+0000) Subject: re PR debug/45024 (wrong nesting for inner template class) X-Git-Tag: releases/gcc-4.6.0~5505 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=35ea1c5ac88fc328743f3cd370bfe1d834fc51be;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 65f9d354f208..ada7a16a1e1e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2010-07-22 Dodji Seketeli + + 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 * ira-build.c (ira_create_object): New arg SUBWORD; all callers changed. diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index ce35c9182e1e..183bbd38a2b8 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 5eff7d467468..79e3b60cbf33 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-07-22 Dodji Seketeli + + PR debug/45024 + * g++.dg/debug/dwarf2/nested-2.C: New test case. + 2010-07-22 H.J. Lu * 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 000000000000..2386baaacb9c --- /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 struct T { }; +}; + +S::T tval; + +/* +We want to express that the DIE of S::T 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\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\\\\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\]*" } } + + */