From 3c53850d643480c7fa846a72db993c9d2a84ab16 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Tue, 20 Jan 2004 19:58:59 +0000 Subject: [PATCH] mips.c (mips_load_call_address): Make the call insn use $gp if it could be calling a lazy binding stub. * config/mips/mips.c (mips_load_call_address): Make the call insn use $gp if it could be calling a lazy binding stub. From-SVN: r76224 --- gcc/ChangeLog | 5 +++++ gcc/config/mips/mips.c | 33 +++++++++++++++++++++------------ 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2b393069a84..e0a1d511f7e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-01-20 Richard Sandiford + + * config/mips/mips.c (mips_load_call_address): Make the call insn + use $gp if it could be calling a lazy binding stub. + 2004-01-20 Kazu Hirata * config/s390/s390.c (TARGET_PROMOTE_FUNCTION_ARGS): Define. diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index 0cef0f32cf0..c348f58dd56 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -3244,37 +3244,46 @@ mips_load_call_address (rtx dest, rtx addr, int sibcall_p) void mips_expand_call (rtx result, rtx addr, rtx args_size, rtx aux, int sibcall_p) { + rtx orig_addr, pattern, insn; + + orig_addr = addr; if (!call_insn_operand (addr, VOIDmode)) { - rtx dest = gen_reg_rtx (Pmode); - mips_load_call_address (dest, addr, sibcall_p); - addr = dest; + addr = gen_reg_rtx (Pmode); + mips_load_call_address (addr, orig_addr, sibcall_p); } if (TARGET_MIPS16 && mips16_hard_float && build_mips16_call_stub (result, addr, args_size, aux == 0 ? 0 : (int) GET_MODE (aux))) - /* Nothing more to do */; - else if (result == 0) - emit_call_insn (sibcall_p - ? gen_sibcall_internal (addr, args_size) - : gen_call_internal (addr, args_size)); + return; + + if (result == 0) + pattern = (sibcall_p + ? gen_sibcall_internal (addr, args_size) + : gen_call_internal (addr, args_size)); else if (GET_CODE (result) == PARALLEL && XVECLEN (result, 0) == 2) { rtx reg1, reg2; reg1 = XEXP (XVECEXP (result, 0, 0), 0); reg2 = XEXP (XVECEXP (result, 0, 1), 0); - emit_call_insn + pattern = (sibcall_p ? gen_sibcall_value_multiple_internal (reg1, addr, args_size, reg2) : gen_call_value_multiple_internal (reg1, addr, args_size, reg2)); } else - emit_call_insn (sibcall_p - ? gen_sibcall_value_internal (result, addr, args_size) - : gen_call_value_internal (result, addr, args_size)); + pattern = (sibcall_p + ? gen_sibcall_value_internal (result, addr, args_size) + : gen_call_value_internal (result, addr, args_size)); + + insn = emit_call_insn (pattern); + + /* Lazy-binding stubs require $gp to be valid on entry. */ + if (global_got_operand (orig_addr, VOIDmode)) + use_reg (&CALL_INSN_FUNCTION_USAGE (insn), pic_offset_table_rtx); } -- 2.30.2