IBM Z: Use @PLT symbols for local functions in 64-bit mode
commit0990d93dd8a4268bff5bbe48aa26748cf63201c7
authorIlya Leoshkevich <iii@linux.ibm.com>
Mon, 7 Jun 2021 11:44:15 +0000 (7 13:44 +0200)
committerIlya Leoshkevich <iii@linux.ibm.com>
Fri, 16 Jul 2021 10:51:42 +0000 (16 12:51 +0200)
tree0501bb3f68bbb3c83e743c49a9e5616f4f2a97d8
parentdf0d7486ec9bca8a77ca106d9fbb60f819dd9cec
IBM Z: Use @PLT symbols for local functions in 64-bit mode

This helps with generating code for kernel hotpatches, which contain
individual functions and are loaded more than 2G away from vmlinux.
This should not create performance regressions for the normal use
cases, because for local functions ld replaces @PLT calls with direct
calls.

gcc/ChangeLog:

* config/s390/predicates.md (bras_sym_operand): Accept all
functions in 64-bit mode, use UNSPEC_PLT31.
(larl_operand): Use UNSPEC_PLT31.
* config/s390/s390.c (s390_loadrelative_operand_p): Likewise.
(legitimize_pic_address): Likewise.
(s390_emit_tls_call_insn): Mark __tls_get_offset as function,
use UNSPEC_PLT31.
(s390_delegitimize_address): Use UNSPEC_PLT31.
(s390_output_addr_const_extra): Likewise.
(print_operand): Add @PLT to TLS calls, handle %K.
(s390_function_profiler): Mark __fentry__/_mcount as function,
use %K, use UNSPEC_PLT31.
(s390_output_mi_thunk): Use only UNSPEC_GOT, use %K.
(s390_emit_call): Use UNSPEC_PLT31.
(s390_emit_tpf_eh_return): Mark __tpf_eh_return as function.
* config/s390/s390.md (UNSPEC_PLT31): Rename from UNSPEC_PLT.
(*movdi_64): Use %K.
(reload_base_64): Likewise.
(*sibcall_brc): Likewise.
(*sibcall_brcl): Likewise.
(*sibcall_value_brc): Likewise.
(*sibcall_value_brcl): Likewise.
(*bras): Likewise.
(*brasl): Likewise.
(*bras_r): Likewise.
(*brasl_r): Likewise.
(*bras_tls): Likewise.
(*brasl_tls): Likewise.
(main_base_64): Likewise.
(reload_base_64): Likewise.
(@split_stack_call<mode>): Likewise.

gcc/testsuite/ChangeLog:

* g++.dg/ext/visibility/noPLT.C: Skip on s390x.
* g++.target/s390/mi-thunk.C: New test.
* gcc.target/s390/nodatarel-1.c: Move foostatic to the new
tests.
* gcc.target/s390/pr80080-4.c: Allow @PLT suffix.
* gcc.target/s390/risbg-ll-3.c: Likewise.
* gcc.target/s390/call.h: Common code for the new tests.
* gcc.target/s390/call-z10-pic-nodatarel.c: New test.
* gcc.target/s390/call-z10-pic.c: New test.
* gcc.target/s390/call-z10.c: New test.
* gcc.target/s390/call-z9-pic-nodatarel.c: New test.
* gcc.target/s390/call-z9-pic.c: New test.
* gcc.target/s390/call-z9.c: New test.
* gcc.target/s390/mfentry-m64-pic.c: New test.
* gcc.target/s390/tls.h: Common code for the new TLS tests.
* gcc.target/s390/tls-pic.c: New test.
* gcc.target/s390/tls.c: New test.
19 files changed:
gcc/config/s390/predicates.md
gcc/config/s390/s390.c
gcc/config/s390/s390.md
gcc/testsuite/g++.dg/ext/visibility/noPLT.C
gcc/testsuite/g++.target/s390/mi-thunk.C [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/call-z10-pic-nodatarel.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/call-z10-pic.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/call-z10.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/call-z9-pic-nodatarel.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/call-z9-pic.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/call-z9.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/call.h [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/mfentry-m64-pic.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/nodatarel-1.c
gcc/testsuite/gcc.target/s390/pr80080-4.c
gcc/testsuite/gcc.target/s390/risbg-ll-3.c
gcc/testsuite/gcc.target/s390/tls-pic.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/tls.c [new file with mode: 0644]
gcc/testsuite/gcc.target/s390/tls.h [new file with mode: 0644]