re PR debug/45882 (No debug info for vars depending on unused parameter)

PR debug/45882
	* rtl.def (ENTRY_VALUE): Change format from "e" to "0".
	* rtl.h (ENTRY_VALUE_EXP): Define.
	* rtl.c (rtx_equal_p_cb, rtx_equal_p): Handle ENTRY_VALUE.
	* cselib.c (rtx_equal_for_cselib_p, cselib_hash_rtx): Likewise.
	* print-rtl.c (print_rtx): Likewise.
	* gengtype.c (adjust_field_rtx_def): Likewise.
	* var-tracking.c (vt_add_function_parameter): Adjust
	gen_rtx_ENTRY_VALUE uses, use ENTRY_VALUE_EXP macro.
	* dwarf2out.c (mem_loc_descriptor): Use ENTRY_VALUE_EXP macro.
	* cfgexpand.c (expand_debug_expr): If a SSA_NAME without
	partition is a default definition of a PARM_DECL, use ENTRY_VALUE
	of its DECL_INCOMING_RTL if possible, or its DECL_RTL if set.

	* gcc.dg/guality/pr45882.c: New test.

From-SVN: r171035
This commit is contained in:
Jakub Jelinek 2011-03-16 09:35:31 +01:00 committed by Jakub Jelinek
parent 2b1c543325
commit a58a8e4b1f
12 changed files with 115 additions and 11 deletions

View File

@ -1,5 +1,19 @@
2011-03-16 Jakub Jelinek <jakub@redhat.com>
PR debug/45882
* rtl.def (ENTRY_VALUE): Change format from "e" to "0".
* rtl.h (ENTRY_VALUE_EXP): Define.
* rtl.c (rtx_equal_p_cb, rtx_equal_p): Handle ENTRY_VALUE.
* cselib.c (rtx_equal_for_cselib_p, cselib_hash_rtx): Likewise.
* print-rtl.c (print_rtx): Likewise.
* gengtype.c (adjust_field_rtx_def): Likewise.
* var-tracking.c (vt_add_function_parameter): Adjust
gen_rtx_ENTRY_VALUE uses, use ENTRY_VALUE_EXP macro.
* dwarf2out.c (mem_loc_descriptor): Use ENTRY_VALUE_EXP macro.
* cfgexpand.c (expand_debug_expr): If a SSA_NAME without
partition is a default definition of a PARM_DECL, use ENTRY_VALUE
of its DECL_INCOMING_RTL if possible, or its DECL_RTL if set.
* final.c (final_scan_insn): Handle NOTE_INSN_CALL_ARG_LOCATION.
Call var_location debug hook even on CALL_INSNs.
(rest_of_clean_state): Don't print NOTE_INSN_CALL_ARG_LOCATION.

View File

@ -3171,7 +3171,31 @@ expand_debug_expr (tree exp)
int part = var_to_partition (SA.map, exp);
if (part == NO_PARTITION)
return NULL;
{
/* If this is a reference to an incoming value of parameter
that is never used in the code or where the incoming
value is never used in the code, use PARM_DECL's
DECL_RTL if set. */
if (SSA_NAME_IS_DEFAULT_DEF (exp)
&& TREE_CODE (SSA_NAME_VAR (exp)) == PARM_DECL)
{
rtx incoming = DECL_INCOMING_RTL (SSA_NAME_VAR (exp));
if (incoming
&& GET_MODE (incoming) != BLKmode
&& (REG_P (incoming)
|| (MEM_P (incoming) && REG_P (XEXP (incoming, 0)))))
{
op0 = gen_rtx_ENTRY_VALUE (GET_MODE (incoming));
ENTRY_VALUE_EXP (op0) = incoming;
goto adjust_mode;
}
op0 = expand_debug_expr (SSA_NAME_VAR (exp));
if (!op0)
return NULL;
goto adjust_mode;
}
return NULL;
}
gcc_assert (part >= 0 && (unsigned)part < SA.map->num_partitions);

View File

