OSDN Git Service

* config/mips/mips.c (mips_load_call_address): Make the call insn
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 20 Jan 2004 19:58:59 +0000 (19:58 +0000)
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 20 Jan 2004 19:58:59 +0000 (19:58 +0000)
use $gp if it could be calling a lazy binding stub.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@76224 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/mips/mips.c

index 2b39306..e0a1d51 100644 (file)
@@ -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.
index 0cef0f3..c348f58 100644 (file)
@@ -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);
 }