summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2012-10-26 19:19:25 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2012-10-26 19:19:25 +0000
commit8afb7c4b8a5f9f158e32723a7cf0ed0f514ecea7 (patch)
tree007004e6f0b36e0efb8b580543d475b492da6928
parent49ef567352f7f2a333589c6a4b906e3d8fc6950a (diff)
downloadppe42-gcc-8afb7c4b8a5f9f158e32723a7cf0ed0f514ecea7.tar.gz
ppe42-gcc-8afb7c4b8a5f9f158e32723a7cf0ed0f514ecea7.zip
PR debug/54970
* cfgexpand.c (expand_debug_expr): Expand &MEM_REF[&var, n] as DEBUG_IMPLICIT_PTR + n if &var expands to DEBUG_IMPLICIT_PTR. * tree-sra.c (create_access_replacement): Allow also MEM_REFs with ADDR_EXPR first operand in DECL_DEBUG_EXPR expressions. * var-tracking.c (track_expr_p): Handle MEM_REFs in DECL_DEBUG_EXPR expressions. * dwarf2out.c (add_var_loc_to_decl): Likewise. PR debug/54971 * gcc.dg/guality/pr54970.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@192860 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/cfgexpand.c21
-rw-r--r--gcc/dwarf2out.c5
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/guality/pr54970.c47
-rw-r--r--gcc/tree-sra.c11
-rw-r--r--gcc/var-tracking.c4
7 files changed, 101 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1f63b2e6dcd..7a048726de3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+2012-10-26 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/54970
+ * cfgexpand.c (expand_debug_expr): Expand &MEM_REF[&var, n]
+ as DEBUG_IMPLICIT_PTR + n if &var expands to DEBUG_IMPLICIT_PTR.
+ * tree-sra.c (create_access_replacement): Allow also MEM_REFs
+ with ADDR_EXPR first operand in DECL_DEBUG_EXPR expressions.
+ * var-tracking.c (track_expr_p): Handle MEM_REFs in DECL_DEBUG_EXPR
+ expressions.
+ * dwarf2out.c (add_var_loc_to_decl): Likewise.
+
2012-10-26 Jeff Law <law@redhat.com>
* tree-ssa-threadedge.c (cond_arg_set_in_bb): Use last stmt.
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index 4ae1600d71c..ba86eb571ea 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -3284,6 +3284,27 @@ expand_debug_expr (tree exp)
}
}
+ if (TREE_CODE (TREE_OPERAND (exp, 0)) == MEM_REF
+ && TREE_CODE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0))
+ == ADDR_EXPR)
+ {
+ op0 = expand_debug_expr (TREE_OPERAND (TREE_OPERAND (exp, 0),
+ 0));
+ if (op0 != NULL
+ && (GET_CODE (op0) == DEBUG_IMPLICIT_PTR
+ || (GET_CODE (op0) == PLUS
+ && GET_CODE (XEXP (op0, 0)) == DEBUG_IMPLICIT_PTR
+ && CONST_INT_P (XEXP (op0, 1)))))
+ {
+ op1 = expand_debug_expr (TREE_OPERAND (TREE_OPERAND (exp, 0),
+ 1));
+ if (!op1 || !CONST_INT_P (op1))
+ return NULL;
+
+ return plus_constant (mode, op0, INTVAL (op1));
+ }
+ }
+
return NULL;
}
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 6442edd85f9..24c75065656 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -4622,7 +4622,10 @@ add_var_loc_to_decl (tree decl, rtx loc_note, const char *label)
if (DECL_DEBUG_EXPR_IS_FROM (decl))
{
tree realdecl = DECL_DEBUG_EXPR (decl);
- if (realdecl && handled_component_p (realdecl))
+ if (realdecl
+ && (handled_component_p (realdecl)
+ || (TREE_CODE (realdecl) == MEM_REF
+ && TREE_CODE (TREE_OPERAND (realdecl, 0)) == ADDR_EXPR)))
{
HOST_WIDE_INT maxsize;
tree innerdecl;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 46750117ef3..b3b6facf1c6 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2012-10-26 Jakub Jelinek <jakub@redhat.com>
+
+ PR debug/54970
+ PR debug/54971
+ * gcc.dg/guality/pr54970.c: New test.
+
2012-10-26 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/54984
diff --git a/gcc/testsuite/gcc.dg/guality/pr54970.c b/gcc/testsuite/gcc.dg/guality/pr54970.c
new file mode 100644
index 00000000000..bd940e33df9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/guality/pr54970.c
@@ -0,0 +1,47 @@
+/* PR debug/54970 */
+/* PR debug/54971 */
+/* { dg-do run } */
+/* { dg-options "-g" } */
+
+#include "../nop.h"
+
+int
+main ()
+{
+ int a[] = { 1, 2, 3 }; /* { dg-final { gdb-test 15 "a\[0\]" "1" } } */
+ int *p = a + 2; /* { dg-final { gdb-test 15 "a\[1\]" "2" } } */
+ int *q = a + 1; /* { dg-final { gdb-test 15 "a\[2\]" "3" } } */
+ /* { dg-final { gdb-test 15 "*p" "3" } } */
+ asm volatile ("NOP"); /* { dg-final { gdb-test 15 "*q" "2" } } */
+ *p += 10; /* { dg-final { gdb-test 20 "a\[0\]" "1" } } */
+ /* { dg-final { gdb-test 20 "a\[1\]" "2" } } */
+ /* { dg-final { gdb-test 20 "a\[2\]" "13" } } */
+ /* { dg-final { gdb-test 20 "*p" "13" } } */
+ asm volatile ("NOP"); /* { dg-final { gdb-test 20 "*q" "2" } } */
+ *q += 10; /* { dg-final { gdb-test 25 "a\[0\]" "1" } } */
+ /* { dg-final { gdb-test 25 "a\[1\]" "12" } } */
+ /* { dg-final { gdb-test 25 "a\[2\]" "13" } } */
+ /* { dg-final { gdb-test 25 "*p" "13" } } */
+ asm volatile ("NOP"); /* { dg-final { gdb-test 25 "*q" "12" } } */
+ __builtin_memcpy (&a, (int [3]) { 4, 5, 6 }, sizeof (a));
+ /* { dg-final { gdb-test 31 "a\[0\]" "4" } } */
+ /* { dg-final { gdb-test 31 "a\[1\]" "5" } } */
+ /* { dg-final { gdb-test 31 "a\[2\]" "6" } } */
+ /* { dg-final { gdb-test 31 "*p" "6" } } */
+ asm volatile ("NOP"); /* { dg-final { gdb-test 31 "*q" "5" } } */
+ *p += 20; /* { dg-final { gdb-test 36 "a\[0\]" "4" } } */
+ /* { dg-final { gdb-test 36 "a\[1\]" "5" } } */
+ /* { dg-final { gdb-test 36 "a\[2\]" "26" } } */
+ /* { dg-final { gdb-test 36 "*p" "26" } } */
+ asm volatile ("NOP"); /* { dg-final { gdb-test 36 "*q" "5" } } */
+ *q += 20; /* { dg-final { gdb-test 45 "a\[0\]" "4" } } */
+ /* { dg-final { gdb-test 45 "a\[1\]" "25" } } */
+ /* { dg-final { gdb-test 45 "a\[2\]" "26" } } */
+ /* { dg-final { gdb-test 45 "*p" "26" } } */
+ /* { dg-final { gdb-test 45 "p\[-1\]" "25" } } */
+ /* { dg-final { gdb-test 45 "p\[-2\]" "4" } } */
+ /* { dg-final { gdb-test 45 "q\[-1\]" "4" } } */
+ /* { dg-final { gdb-test 45 "q\[1\]" "26" } } */
+ asm volatile ("NOP"); /* { dg-final { gdb-test 45 "*q" "25" } } */
+ return 0;
+}
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 65b5ef59e15..bf1a0f209f6 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -1,7 +1,7 @@
/* Scalar Replacement of Aggregates (SRA) converts some structure
references into scalar references, exposing them to the scalar
optimizers.
- Copyright (C) 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+ Copyright (C) 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
Contributed by Martin Jambor <mjambor@suse.cz>
This file is part of GCC.
@@ -1941,7 +1941,8 @@ create_access_replacement (struct access *access)
and that get_ref_base_and_extent works properly on the
expression. It cannot handle accesses at a non-constant offset
though, so just give up in those cases. */
- for (d = debug_expr; !fail && handled_component_p (d);
+ for (d = debug_expr;
+ !fail && (handled_component_p (d) || TREE_CODE (d) == MEM_REF);
d = TREE_OPERAND (d, 0))
switch (TREE_CODE (d))
{
@@ -1959,6 +1960,12 @@ create_access_replacement (struct access *access)
&& TREE_CODE (TREE_OPERAND (d, 2)) != INTEGER_CST)
fail = true;
break;
+ case MEM_REF:
+ if (TREE_CODE (TREE_OPERAND (d, 0)) != ADDR_EXPR)
+ fail = true;
+ else
+ d = TREE_OPERAND (d, 0);
+ break;
default:
break;
}
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
index 25973a9776e..9b28c7d273c 100644
--- a/gcc/var-tracking.c
+++ b/gcc/var-tracking.c
@@ -4921,7 +4921,9 @@ track_expr_p (tree expr, bool need_rtl)
realdecl = expr;
else if (!DECL_P (realdecl))
{
- if (handled_component_p (realdecl))
+ if (handled_component_p (realdecl)
+ || (TREE_CODE (realdecl) == MEM_REF
+ && TREE_CODE (TREE_OPERAND (realdecl, 0)) == ADDR_EXPR))
{
HOST_WIDE_INT bitsize, bitpos, maxsize;
tree innerdecl
OpenPOWER on IntegriCloud