diff mbox

Relocations to use when eliding plts

Message ID CAMe9rOpfqdrDEObc0viYsuG+6kckTEjjYoHTMPkfXG6BkFC8cA@mail.gmail.com
State Not Applicable
Headers show

Commit Message

H.J. Lu May 28, 2015, 4:09 p.m. UTC
On Thu, May 28, 2015 at 9:02 AM, Jakub Jelinek <jakub@redhat.com> wrote:
> On Thu, May 28, 2015 at 08:52:28AM -0700, Richard Henderson wrote:
>> On 05/28/2015 08:42 AM, H.J. Lu wrote:
>> > On Thu, May 28, 2015 at 8:29 AM, Richard Henderson <rth@redhat.com> wrote:
>> >> On 05/28/2015 04:27 AM, H.J. Lu wrote:
>> >>> You get consecutive jmpq's because x86 PLT entry is used as the
>> >>> canonical function address.  If you compile main with -fno-plt -fPIE, you
>> >>> get:
>> >>
>> >> Well, duh.  If the main executable has no PLTs, they aren't used as the
>> >> canonical function address.  Surely you aren't proposing that as a solution?
>> >>
>> >
>> > I was just explaining where those consecutive jmpq's came from.
>> > I wasn't suggesting a solution..
>>
>> I did explain it.  In the quite long message.
>>
>> No comments about the rest of it, wherein I suggest a solution that doesn't
>> require the main executable to be compiled with -fno-plt in order to avoid them?
>
> And even that wouldn't help, you'd need to compile the binaries with -fpie -fno-plt,
> as -fno-plt doesn't affect normal non-PIC calls.
>

Funny you should mention it.  Here is a patch to extend -fno-plt
to normal non-PIC calls.  64-bit works with the current binutils.  32-bit
only works with users/hjl/relax branch.  I need to add configure test
to enable it for 32-bit.
diff mbox

Patch

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index e77cd04..db7ce3d 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -25611,7 +25611,22 @@  ix86_output_call_insn (rtx_insn *insn, rtx call_op)
   if (SIBLING_CALL_P (insn))
     {
       if (direct_p)
- xasm = "%!jmp\t%P0";
+ {
+  if (!flag_plt
+      && !flag_pic
+      && !TARGET_MACHO
+      && !TARGET_SEH
+      && !TARGET_PECOFF)
+    {
+      /* Avoid PLT.  */
+      if (TARGET_64BIT)
+ xasm = "%!jmp\t*%p0@GOTPCREL(%%rip)";
+      else
+ xasm = "%!jmp\t*%p0@GOT";
+    }
+  else
+    xasm = "%!jmp\t%P0";
+ }
       /* SEH epilogue detection requires the indirect branch case
  to include REX.W.  */
       else if (TARGET_SEH)
@@ -25654,7 +25669,22 @@  ix86_output_call_insn (rtx_insn *insn, rtx call_op)
     }

   if (direct_p)
-    xasm = "%!call\t%P0";
+    {
+      if (!flag_plt
+  && !flag_pic
+  && !TARGET_MACHO
+  && !TARGET_SEH
+  && !TARGET_PECOFF)
+ {
+  /* Avoid PLT.  */
+  if (TARGET_64BIT)
+    xasm = "%!call\t*%p0@GOTPCREL(%%rip)";
+  else
+    xasm = "%!call\t*%p0@GOT";
+ }
+      else
+ xasm = "%!call\t%P0";
+    }
   else
     xasm = "%!call\t%A0";