From: David Miller <da...@davemloft.net>
Date: Thu, 07 Feb 2013 14:38:18 -0500 (EST)

> From: Jakub Jelinek <ja...@redhat.com>
> Date: Thu, 7 Feb 2013 18:22:32 +0100
> 
>> Then supposedly somewhere in dwarf2out we do some adjustment,
>> but still end up with d/e loclist of:
>> .LLST2:
>>         .uaxword        .LVL0-.Ltext0   ! Location list begin address 
>> (*.LLST2)
>>         .uaxword        .LVL1-.Ltext0   ! Location list end address (*.LLST2)
>>         .uahalf 0x6     ! Location expression size
>>         .byte   0x88    ! DW_OP_breg24
>>         .byte   0       ! sleb128 0
>>         .byte   0x89    ! DW_OP_breg25
>>         .byte   0       ! sleb128 0
>>         .byte   0x22    ! DW_OP_plus
>>         .byte   0x9f    ! DW_OP_stack_value
>>         .uaxword        .LVL1-.Ltext0   ! Location list begin address 
>> (*.LLST2)
>>         .uaxword        .LFE0-.Ltext0   ! Location list end address (*.LLST2)
>>         .uahalf 0x1     ! Location expression size
>>         .byte   0x58    ! DW_OP_reg8
>>         .uaxword        0       ! Location list terminator begin (*.LLST2)
>>         .uaxword        0       ! Location list terminator end (*.LLST2)
>> where I'd expect breg8/breg9 instead.
> 
> The fix for this is trivial, just a missing leaf renumbering in dwarf2out.c:

So the combined patch is below, any objections?

Here is the testsuite diff:

@@ -155,8 +148,8 @@ FAIL: gcc.dg/guality/vla-2.c  -O2 -flto

                === gcc Summary ===

-# of expected passes           2128
-# of unexpected failures       122
+# of expected passes           2135
+# of unexpected failures       115
 # of unexpected successes      31
 # of expected failures         17
 # of unsupported tests         136

This is undoubtedly an improvement.

gcc/

2013-02-07  David S. Miller  <da...@davemloft.net>

        * dwarf2out.c (based_loc_descr): Perform leaf register remapping
        on 'reg'.
        * var-tracking.c (vt_add_function_parameter): Test the presence of
        HAVE_window_save properly and do not remap argument registers when
        we have a leaf function.

diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 06cfb18..765d5c5 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -10864,7 +10864,16 @@ based_loc_descr (rtx reg, HOST_WIDE_INT offset,
        }
     }
 
-  regno = DWARF_FRAME_REGNUM (REGNO (reg));
+  regno = REGNO (reg);
+#ifdef LEAF_REG_REMAP
+  if (crtl->uses_only_leaf_regs)
+    {
+      int leaf_reg = LEAF_REG_REMAP (regno);
+      if (leaf_reg != -1)
+       regno = (unsigned) leaf_reg;
+    }
+#endif
+  regno = DWARF_FRAME_REGNUM (regno);
 
   if (!optimize && fde
       && (fde->drap_reg == regno || fde->vdrap_reg == regno))
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
index 714acb69..0db1562 100644
--- a/gcc/var-tracking.c
+++ b/gcc/var-tracking.c
@@ -9502,31 +9502,34 @@ vt_add_function_parameter (tree parm)
   /* DECL_INCOMING_RTL uses the INCOMING_REGNO of parameter registers.
      If the target machine has an explicit window save instruction, the
      actual entry value is the corresponding OUTGOING_REGNO instead.  */
-  if (REG_P (incoming)
-      && HARD_REGISTER_P (incoming)
-      && OUTGOING_REGNO (REGNO (incoming)) != REGNO (incoming))
+  if (HAVE_window_save && !crtl->uses_only_leaf_regs)
     {
-      parm_reg_t p;
-      p.incoming = incoming;
-      incoming
-       = gen_rtx_REG_offset (incoming, GET_MODE (incoming),
-                             OUTGOING_REGNO (REGNO (incoming)), 0);
-      p.outgoing = incoming;
-      vec_safe_push (windowed_parm_regs, p);
-    }
-  else if (MEM_P (incoming)
-          && REG_P (XEXP (incoming, 0))
-          && HARD_REGISTER_P (XEXP (incoming, 0)))
-    {
-      rtx reg = XEXP (incoming, 0);
-      if (OUTGOING_REGNO (REGNO (reg)) != REGNO (reg))
+      if (REG_P (incoming)
+         && HARD_REGISTER_P (incoming)
+         && OUTGOING_REGNO (REGNO (incoming)) != REGNO (incoming))
        {
          parm_reg_t p;
-         p.incoming = reg;
-         reg = gen_raw_REG (GET_MODE (reg), OUTGOING_REGNO (REGNO (reg)));
-         p.outgoing = reg;
+         p.incoming = incoming;
+         incoming
+           = gen_rtx_REG_offset (incoming, GET_MODE (incoming),
+                                 OUTGOING_REGNO (REGNO (incoming)), 0);
+         p.outgoing = incoming;
          vec_safe_push (windowed_parm_regs, p);
-         incoming = replace_equiv_address_nv (incoming, reg);
+       }
+      else if (MEM_P (incoming)
+              && REG_P (XEXP (incoming, 0))
+              && HARD_REGISTER_P (XEXP (incoming, 0)))
+       {
+         rtx reg = XEXP (incoming, 0);
+         if (OUTGOING_REGNO (REGNO (reg)) != REGNO (reg))
+           {
+             parm_reg_t p;
+             p.incoming = reg;
+             reg = gen_raw_REG (GET_MODE (reg), OUTGOING_REGNO (REGNO (reg)));
+             p.outgoing = reg;
+             vec_safe_push (windowed_parm_regs, p);
+             incoming = replace_equiv_address_nv (incoming, reg);
+           }
        }
     }
 #endif

Reply via email to