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:
David S. Miller 2013-02-07 23:42:03 +00:00 committed by David S. Miller
parent 1fe0b701ff
commit e437384000
3 changed files with 42 additions and 22 deletions

View 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

View 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))

View 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