Commit 499f32e8 by David S. Miller Committed by David S. Miller

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: r195869
parent 48227088
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> 2013-02-07 Uros Bizjak <ubizjak@gmail.com>
PR bootstrap/56227 PR bootstrap/56227
......
...@@ -10865,7 +10865,16 @@ based_loc_descr (rtx reg, HOST_WIDE_INT offset, ...@@ -10865,7 +10865,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 if (!optimize && fde
&& (fde->drap_reg == regno || fde->vdrap_reg == regno)) && (fde->drap_reg == regno || fde->vdrap_reg == regno))
......
...@@ -9502,31 +9502,34 @@ vt_add_function_parameter (tree parm) ...@@ -9502,31 +9502,34 @@ vt_add_function_parameter (tree parm)
/* DECL_INCOMING_RTL uses the INCOMING_REGNO of parameter registers. /* DECL_INCOMING_RTL uses the INCOMING_REGNO of parameter registers.
If the target machine has an explicit window save instruction, the If the target machine has an explicit window save instruction, the
actual entry value is the corresponding OUTGOING_REGNO instead. */ actual entry value is the corresponding OUTGOING_REGNO instead. */
if (REG_P (incoming) if (HAVE_window_save && !crtl->uses_only_leaf_regs)
&& HARD_REGISTER_P (incoming)
&& OUTGOING_REGNO (REGNO (incoming)) != REGNO (incoming))
{ {
parm_reg_t p; if (REG_P (incoming)
p.incoming = incoming; && HARD_REGISTER_P (incoming)
incoming && OUTGOING_REGNO (REGNO (incoming)) != REGNO (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))
{ {
parm_reg_t p; parm_reg_t p;
p.incoming = reg; p.incoming = incoming;
reg = gen_raw_REG (GET_MODE (reg), OUTGOING_REGNO (REGNO (reg))); incoming
p.outgoing = reg; = gen_rtx_REG_offset (incoming, GET_MODE (incoming),
OUTGOING_REGNO (REGNO (incoming)), 0);
p.outgoing = incoming;
vec_safe_push (windowed_parm_regs, p); 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 #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment