aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaul Koning <ni1d@arrl.net>2012-10-23 14:44:27 -0400
committerPaul Koning <pkoning@gcc.gnu.org>2012-10-23 14:44:27 -0400
commita17d5a98417753708f385f0aab3a9cbcd2f1952a (patch)
treec683ea50ebea1be10dfc5c7e2eee5a1f7bfb42fc /gcc
parent22531fb1957ca61debd68c6d3bbc16899b907ba8 (diff)
downloadgcc-a17d5a98417753708f385f0aab3a9cbcd2f1952a.zip
gcc-a17d5a98417753708f385f0aab3a9cbcd2f1952a.tar.gz
gcc-a17d5a98417753708f385f0aab3a9cbcd2f1952a.tar.bz2
re PR debug/54508 (Wrong debug information emitted if data members not referenced)
PR debug/54508 * dwarf2out.c (prune_unused_types_prune): If pruning a class and not all its children were marked, add DW_AT_declaration flag. * g++.dg/debug/dwarf2/pr54508.C: New. From-SVN: r192739
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/dwarf2out.c16
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/debug/dwarf2/pr54508.C72
4 files changed, 97 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e9766b6..fba9d74 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2012-10-23 Paul Koning <ni1d@arrl.net>
+
+ PR debug/54508
+ * dwarf2out.c (prune_unused_types_prune): If pruning a class and
+ not all its children were marked, add DW_AT_declaration flag.
+
2012-10-23 Ian Bolton <ian.bolton@arm.com>
James Greenhalgh <james.greenhalgh@arm.com>
Jim MacArthur <jim.macarthur@arm.com>
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index bc5868b..bed3d67 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -21220,6 +21220,7 @@ static void
prune_unused_types_prune (dw_die_ref die)
{
dw_die_ref c;
+ int pruned = 0;
gcc_assert (die->die_mark);
prune_unused_types_update_strings (die);
@@ -21242,13 +21243,24 @@ prune_unused_types_prune (dw_die_ref die)
prev->die_sib = c->die_sib;
die->die_child = prev;
}
- return;
+ pruned = 1;
+ goto finished;
}
if (c != prev->die_sib)
- prev->die_sib = c;
+ {
+ prev->die_sib = c;
+ pruned = 1;
+ }
prune_unused_types_prune (c);
} while (c != die->die_child);
+
+ finished:
+ /* If we pruned children, and this is a class, mark it as a
+ declaration to inform debuggers that this is not a complete
+ class definition. */
+ if (pruned && die->die_mark == 1 && class_scope_p (die))
+ add_AT_flag (die, DW_AT_declaration, 1);
}
/* Remove dies representing declarations that we never use. */
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8267df6..79ccb54 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2012-10-23 Paul Koning <ni1d@arrl.net>
+
+ PR debug/54508
+ * g++.dg/debug/dwarf2/pr54508.C: New.
+
2012-10-23 Jakub Jelinek <jakub@redhat.com>
PR c++/54844
diff --git a/gcc/testsuite/g++.dg/debug/dwarf2/pr54508.C b/gcc/testsuite/g++.dg/debug/dwarf2/pr54508.C
new file mode 100644
index 0000000..c1163c9
--- /dev/null
+++ b/gcc/testsuite/g++.dg/debug/dwarf2/pr54508.C
@@ -0,0 +1,72 @@
+// PR debug/54508
+// { dg-do compile }
+// { dg-options "-g2 -dA -fno-merge-debug-strings" }
+
+// { dg-final { scan-assembler-not "\"cbase\\\\0\"\[ \t\]+\[#;/!|@\]+ DW_AT_name" } }
+// { dg-final { scan-assembler "\"c\\\\0\"\[ \t\]+\[#;/!|@\]+ DW_AT_name\[\r\n\]+\[\^\r\n\]+\[\r\n\]+\[\^\r\n\]+\[\r\n\]+\[\^#;/!|@\]+\[#;/!|@\]+ DW_AT_decl_line\[\r\n\]+\[\^#;/!|@\]+\[#;/!|@\]+ DW_AT_declaration" } }
+// { dg-final { scan-assembler-not "\"OPCODE\\\\0\"\[ \t\]+\[#;/!|@\]+ DW_AT_name" } }
+// { dg-final { scan-assembler-not "\"bi\\\\0\"\[ \t\]+\[#;/!|@\]+ DW_AT_name" } }
+// { dg-final { scan-assembler-not "\"si\\\\0\"\[ \t\]+\[#;/!|@\]+ DW_AT_name" } }
+// { dg-final { scan-assembler "\"s\\\\0\"\[ \t\]+\[#;/!|@\]+ DW_AT_name" } }
+// { dg-final { scan-assembler-not "\"s\\\\0\"\[^#;/!|@\]+\[#;/!|@\]+ DW_AT_name\[\r\n\]+\[\^\r\n\]+\[\r\n\]+\[\^\r\n\]+\[\r\n\]+\[\^#;/!|@\]+\[#;/!|@\]+ DW_AT_decl_line\[\r\n\]+\[ \t\]+\[#;/!|@\]+ DW_AT_declaration" } }
+// { dg-final { scan-assembler "\"f1\\\\0\"\[ \t\]+\[#;/!|@\]+ DW_AT_name" } }
+// { dg-final { scan-assembler "\"u\\\\0\"\[ \t\]+\[#;/!|@\]+ DW_AT_name\[\r\n\]+\[\^\r\n\]+\[\r\n\]+\[\^\r\n\]+\[\r\n\]+\[\^#;/!|@\]+\[#;/!|@\]+ DW_AT_decl_line\[\r\n\]+\[^#;/!|@\]+\[#;/!|@\]+ DW_AT_declaration" } }
+// { dg-final { scan-assembler-not "\"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;
+ static struct s ss;
+
+ send(src, c::OPCODE, c::testc (), cookie);
+ send(src, c::OPCODE, u::testu (), cookie);
+ send(src, c::OPCODE, n::ntest (), cookie);
+}