aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-03-04 08:27:15 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2016-03-04 08:27:15 +0100
commitf10cdc6c1436bcd59038a8c84128c1fe53f235c4 (patch)
treeb94ce8cb28ddbc2f62b98257bd133dd3014e1be7
parentb47d1d904d5397a61bba40fba095f02bd00f04c1 (diff)
downloadgcc-f10cdc6c1436bcd59038a8c84128c1fe53f235c4.zip
gcc-f10cdc6c1436bcd59038a8c84128c1fe53f235c4.tar.gz
gcc-f10cdc6c1436bcd59038a8c84128c1fe53f235c4.tar.bz2
re PR debug/69947 (DW_OP_GNU_implicit_pointer broken on the trunk)
PR debug/69947 * dwarf2out.c (prune_unused_types_walk_loc_descr): Handle all other ops that have dw_val_class_die_ref operands, and DW_OP_GNU_entry_value. * gcc.dg/guality/pr69947.c: New test. From-SVN: r233958
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/dwarf2out.c18
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/guality/pr69947.c22
4 files changed, 52 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9ae5500..6f7e896 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2016-03-04 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/69947
+ * dwarf2out.c (prune_unused_types_walk_loc_descr): Handle
+ all other ops that have dw_val_class_die_ref operands,
+ and DW_OP_GNU_entry_value.
+
2016-03-03 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR rtl-optimization/69904
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index a8c21d8..6d5e3f5 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -25641,11 +25641,29 @@ prune_unused_types_walk_loc_descr (dw_loc_descr_ref loc)
for (; loc != NULL; loc = loc->dw_loc_next)
switch (loc->dw_loc_opc)
{
+ case DW_OP_GNU_implicit_pointer:
+ case DW_OP_GNU_convert:
+ case DW_OP_GNU_reinterpret:
+ if (loc->dw_loc_oprnd1.val_class == dw_val_class_die_ref)
+ prune_unused_types_mark (loc->dw_loc_oprnd1.v.val_die_ref.die, 1);
+ break;
case DW_OP_call2:
case DW_OP_call4:
case DW_OP_call_ref:
+ case DW_OP_GNU_const_type:
+ case DW_OP_GNU_parameter_ref:
+ gcc_assert (loc->dw_loc_oprnd1.val_class == dw_val_class_die_ref);
prune_unused_types_mark (loc->dw_loc_oprnd1.v.val_die_ref.die, 1);
break;
+ case DW_OP_GNU_regval_type:
+ case DW_OP_GNU_deref_type:
+ gcc_assert (loc->dw_loc_oprnd2.val_class == dw_val_class_die_ref);
+ prune_unused_types_mark (loc->dw_loc_oprnd2.v.val_die_ref.die, 1);
+ break;
+ case DW_OP_GNU_entry_value:
+ gcc_assert (loc->dw_loc_oprnd1.val_class == dw_val_class_loc);
+ prune_unused_types_walk_loc_descr (loc->dw_loc_oprnd1.v.val_loc);
+ break;
default:
break;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index ba4ca4c..960d40b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-03-04 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/69947
+ * gcc.dg/guality/pr69947.c: New test.
+
2016-03-03 Jakub Jelinek <jakub@redhat.com>
PR ada/70017
diff --git a/gcc/testsuite/gcc.dg/guality/pr69947.c b/gcc/testsuite/gcc.dg/guality/pr69947.c
new file mode 100644
index 0000000..6280ed5
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/guality/pr69947.c
@@ -0,0 +1,22 @@
+/* PR debug/69947 */
+/* { dg-do run } */
+/* { dg-options "-g" } */
+
+#include "../nop.h"
+
+static const char *c = "foobar";
+
+__attribute__((noinline, noclone)) void
+foo (void)
+{
+ static const char a[] = "abcdefg";
+ const char *b = a; /* { dg-final { gdb-test 14 "c\[2\]" "'o'" } } */
+ asm (NOP : : : "memory"); /* { dg-final { gdb-test 14 "b\[4\]" "'e'" } } */
+}
+
+int
+main ()
+{
+ foo ();
+ return 0;
+}