From a58a8e4b1f724fdb5edfd09660963404439428f7 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 16 Mar 2011 09:35:31 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 14 ++++++++++++ gcc/cfgexpand.c | 26 +++++++++++++++++++++- gcc/cselib.c | 8 +++++++ gcc/dwarf2out.c | 8 +++---- gcc/gengtype.c | 2 ++ gcc/print-rtl.c | 8 +++++++ gcc/rtl.c | 8 ++++++- gcc/rtl.def | 7 +++--- gcc/rtl.h | 4 ++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/guality/pr45882.c | 30 ++++++++++++++++++++++++++ gcc/var-tracking.c | 6 ++++-- 12 files changed, 115 insertions(+), 11 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/guality/pr45882.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d42943d8636..ea855fe905c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,19 @@ 2011-03-16 Jakub Jelinek + 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. diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index 059c5b2725c..ebe0a0352d4 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -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); diff --git a/gcc/cselib.c b/gcc/cselib.c index c142d679b7a..f9e13ffffef 100644 --- a/gcc/cselib.c +++ b/gcc/cselib.c @@ -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; diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 7e257c3a4c3..b4bca785832 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -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; diff --git a/gcc/gengtype.c b/gcc/gengtype.c index 94cc4492117..bd626ed93a6 100644 --- a/gcc/gengtype.c +++ b/gcc/gengtype.c @@ -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 diff --git a/gcc/print-rtl.c b/gcc/print-rtl.c index 7748585c2dc..a0f9dfb5bee 100644 --- a/gcc/print-rtl.c +++ b/gcc/print-rtl.c @@ -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': diff --git a/gcc/rtl.c b/gcc/rtl.c index c6db47fe6ba..613cadb062b 100644 --- a/gcc/rtl.c +++ b/gcc/rtl.c @@ -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; } diff --git a/gcc/rtl.def b/gcc/rtl.def index 885cbcf3ce8..cb5555ac591 100644 --- a/gcc/rtl.def +++ b/gcc/rtl.def @@ -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. */ diff --git a/gcc/rtl.h b/gcc/rtl.h index 66f275570fa..73739c4f781 100644 --- a/gcc/rtl.h +++ b/gcc/rtl.h @@ -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, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 09bdda97c5c..601c96b7b30 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-03-16 Jakub Jelinek + + PR debug/45882 + * gcc.dg/guality/pr45882.c: New test. + 2011-03-15 Jason Merrill * g++.dg/cpp0x/constexpr-recursion.C: New. diff --git a/gcc/testsuite/gcc.dg/guality/pr45882.c b/gcc/testsuite/gcc.dg/guality/pr45882.c new file mode 100644 index 00000000000..335574d83f2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/guality/pr45882.c @@ -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; +} diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index 7141ab5c7d4..50890d8c0cc 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -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; } -- 2.30.2