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:
parent
2b1c543325
commit
a58a8e4b1f
@ -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.
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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':
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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. */
|
||||
|
@ -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,
|
||||
|
@ -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.
|
||||
|
30
gcc/testsuite/gcc.dg/guality/pr45882.c
Normal file
30
gcc/testsuite/gcc.dg/guality/pr45882.c
Normal 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;
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user