On Oct 4, 2012, at 2:58 PM, Jakub Jelinek wrote: > On Thu, Oct 04, 2012 at 06:32:20PM +0000, paul_kon...@dell.com wrote: >> --- testsuite/g++.dg/debug/dwarf2/pr54508.C (revision 0) >> +++ testsuite/g++.dg/debug/dwarf2/pr54508.C (revision 0) >> @@ -0,0 +1,67 @@ >> +// PR debug/54508 >> +// { dg-do compile } >> +// { dg-options "-g2 -dA" } > > Better than this just add -fno-merge-debug-strings to dg-options > >> + >> +// { dg-final { scan-assembler "\"cbase\\\\0\"\[ \t\]+\[#;/!|@\]+ >> DW_AT_name\|DW_AT_name: \"cbase\"" } } >> +// { dg-final { scan-assembler "\"OPCODE\\\\0\"\[ \t\]+\[#;/!|@\]+ >> DW_AT_name\|DW_AT_name: \"OPCODE\"" } } >> +// { dg-final { scan-assembler "\"bi\\\\0\"\[ \t\]+\[#;/!|@\]+ DW_AT_name" >> } } >> +// { dg-final { scan-assembler "\"si\\\\0\"\[ \t\]+\[#;/!|@\]+ DW_AT_name" >> } } >> +// { dg-final { scan-assembler "\"f1\\\\0\"\[ \t\]+\[#;/!|@\]+ DW_AT_name" >> } } >> +// { dg-final { scan-assembler "\"f2\\\\0\"\[ \t\]+\[#;/!|@\]+ DW_AT_name" >> } } >> +// { dg-final { scan-assembler-not "\"nc\\\\0\"\[ \t\]+\# >> DW_AT_name\|DW_AT_name: \"nc\"" } } > > and use just one of the alternatives in the regexps. > > Jakub
Thanks... learn something new every day. Here is the updated patch. paul ChangeLog: 2012-10-04 Paul Koning <n...@arrl.net> * dwarf2out.c (prune_unused_types_mark): Mark all of parent's children if parent is a class. testsuite/ChangeLog: 2012-10-04 Paul Koning <n...@arrl.net> * g++.dg/debug/dwarf2/pr54508.C: New. Index: gcc/dwarf2out.c =================================================================== --- gcc/dwarf2out.c (revision 192048) +++ gcc/dwarf2out.c (working copy) @@ -21035,9 +21035,11 @@ prune_unused_types_mark_generic_parms_dies (die); /* We also have to mark its parents as used. - (But we don't want to mark our parents' kids due to this.) */ + (But we don't want to mark our parent's kids due to this, + unless it is a class.) */ if (die->die_parent) - prune_unused_types_mark (die->die_parent, 0); + prune_unused_types_mark (die->die_parent, + class_scope_p (die->die_parent)); /* Mark any referenced nodes. */ prune_unused_types_walk_attribs (die); Index: gcc/testsuite/g++.dg/debug/dwarf2/pr54508.C =================================================================== --- gcc/testsuite/g++.dg/debug/dwarf2/pr54508.C (revision 0) +++ gcc/testsuite/g++.dg/debug/dwarf2/pr54508.C (revision 0) @@ -0,0 +1,67 @@ +// PR debug/54508 +// { dg-do compile } +// { dg-options "-g2 -dA -fno-merge-debug-strings" } + +// { dg-final { scan-assembler "\"cbase\\\\0\"\[ \t\]+\[#;/!|@\]+ DW_AT_name" } } +// { dg-final { scan-assembler "\"OPCODE\\\\0\"\[ \t\]+\[#;/!|@\]+ DW_AT_name" } } +// { dg-final { scan-assembler "\"bi\\\\0\"\[ \t\]+\[#;/!|@\]+ DW_AT_name" } } +// { dg-final { scan-assembler "\"si\\\\0\"\[ \t\]+\[#;/!|@\]+ DW_AT_name" } } +// { dg-final { scan-assembler "\"f1\\\\0\"\[ \t\]+\[#;/!|@\]+ DW_AT_name" } } +// { dg-final { scan-assembler "\"f2\\\\0\"\[ \t\]+\[#;/!|@\]+ DW_AT_name" } } +// { dg-final { scan-assembler-not "\"nc\\\\0\"\[ \t\]+\# DW_AT_name" } } + +class cbase + +{ +public: + static int si; + int bi; +}; + +class c : public cbase + +{ +public: + enum + { + OPCODE = 251 + }; + int i ; + static const char *testc (void) { return "foo"; } +}; + +struct s +{ + int f1; + static const char *tests (void) { return "test"; } +}; + +union u +{ + int f2; + double d; + static const char *testu (void) { return "test union"; } +}; + +namespace n +{ + const char *ntest (void) { return "test n"; } + + class nc + { + public: + int i; + static int sj; + }; +} + +extern void send (int, int, const void *, int); + +void test (int src) +{ + int cookie = 1; + send(src, c::OPCODE, c::testc (), cookie); + send(src, c::OPCODE, s::tests (), cookie); + send(src, c::OPCODE, u::testu (), cookie); + send(src, c::OPCODE, n::ntest (), cookie); +}