Hi! Here is http://gcc.gnu.org/ml/gcc-patches/2010-12/msg01794.html patch updated to current trunk, bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
2011-03-15 Jakub Jelinek <ja...@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. * gcc.dg/guality/pr45882.c: New test. --- gcc/rtl.def.jj 2011-03-14 21:33:35.972415549 +0100 +++ gcc/rtl.def 2011-03-14 21:42:32.655765178 +0100 @@ -718,9 +718,10 @@ DEF_RTL_EXPR(VAR_LOCATION, "var_location 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. */ --- gcc/rtl.h.jj 2011-03-09 21:48:04.979397210 +0100 +++ gcc/rtl.h 2011-03-14 21:42:32.656772047 +0100 @@ -833,6 +833,10 @@ extern void rtl_check_failed_flag (const 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, --- gcc/rtl.c.jj 2011-01-03 19:07:36.630851160 +0100 +++ gcc/rtl.c 2011-03-14 21:42:32.674429322 +0100 @@ -412,6 +412,9 @@ rtx_equal_p_cb (const_rtx x, const_rtx y 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; } --- gcc/cselib.c.jj 2011-02-03 09:24:31.398430054 +0100 +++ gcc/cselib.c 2011-03-14 21:45:55.772433278 +0100 @@ -803,6 +803,10 @@ rtx_equal_for_cselib_1 (rtx x, rtx y, en 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 + 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; --- gcc/print-rtl.c.jj 2011-03-14 21:33:35.971538442 +0100 +++ gcc/print-rtl.c 2011-03-14 21:42:32.684424732 +0100 @@ -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': --- gcc/gengtype.c.jj 2011-03-14 21:33:36.104545651 +0100 +++ gcc/gengtype.c 2011-03-14 21:42:32.686420691 +0100 @@ -1101,6 +1101,8 @@ adjust_field_rtx_def (type_p t, options_ 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 --- gcc/var-tracking.c.jj 2011-03-14 21:39:25.094546525 +0100 +++ gcc/var-tracking.c 2011-03-14 21:42:32.691425268 +0100 @@ -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; } --- gcc/dwarf2out.c.jj 2011-03-14 21:35:24.347671148 +0100 +++ gcc/dwarf2out.c 2011-03-14 21:42:32.701420725 +0100 @@ -14028,14 +14028,14 @@ mem_loc_descriptor (rtx rtl, enum machin 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; --- gcc/cfgexpand.c.jj 2011-03-03 17:07:48.699420453 +0100 +++ gcc/cfgexpand.c 2011-03-14 21:46:50.443527080 +0100 @@ -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); --- gcc/testsuite/gcc.dg/guality/pr45882.c.jj 2011-03-14 21:42:32.714421205 +0100 +++ gcc/testsuite/gcc.dg/guality/pr45882.c 2011-03-14 21:42:32.714421205 +0100 @@ -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; +} Jakub