On Thu, May 28, 2015 at 9:02 AM, Jakub Jelinek <ja...@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 <r...@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. -- H.J. --- 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";