OSDN Git Service

Fix variable tracking for leaf functions on sparc.
authordavem <davem@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 7 Feb 2013 23:42:03 +0000 (23:42 +0000)
committerdavem <davem@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 7 Feb 2013 23:42:03 +0000 (23:42 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@195870 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/dwarf2out.c
gcc/var-tracking.c

index 89d1c75..fb3b887 100644 (file)
@@ -1,3 +1,11 @@
+2013-02-07  David S. Miller  <davem@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.
+
 2013-02-07  Uros Bizjak  <ubizjak@gmail.com>
 
        Backport from mainline
index 06c6c9d..4ac66f9 100644 (file)
@@ -10603,7 +10603,16 @@ based_loc_descr (rtx reg, HOST_WIDE_INT offset,
        }
     }
 
-  regno = DWARF_FRAME_REGNUM (REGNO (reg));
+  regno = REGNO (reg);
+#ifdef LEAF_REG_REMAP
+  if (current_function_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))
index d05c814..d797c40 100644 (file)
@@ -8980,31 +8980,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 && !current_function_uses_only_leaf_regs)
     {
-      parm_reg_t *p
-       = VEC_safe_push (parm_reg_t, gc, windowed_parm_regs, NULL);
-      p->incoming = incoming;
-      incoming
-       = gen_rtx_REG_offset (incoming, GET_MODE (incoming),
-                             OUTGOING_REGNO (REGNO (incoming)), 0);
-      p->outgoing = incoming;
-    }
-  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
            = VEC_safe_push (parm_reg_t, gc, windowed_parm_regs, NULL);
-         p->incoming = reg;
-         reg = gen_raw_REG (GET_MODE (reg), OUTGOING_REGNO (REGNO (reg)));
-         p->outgoing = reg;
-         incoming = replace_equiv_address_nv (incoming, reg);
+         p->incoming = incoming;
+         incoming
+           = gen_rtx_REG_offset (incoming, GET_MODE (incoming),
+                                 OUTGOING_REGNO (REGNO (incoming)), 0);
+         p->outgoing = incoming;
+       }
+      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
+               = VEC_safe_push (parm_reg_t, gc, windowed_parm_regs, NULL);
+             p->incoming = reg;
+             reg = gen_raw_REG (GET_MODE (reg), OUTGOING_REGNO (REGNO (reg)));
+             p->outgoing = reg;
+             incoming = replace_equiv_address_nv (incoming, reg);
+           }
        }
     }
 #endif