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.
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);
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);
+ 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;
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;
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
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':
/* 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.
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;
}
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;
}
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. */
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,
+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.
--- /dev/null
+/* 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;
+}
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
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;
}