re PR debug/45882 (No debug info for vars depending on unused parameter)
authorJakub Jelinek <jakub@redhat.com>
Wed, 16 Mar 2011 08:35:31 +0000 (09:35 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 16 Mar 2011 08:35:31 +0000 (09:35 +0100)
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

12 files changed:
gcc/ChangeLog
gcc/cfgexpand.c
gcc/cselib.c
gcc/dwarf2out.c
gcc/gengtype.c
gcc/print-rtl.c
gcc/rtl.c
gcc/rtl.def
gcc/rtl.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/guality/pr45882.c [new file with mode: 0644]
gcc/var-tracking.c

index d42943d8636279f17d9cdcdaf7dc2a587b7b693a..ea855fe905c3cc905414ed6721bf995738356fad 100644 (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.
index 059c5b2725c1594d738072c49da43c1ff9a8ed28..ebe0a0352d48ceb486929dd8504270e7a1e0cda1 100644 (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);
 
index c142d679b7a821974c06d2bb0a8b15241b5ac12d..f9e13ffffef8902e270181ff6a6743148f956e93 100644 (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;
index 7e257c3a4c3f3d5f354d88d03b9ca1c95ca8539d..b4bca7858324e7d8bad10f88ea5cebc1cdda54b5 100644 (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;
index 94cc449211742750d32ed4f9e8a8d510a4304380..bd626ed93a604c4ba7916d4f0de9246eaf45a1c3 100644 (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 
index 7748585c2dcf3e0f20ff38090e82f8aefcfea6c2..a0f9dfb5bee62f9c7e88e8b5c2b0267e1ea7d0a0 100644 (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':
index c6db47fe6baf492e414e6238dbbee0f39b19bee2..613cadb062b0b4220d185746861c613537fb74db 100644 (file)
--- 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;
     }
index 885cbcf3ce8ce5d45ad221d0aa790b4de244ff93..cb5555ac59177ade6f5a69e48e78672685737ed9 100644 (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.  */
index 66f275570fabcf67d80e36b4b90f013e71b7726f..73739c4f781b1c70c332ed6e273f772f36859fa3 100644 (file)
--- 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,
index 09bdda97c5cebdd77e3348fef1a11a7c39309c7e..601c96b7b30695d2dc0e699c5b973bc1859e13f8 100644 (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.
diff --git a/gcc/testsuite/gcc.dg/guality/pr45882.c b/gcc/testsuite/gcc.dg/guality/pr45882.c
new file mode 100644 (file)
index 0000000..335574d
--- /dev/null
@@ -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;
+}
index 7141ab5c7d4161bbb49778b4bd65719ca13c3c42..50890d8c0ccd5945e89b17915a2ef1dca9066083 100644 (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;
                }