re PR target/57260 (Generated R_MIPS_GOT_MIPS relocation for direct function call...
authorRichard Sandiford <rdsandiford@googlemail.com>
Wed, 15 May 2013 19:16:34 +0000 (19:16 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Wed, 15 May 2013 19:16:34 +0000 (19:16 +0000)
gcc/
PR target/57260
* config/mips/mips.c (mips_function_ok_for_sibcall): Don't allow
sibling calls to functions that would normally be lazily bound,
unless $gp is call-clobbered.

gcc/testsuite/
PR target/57260
* gcc.target/mips/call-1.c: Restrict to o32.
* gcc.target/mips/call-5.c, gcc.target/mips/call-6.c: New test.

From-SVN: r198945

gcc/ChangeLog
gcc/config/mips/mips.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/mips/call-1.c
gcc/testsuite/gcc.target/mips/call-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/mips/call-6.c [new file with mode: 0644]

index 6d61a4ed04de452574b2e37f0e82e0f636b90c18..425e3d2e5b6b0467d1dbc014077fac82c9f41896 100644 (file)
@@ -1,3 +1,10 @@
+2013-05-15  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       PR target/57260
+       * config/mips/mips.c (mips_function_ok_for_sibcall): Don't allow
+       sibling calls to functions that would normally be lazily bound,
+       unless $gp is call-clobbered.
+
 2013-05-15  Uros Bizjak  <ubizjak@gmail.com>
 
        * config/i386/i386.c (iy86_option_override_internal): Update
index f7c1f8cbc06aded53fe88215c8db0f1922415c18..066e7a1b1386032d08b12904c24f9a0d1f441e12 100644 (file)
@@ -6995,6 +6995,15 @@ mips_function_ok_for_sibcall (tree decl, tree exp ATTRIBUTE_UNUSED)
       && mips_call_may_need_jalx_p (decl))
     return false;
 
+  /* Sibling calls should not prevent lazy binding.  Lazy-binding stubs
+     require $gp to be valid on entry, so sibcalls can only use stubs
+     if $gp is call-clobbered.  */
+  if (decl
+      && TARGET_CALL_SAVED_GP
+      && !TARGET_ABICALLS_PIC0
+      && !targetm.binds_local_p (decl))
+    return false;
+
   /* Otherwise OK.  */
   return true;
 }
index be7ccece6a40aa4be433a74970abb66d5df5ad21..e608612d2d16cd828e781ef1c973bb5683fc73d8 100644 (file)
@@ -1,3 +1,9 @@
+2013-05-15  Richard Sandiford  <rdsandiford@googlemail.com>
+
+       PR target/57260
+       * gcc.target/mips/call-1.c: Restrict to o32.
+       * gcc.target/mips/call-5.c, gcc.target/mips/call-6.c: New test.
+
 2013-05-15  Paolo Carlini  <paolo.carlini@oracle.com>
 
        * g++.dg/cpp0x/lambda/lambda-shadow1.C: Replace dg-warnings with
index a9c97c329e40dade2e9bb8b3a35ff66038b5d69d..2a9f1e57159839f9ae47144a3f94056a48a96646 100644 (file)
@@ -1,10 +1,12 @@
-/* { dg-options "-mrelax-pic-calls -mshared -foptimize-sibling-calls" } */
+/* { dg-options "-mrelax-pic-calls -mshared -foptimize-sibling-calls -mabi=32" } */
 /* { dg-skip-if "requires -foptimize-sibling-calls" { *-*-* } { "-O0" } { "" } } */
 /* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,normal\n1:\tjalr\t" } } */
 /* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,normal2\n1:\tjalr\t" } } */
 /* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,staticfunc\n1:\tjalr\t" } } */
 /* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,tail\n1:\tjr\t" } } */
 /* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,tail2\n1:\tjr\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,tail3\n1:\tjr\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,tail4\n1:\tjr\t" } } */
 
 __attribute__ ((noinline)) static void staticfunc () { asm (""); }
 int normal ();
