Fix variable tracking for leaf functions on sparc.
* 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. From-SVN: r195870
This commit is contained in:
parent
1fe0b701ff
commit
e437384000
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue