re PR debug/54970 (Missing DW_OP_GNU_implicit_pointer in debuginfo)

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.

From-SVN: r192860
This commit is contained in:
Jakub Jelinek 2012-10-26 21:19:25 +02:00 committed by Jakub Jelinek
parent c88538b743
commit 9430b7bad8
7 changed files with 101 additions and 4 deletions

View File

@ -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.

View File

@ -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;
}

View File

@ -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;

View File

@ -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

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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