From 499f32e8fa6c398878d8c52757ac87f444e18886 Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Thu, 7 Feb 2013 23:19:27 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 8 ++++++++ gcc/dwarf2out.c | 11 ++++++++++- gcc/var-tracking.c | 45 ++++++++++++++++++++++++--------------------- 3 files changed, 42 insertions(+), 22 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 08f9b8f817c..dcbe029272a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2013-02-07 David S. Miller + + * 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 PR bootstrap/56227 diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 13c31ad005f..4e75407fedf 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -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 && (fde->drap_reg == regno || fde->vdrap_reg == regno)) diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index 714acb69692..0db15625b70 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 -- 2.30.2