i386: Access external function via GOT slot for -fno-plt

Programming / Compilers / GCC - hjl [138bc75d-0d04-0410-961f-82ee72b054a4] - 23 June 2016 11:30 EDT

i386 psABI has been updated to clarify that R_386_GOT32X and R_386_GOT32 relocations can be used to access GOT without base register when PIC is disabled:

https://groups.google.com/forum/#!topic/ia32-abi/awsRSvJOJfs

32-bit x86 assembler and linker from binutils 2.26.1 and 2.27 support

call/jmp *_start@GOT cmpl $0, bar@GOT

for both normal and IFUNC functions. We check if 32-bit x86 assembler and linker have the fix for:

https://sourceware.org/bugzilla/show_bug.cgi?id=20244

before accessing external function via GOT slot for -fno-plt in both PIC and non-PIC modes.

PR target/66232 PR target/67400
- configure.ac (as_ix86_tls_ldm_opt): Renamed to ... (as_ix86_gas_32_opt): This. (ld_ix86_tls_ldm_opt): Renamed to ... (ld_ix86_gld_32_opt): This. (R_386_TLS_LDM reloc): Updated. (R_386_GOT32X reloc): New assembler/linker check. (HAVE_AS_IX86_GOT32X): New. Defined to 1 if 32-bit assembler and linker support "jmp *_start@GOT" and "cmpl $0, bar@GOT". Otherise, defined to 0.
- config.in: Regenerated.
- configure: Likewise.
- config/i386/i386.c (ix86_force_load_from_GOT_p): Return true if HAVE_AS_IX86_GOT32X is 1 in 32-bit mode. (ix86_legitimate_address_p): Allow UNSPEC_GOT for -fno-plt if ix86_force_load_from_GOT_p returns true. (ix86_print_operand_address_as): Also support UNSPEC_GOT if ix86_force_load_from_GOT_p returns true. (ix86_expand_move): Generate UNSPEC_GOT in 32-bit mode to load the external function address via the GOT slot. (ix86_nopic_noplt_attribute_p): Check both TARGET_64BIT and HAVE_AS_IX86_GOT32X before returning false. (ix86_output_call_insn): Generate "%!jmp/call\t*%p0@GOT" in 32-bit mode if ix86_nopic_noplt_attribute_p returns true.

gcc/testsuite/

PR target/66232 PR target/67400
- gcc.target/i386/pr66232-14.c: New file.
- gcc.target/i386/pr66232-15.c: Likewise.
- gcc.target/i386/pr66232-16.c: Likewise.
- gcc.target/i386/pr66232-17.c: Likewise.
- gcc.target/i386/pr67400-1.c: Don't disable for ia32. Scan for ia32 if R_386_GOT32X relocation is supported.
- gcc.target/i386/pr67400-2.c: Likewise.
- gcc.target/i386/pr67400-3.c: Likewise.
- gcc.target/i386/pr67400-4.c: Likewise.
- gcc.target/i386/pr67400-6.c: Likewise.
- gcc.target/i386/pr67400-7.c: Likewise.
- lib/target-supports.exp (check_effective_target_got32x_reloc): New.

6fb2f18 i386: Access external function via GOT slot for -fno-plt
gcc/ChangeLog | 28 +++++++++++++
gcc/config.in | 9 +++-
gcc/config/i386/i386.c | 51 ++++++++++++++++-------
gcc/configure | 62 +++++++++++++++++++++++++---
gcc/configure.ac | 39 ++++++++++++++---
gcc/testsuite/ChangeLog | 18 ++++++++
gcc/testsuite/gcc.target/i386/pr66232-14.c | 13 ++++++
gcc/testsuite/gcc.target/i386/pr66232-15.c | 14 +++++++
gcc/testsuite/gcc.target/i386/pr66232-16.c | 13 ++++++
gcc/testsuite/gcc.target/i386/pr66232-17.c | 13 ++++++
gcc/testsuite/gcc.target/i386/pr67400-1.c | 8 ++--
gcc/testsuite/gcc.target/i386/pr67400-2.c | 8 ++--
gcc/testsuite/gcc.target/i386/pr67400-3.c | 3 +-
gcc/testsuite/gcc.target/i386/pr67400-4.c | 5 ++-
gcc/testsuite/gcc.target/i386/pr67400-6.c | 8 ++--
gcc/testsuite/gcc.target/i386/pr67400-7.c | 6 +--
gcc/testsuite/lib/target-supports.exp | 51 +++++++++++++++++++++++
17 files changed, 308 insertions(+), 41 deletions(-)

Upstream: gcc.gnu.org


  • Share