+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.
}
}
+ 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;
}
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;
+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
--- /dev/null
+/* 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;
+}
/* 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.
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))
{
&& 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;
}
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