@@ -31,3 +33,17 @@ NOMIPS16 void g ()
 {
   tail2 ();
 }
+
+__attribute__ ((visibility ("hidden"))) void tail3 ();
+
+NOMIPS16 void j ()
+{
+  tail3 ();
+}
+
+__attribute__ ((noinline)) static void tail4 () { asm (""); }
+
+NOMIPS16 void k ()
+{
+  tail4 ();
+}
diff --git a/gcc/testsuite/gcc.target/mips/call-5.c b/gcc/testsuite/gcc.target/mips/call-5.c
new file mode 100644 (file)
index 0000000..2e58178
--- /dev/null
@@ -0,0 +1,51 @@
+/* Like call-1.c, but for n32.  We cannot use sibling calls for tail and tail2
+   in this case (PR target/57260).  */
+/* { dg-options "-mrelax-pic-calls -mshared -foptimize-sibling-calls -mabi=n32" } */
+/* { dg-skip-if "requires -foptimize-sibling-calls" { *-*-* } { "-O0" } { "" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,normal\n1:\tjalr\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,normal2\n1:\tjalr\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,staticfunc\n1:\tjalr\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,tail\n1:\tjalr\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,tail2\n1:\tjalr\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,tail3\n1:\tjr\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,tail4\n1:\tjr\t" } } */
+
+__attribute__ ((noinline)) static void staticfunc () { asm (""); }
+int normal ();
+void normal2 ();
+
+NOMIPS16 f (int *p)
+{
+  *p = normal ();
+  normal2 ();
+  staticfunc ();
+  return 1;
+}
+
+int tail ();
+
+NOMIPS16 h ()
+{
+  return tail ();
+}
+
+void tail2 ();
+
+NOMIPS16 void g ()
+{
+  tail2 ();
+}
+
+__attribute__ ((visibility ("hidden"))) void tail3 ();
+
+NOMIPS16 void j ()
+{
+  tail3 ();
+}
+
+__attribute__ ((noinline)) static void tail4 () { asm (""); }
+
+NOMIPS16 void k ()
+{
+  tail4 ();
+}
diff --git a/gcc/testsuite/gcc.target/mips/call-6.c b/gcc/testsuite/gcc.target/mips/call-6.c
new file mode 100644 (file)
index 0000000..86f3dc4
--- /dev/null
@@ -0,0 +1,50 @@
+/* Like call-5.c, but for n64.  */
+/* { dg-options "-mrelax-pic-calls -mshared -foptimize-sibling-calls -mabi=64" } */
+/* { dg-skip-if "requires -foptimize-sibling-calls" { *-*-* } { "-O0" } { "" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,normal\n1:\tjalr\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,normal2\n1:\tjalr\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,staticfunc\n1:\tjalr\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,tail\n1:\tjalr\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,tail2\n1:\tjalr\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,tail3\n1:\tjr\t" } } */
+/* { dg-final { scan-assembler "\\.reloc\t1f,R_MIPS_JALR,tail4\n1:\tjr\t" } } */
+
+__attribute__ ((noinline)) static void staticfunc () { asm (""); }
+int normal ();
+void normal2 ();
+
+NOMIPS16 f (int *p)
+{
+  *p = normal ();
+  normal2 ();
+  staticfunc ();
+  return 1;
+}
+
+int tail ();
+
+NOMIPS16 h ()
+{
+  return tail ();
+}
+
+void tail2 ();
+
+NOMIPS16 void g ()
+{
+  tail2 ();
+}
+
+__attribute__ ((visibility ("hidden"))) void tail3 ();
+
+NOMIPS16 void j ()
+{
+  tail3 ();
+}
+
+__attribute__ ((noinline)) static void tail4 () { asm (""); }
+
+NOMIPS16 void k ()
+{
+  tail4 ();
+}