aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <rsandifo@redhat.com>2004-01-20 19:58:59 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2004-01-20 19:58:59 +0000
commit3c53850d643480c7fa846a72db993c9d2a84ab16 (patch)
tree46791ceeab538c80b4dd1202a82c59e695bc52fb /gcc
parent101ad855bae5308d423091dcf91484d84117400c (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/config/mips/mips.c33
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);
}