This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[patch] pr/54508: fix incomplete debug information for class
- From: <Paul_Koning at Dell dot com>
- To: <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 17 Sep 2012 21:24:25 +0000
- Subject: [patch] pr/54508: fix incomplete debug information for class
If the only reference in a source file is to a static method of a class, then GCC would output debug information for the class name but not any of its members or base classes. The attached patch fixes this by having "prune_unused_types_mark" mark all of the parent's children if the parent DIE type is for a class.
The associated new testcase verifies this, and also verifies this that references to a function in a namespace do *not* cause other parts of that namespace to be emitted as debug information, but that references to a method in a class (or struct or union) do emit the other information for that class.
Ok to commit? This would close PR/54508.
paul
ChangeLog:
2012-09-17 Paul Koning <ni1d@arrl.net>
* dwarf2out.c (prune_unused_types_mark): Mark all of parent's
children if parent is a class.
testsuite/ChangeLog:
2012-09-17 Paul Koning <ni1d@arrl.net>
* g++.dg/debug/dwarf2/pr54508.C: New.
Index: gcc/dwarf2out.c
===================================================================
--- gcc/dwarf2out.c (revision 191408)
+++ gcc/dwarf2out.c (working copy)
@@ -21033,9 +21033,13 @@
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,
+ (die->die_parent->die_tag == DW_TAG_class_type ||
+ die->die_parent->die_tag == DW_TAG_structure_type ||
+ die->die_parent->die_tag == DW_TAG_union_type));
/* 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" }
+
+// { 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\"" } }
+
+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);
+}