diff options
author | Richard Sandiford <rsandifo@redhat.com> | 2004-01-20 19:58:59 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2004-01-20 19:58:59 +0000 |
commit | 3c53850d643480c7fa846a72db993c9d2a84ab16 (patch) | |
tree | 46791ceeab538c80b4dd1202a82c59e695bc52fb /gcc | |
parent | 101ad855bae5308d423091dcf91484d84117400c (diff) | |
download | gcc-3c53850d643480c7fa846a72db993c9d2a84ab16.zip gcc-3c53850d643480c7fa846a72db993c9d2a84ab16.tar.gz gcc-3c53850d643480c7fa846a72db993c9d2a84ab16.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/mips/mips.c | 33 |
2 files changed, 26 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2b39306..e0a1d511 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-01-20 Richard Sandiford <rsandifo@redhat.com> + + * 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 <kazu@cs.umass.edu> * config/s390/s390.c (TARGET_PROMOTE_FUNCTION_ARGS): Define. diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index 0cef0f3..c348f58 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); } |