@ -803,6 +803,10 @@ rtx_equal_for_cselib_1 (rtx x, rtx y, enum machine_mode memmode)
return DEBUG_IMPLICIT_PTR_DECL (x)
== DEBUG_IMPLICIT_PTR_DECL (y);
case ENTRY_VALUE:
return rtx_equal_for_cselib_1 (ENTRY_VALUE_EXP (x), ENTRY_VALUE_EXP (y),
memmode);
case LABEL_REF:
return XEXP (x, 0) == XEXP (y, 0);
@ -949,6 +953,10 @@ cselib_hash_rtx (rtx x, int create, enum machine_mode memmode)
+ DECL_UID (DEBUG_IMPLICIT_PTR_DECL (x));
return hash ? hash : (unsigned int) DEBUG_IMPLICIT_PTR;
case ENTRY_VALUE:
hash += cselib_hash_rtx (ENTRY_VALUE_EXP (x), create, memmode);
return hash ? hash : (unsigned int) ENTRY_VALUE;
case CONST_INT:
hash += ((unsigned) CONST_INT << 7) + INTVAL (x);
return hash ? hash : (unsigned int) CONST_INT;

View File

@ -14028,14 +14028,14 @@ mem_loc_descriptor (rtx rtl, enum machine_mode mode,
case ENTRY_VALUE:
mem_loc_result = new_loc_descr (DW_OP_GNU_entry_value, 0, 0);
mem_loc_result->dw_loc_oprnd1.val_class = dw_val_class_loc;
if (REG_P (XEXP (rtl, 0)))
if (REG_P (ENTRY_VALUE_EXP (rtl)))
mem_loc_result->dw_loc_oprnd1.v.val_loc
= one_reg_loc_descriptor (dbx_reg_number (XEXP (rtl, 0)),
= one_reg_loc_descriptor (dbx_reg_number (ENTRY_VALUE_EXP (rtl)),
VAR_INIT_STATUS_INITIALIZED);
else if (MEM_P (XEXP (rtl, 0)) && REG_P (XEXP (XEXP (rtl, 0), 0)))
else if (MEM_P (ENTRY_VALUE_EXP (rtl)) && REG_P (XEXP (ENTRY_VALUE_EXP (rtl), 0)))
{
dw_loc_descr_ref ref
= mem_loc_descriptor (XEXP (rtl, 0), GET_MODE (rtl),
= mem_loc_descriptor (ENTRY_VALUE_EXP (rtl), GET_MODE (rtl),
VAR_INIT_STATUS_INITIALIZED);
if (ref == NULL)
return NULL;

View File

@ -1101,6 +1101,8 @@ adjust_field_rtx_def (type_p t, options_p ARG_UNUSED (opt))
t = symbol_union_tp, subname = "";
else if (i == BARRIER && aindex >= 3)
t = scalar_tp, subname = "rt_int";
else if (i == ENTRY_VALUE && aindex == 0)
t = rtx_tp, subname = "rt_rtx";
else
{
error_at_line

View File

@ -334,6 +334,14 @@ print_rtx (const_rtx in_rtx)
DEBUG_TEMP_UID (DEBUG_EXPR_TREE_DECL (in_rtx)));
#endif
}
else if (i == 0 && GET_CODE (in_rtx) == ENTRY_VALUE)
{
indent += 2;
if (!sawclose)
fprintf (outfile, " ");
print_rtx (ENTRY_VALUE_EXP (in_rtx));
indent -= 2;
}
break;
case 'e':

View File

@ -1,6 +1,6 @@
/* RTL utility routines.
Copyright (C) 1987, 1988, 1991, 1994, 1997, 1998, 1999, 2000, 2001, 2002,
2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
Free Software Foundation, Inc.
This file is part of GCC.
@ -412,6 +412,9 @@ rtx_equal_p_cb (const_rtx x, const_rtx y, rtx_equal_p_callback_function cb)
return DEBUG_IMPLICIT_PTR_DECL (x)
== DEBUG_IMPLICIT_PTR_DECL (y);
case ENTRY_VALUE:
return rtx_equal_p_cb (ENTRY_VALUE_EXP (x), ENTRY_VALUE_EXP (y), cb);
default:
break;
}
@ -544,6 +547,9 @@ rtx_equal_p (const_rtx x, const_rtx y)
return DEBUG_IMPLICIT_PTR_DECL (x)
== DEBUG_IMPLICIT_PTR_DECL (y);
case ENTRY_VALUE:
return rtx_equal_p (ENTRY_VALUE_EXP (x), ENTRY_VALUE_EXP (y));
default:
break;
}

View File

@ -718,9 +718,10 @@ DEF_RTL_EXPR(VAR_LOCATION, "var_location", "tei", RTX_EXTRA)
addressable. */
DEF_RTL_EXPR(DEBUG_IMPLICIT_PTR, "debug_implicit_ptr", "t", RTX_OBJ)
/* Represents value that argument had on function entry. Should
be only used in VAR_LOCATION location expression. */
DEF_RTL_EXPR(ENTRY_VALUE, "entry_value", "e", RTX_OBJ)
/* Represents value that argument had on function entry. The
single argument is the DECL_INCOMING_RTL of the corresponding
parameter. */
DEF_RTL_EXPR(ENTRY_VALUE, "entry_value", "0", RTX_OBJ)
/* All expressions from this point forward appear only in machine
descriptions. */

View File

@ -833,6 +833,10 @@ extern void rtl_check_failed_flag (const char *, const_rtx, const char *,
but a value from enum reg_note. */
#define REG_NOTES(INSN) XEXP(INSN, 7)
/* In an ENTRY_VALUE this is the DECL_INCOMING_RTL of the argument in
question. */
#define ENTRY_VALUE_EXP(RTX) (RTL_CHECKC1 (RTX, 0, ENTRY_VALUE).rt_rtx)
enum reg_note
{
#define DEF_REG_NOTE(NAME) NAME,

View File

@ -1,3 +1,8 @@
2011-03-16 Jakub Jelinek <jakub@redhat.com>
PR debug/45882
* gcc.dg/guality/pr45882.c: New test.
2011-03-15 Jason Merrill <jason@redhat.com>
* g++.dg/cpp0x/constexpr-recursion.C: New.

View File

@ -0,0 +1,30 @@
/* PR debug/45882 */
/* { dg-do run } */
/* { dg-options "-g" } */
extern void abort (void);
int a[1024];
volatile short int v;
__attribute__((noinline)) int
foo (int i, int j)
{
int b = i; /* { dg-final { gdb-test 16 "b" "7" } } */
int c = i + 4; /* { dg-final { gdb-test 16 "c" "11" } } */
int d = a[i]; /* { dg-final { gdb-test 16 "d" "112" } } */
int e = a[i + 6]; /* { dg-final { gdb-test 16 "e" "142" } } */
++v;
return ++j;
}
int
main (void)
{
int l;
asm ("" : "=r" (l) : "0" (7));
a[7] = 112;
a[7 + 6] = 142;
if (foo (l, 7) != 8)
abort ();
return l - 7;
}

View File

@ -8377,7 +8377,8 @@ vt_add_function_parameter (tree parm)
el = (struct elt_loc_list *)
ggc_alloc_cleared_atomic (sizeof (*el));
el->next = val->locs;
el->loc = gen_rtx_ENTRY_VALUE (GET_MODE (incoming), incoming);
el->loc = gen_rtx_ENTRY_VALUE (GET_MODE (incoming));
ENTRY_VALUE_EXP (el->loc) = incoming;
el->setting_insn = get_insns ();
val->locs = el;
if (TREE_CODE (TREE_TYPE (parm)) == REFERENCE_TYPE
@ -8394,7 +8395,8 @@ vt_add_function_parameter (tree parm)
el = (struct elt_loc_list *)
ggc_alloc_cleared_atomic (sizeof (*el));
el->next = val->locs;
el->loc = gen_rtx_ENTRY_VALUE (indmode, mem);
el->loc = gen_rtx_ENTRY_VALUE (indmode);
ENTRY_VALUE_EXP (el->loc) = mem;
el->setting_insn = get_insns ();
val->locs = el;
}