]> git.ipfire.org Git - thirdparty/gcc.git/commit
x86: Handle TARGET_INDIRECT_BRANCH_REGISTER for -fno-plt
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 31 Jan 2025 04:29:04 +0000 (12:29 +0800)
committerH.J. Lu <hjl.tools@gmail.com>
Sat, 1 Feb 2025 13:47:26 +0000 (21:47 +0800)
commitdd6247cb8fc11a15e23e949092f89d24ff329209
tree61a0860e9bee20c8866aca41ceabbd12c514900c
parentcf24c0fa53870da6e666a97b79c4b053317c4951
x86: Handle TARGET_INDIRECT_BRANCH_REGISTER for -fno-plt

If TARGET_INDIRECT_BRANCH_REGISTER is true, indirect call and jump should
use register, not memory.  Update Bs, Bw and Bz constraints to disable
indirect call over memmory if TARGET_INDIRECT_BRANCH_REGISTER true, change
x32 call over GOT slot to call over register and also disable sibcall
over memory.

gcc/

PR target/118713
* config/i386/constraints.md (Bs): Always disable if
TARGET_INDIRECT_BRANCH_REGISTER is true.
(Bw): Likewise.
* config/i386/i386-expand.cc (ix86_expand_call): Force indirect
call via register for x32 GOT slot call if
TARGET_INDIRECT_BRANCH_REGISTER is true.
* config/i386/i386-protos.h (ix86_nopic_noplt_attribute_p): New.
* config/i386/i386.cc (ix86_nopic_noplt_attribute_p): Make it
global.
* config/i386/i386.md (*call_got_x32): Disable indirect call via
memory for TARGET_INDIRECT_BRANCH_REGISTER.
(*call_value_got_x32): Likewise.
(*sibcall_value_pop_memory): Likewise.
* config/i386/predicates.md (constant_call_address_operand):
Return false if both TARGET_INDIRECT_BRANCH_REGISTER and
ix86_nopic_noplt_attribute_p are true.

gcc/testsuite/

PR target/118713
* gcc.target/i386/pr118713-1-x32.c: New test.
* gcc.target/i386/pr118713-1.c: Likewise.
* gcc.target/i386/pr118713-2-x32.c: Likewise.
* gcc.target/i386/pr118713-2.c: Likewise.
* gcc.target/i386/pr118713-3-x32.c: Likewise.
* gcc.target/i386/pr118713-3.c: Likewise.
* gcc.target/i386/pr118713-4-x32.c: Likewise.
* gcc.target/i386/pr118713-4.c: Likewise.
* gcc.target/i386/pr118713-5-x32.c: Likewise.
* gcc.target/i386/pr118713-5.c: Likewise.
* gcc.target/i386/pr118713-6-x32.c: Likewise.
* gcc.target/i386/pr118713-6.c: Likewise.
* gcc.target/i386/pr118713-7-x32.c: Likewise.
* gcc.target/i386/pr118713-7.c: Likewise.
* gcc.target/i386/pr118713-8-x32.c: Likewise.
* gcc.target/i386/pr118713-8.c: Likewise.
* gcc.target/i386/pr118713-9-x32.c: Likewise.
* gcc.target/i386/pr118713-9.c: Likewise.
* gcc.target/i386/pr118713-10-x32.c: Likewise.
* gcc.target/i386/pr118713-10.c: Likewise.
* gcc.target/i386/pr118713-11-x32.c: Likewise.
* gcc.target/i386/pr118713-11.c: Likewise.
* gcc.target/i386/pr118713-12-x32.c: Likewise.
* gcc.target/i386/pr118713-12.c: Likewise.

Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
30 files changed:
gcc/config/i386/constraints.md
gcc/config/i386/i386-expand.cc
gcc/config/i386/i386-protos.h
gcc/config/i386/i386.cc
gcc/config/i386/i386.md
gcc/config/i386/predicates.md
gcc/testsuite/gcc.target/i386/pr118713-1-x32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr118713-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr118713-10-x32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr118713-10.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr118713-11-x32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr118713-11.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr118713-12-x32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr118713-12.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr118713-2-x32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr118713-2.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr118713-3-x32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr118713-3.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr118713-4-x32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr118713-4.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr118713-5-x32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr118713-5.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr118713-6-x32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr118713-6.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr118713-7-x32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr118713-7.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr118713-8-x32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr118713-8.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr118713-9-x32.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/pr118713-9.c [new file with mode: 0644]