From 9a23f96e919ba91587d077b1d399246dde4002dd Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Wed, 30 Aug 2017 20:35:35 +0930 Subject: PowerPC TPREL16_HA/LO reloc optimization In the TLS GD/LD to LE optimization, ld replaces a sequence like addi 3,2,x@got@tlsgd R_PPC64_GOT_TLSGD16 x bl __tls_get_addr(x@tlsgd) R_PPC64_TLSGD x R_PPC64_REL24 __tls_get_addr nop with addis 3,13,x@tprel@ha R_PPC64_TPREL16_HA x addi 3,3,x@tprel@l R_PPC64_TPREL16_LO x nop When the tprel offset is small, this can be further optimized to nop addi 3,13,x@tprel nop bfd/ * elf64-ppc.c (struct ppc_link_hash_table): Add do_tls_opt. (ppc64_elf_tls_optimize): Set it. (ppc64_elf_relocate_section): Nop addis on TPREL16_HA, and convert insn on TPREL16_LO and TPREL16_LO_DS relocs to use r13 when addis would add zero. * elf32-ppc.c (struct ppc_elf_link_hash_table): Add do_tls_opt. (ppc_elf_tls_optimize): Set it. (ppc_elf_relocate_section): Nop addis on TPREL16_HA, and convert insn on TPREL16_LO relocs to use r2 when addis would add zero. gold/ * powerpc.cc (Target_powerpc::Relocate::relocate): Nop addis on TPREL16_HA, and convert insn on TPREL16_LO and TPREL16_LO_DS relocs to use r2/r13 when addis would add zero. ld/ * testsuite/ld-powerpc/tls.s: Add calls with tls markers. * testsuite/ld-powerpc/tls32.s: Likewise. * testsuite/ld-powerpc/powerpc.exp: Run tls marker tests. * testsuite/ld-powerpc/tls.d: Adjust for TPREL16_HA/LO optimization. * testsuite/ld-powerpc/tlsexe.d: Likewise. * testsuite/ld-powerpc/tlsexetoc.d: Likewise. * testsuite/ld-powerpc/tlsld.d: Likewise. * testsuite/ld-powerpc/tlsmark.d: Likewise. * testsuite/ld-powerpc/tlsopt4.d: Likewise. * testsuite/ld-powerpc/tlstoc.d: Likewise. --- ld/testsuite/ld-powerpc/powerpc.exp | 58 ++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 24 deletions(-) (limited to 'ld/testsuite/ld-powerpc/powerpc.exp') diff --git a/ld/testsuite/ld-powerpc/powerpc.exp b/ld/testsuite/ld-powerpc/powerpc.exp index 4405fa3..0735ab7 100644 --- a/ld/testsuite/ld-powerpc/powerpc.exp +++ b/ld/testsuite/ld-powerpc/powerpc.exp @@ -110,6 +110,11 @@ set ppcelftests { {"APUinfo NULL section processing" "-melf32ppc" "" "-a32 -me500" {apuinfo-nul1.s apuinfo-nul.s} {{readelf -x2 apuinfo-nul.rd}} "apuinfo"} + {"TLS32 static exec (markers)" "-melf32ppc" "" + "-a32 --defsym TLSMARK=1" {tls32.s tlslib32.s} + {{objdump -dr tls32.d} {objdump -sj.got tls32.g} + {objdump -sj.tdata tls32.t}} + "tls32m"} {"TLS32 static exec" "-melf32ppc" "" "-a32" {tls32.s tlslib32.s} {{objdump -dr tls32.d} {objdump -sj.got tls32.g} {objdump -sj.tdata tls32.t}} @@ -119,47 +124,52 @@ set ppcelftests { {"TLS32 dynamic exec" "-melf32ppc --no-ld-generated-unwind-info --hash-style=sysv tmpdir/tls32.o tmpdir/libtlslib32.so" "" "" {} {{readelf -WSsrl tlsexe32.r} {objdump -dr tlsexe32.d} {objdump -sj.got tlsexe32.g} {objdump -sj.tdata tlsexe32.t}} - "tlsexe32"} + "tlsexe32"} {"TLS32 shared" "-shared -melf32ppc --no-ld-generated-unwind-info --hash-style=sysv tmpdir/tls32.o" "" "" {} {{readelf -WSsrl tlsso32.r} {objdump -dr tlsso32.d} {objdump -sj.got tlsso32.g} {objdump -sj.tdata tlsso32.t}} - "tls32.so"} + "tls32.so"} {"TLS32 markers" "-melf32ppc" "" "-a32" {tlsmark32.s tlslib32.s} {{objdump -dr tlsmark32.d}} - "tlsmark32"} + "tlsmark32"} {"TLS32 opt 1" "-melf32ppc" "" "-a32" {tlsopt1_32.s tlslib32.s} {{objdump -dr tlsopt1_32.d}} - "tlsopt1_32"} + "tlsopt1_32"} {"TLS32 opt 2" "-melf32ppc" "" "-a32" {tlsopt2_32.s tlslib32.s} {{objdump -dr tlsopt2_32.d}} - "tlsopt2_32"} + "tlsopt2_32"} {"TLS32 opt 3" "-melf32ppc" "" "-a32" {tlsopt3_32.s tlslib32.s} {{objdump -dr tlsopt3_32.d}} "tlsopt3_32"} {"TLS32 opt 4" "-melf32ppc" "" "-a32" {tlsopt4_32.s tlslib32.s} {{objdump -dr tlsopt4_32.d}} - "tlsopt4_32"} - {"TLS32 DLL" "-shared -melf32ppc --version-script tlsdll.ver" "" "-a32" {tlsdll_32.s} + "tlsopt4_32"} + {"TLS32 DLL" "-shared -melf32ppc --version-script tlsdll.ver" "" + "-a32" {tlsdll_32.s} {} "tlsdll32.so"} {"TLS32 opt 5" "-melf32ppc -shared --gc-sections --secure-plt tmpdir/tlsdll32.so" "" "-a32" {tlsopt5_32.s} {{objdump -dr tlsopt5_32.d}} - "tlsopt5_32"} + "tlsopt5_32"} {"Shared library with global symbol" "-shared -melf32ppc" "" "-a32" {sdalib.s} {} "sdalib.so"} {"Dynamic application with SDA" "-melf32ppc tmpdir/sdalib.so" "" "-a32" {sdadyn.s} {{objdump -R sdadyn.d}} "sdadyn"} {"relaxing" "-melf32ppc --relax -Ttext=0 --defsym far=0x80001234 --defsym near=0x00004320" "" "-a32" "relax.s" {{objdump -dr relax.d}} - "relax"} + "relax"} {"relocatable relaxing" "-melf32ppc -r --relax" "" "-a32" "relax.s" {{objdump -dr relaxr.d}} - "relax"} + "rrelax"} } set ppc64elftests { + {"TLS static exec (markers)" "-melf64ppc" "" + "-a64 --defsym TLSMARK=1" {tls.s tlslib.s} + {{objdump -dr tls.d} {objdump -sj.got tls.g} {objdump -sj.tdata tls.t}} + "tlsm"} {"TLS static exec" "-melf64ppc" "" "-a64" {tls.s tlslib.s} {{objdump -dr tls.d} {objdump -sj.got tls.g} {objdump -sj.tdata tls.t}} - "tls"} + "tls"} {"TLS helper shared library" "-shared -melf64ppc tmpdir/tlslib.o" "" "" {} {} "libtlslib.so"} {"TLS helper old shared lib" "-shared -melf64ppc" "" "-a64" {oldtlslib.s} @@ -167,53 +177,53 @@ set ppc64elftests { {"TLS dynamic exec" "-melf64ppc --no-ld-generated-unwind-info --hash-style=sysv tmpdir/tls.o tmpdir/libtlslib.so" "" "" {} {{readelf -WSsrl tlsexe.r} {objdump -dr tlsexe.d} {objdump -sj.got tlsexe.g} {objdump -sj.tdata tlsexe.t}} - "tlsexe"} + "tlsexe"} {"TLS dynamic old" "-melf64ppc --no-ld-generated-unwind-info --hash-style=sysv tmpdir/tls.o tmpdir/liboldlib.so" "" "" {} {{readelf -WSsrl tlsexe.r} {objdump -dr tlsexe.d} {objdump -sj.got tlsexe.g} {objdump -sj.tdata tlsexe.t}} - "tlsexeold"} + "tlsexeold"} {"TLS shared" "-shared -melf64ppc --no-ld-generated-unwind-info --hash-style=sysv tmpdir/tls.o" "" "" {} {{readelf -WSsrl tlsso.r} {objdump -dr tlsso.d} {objdump -sj.got tlsso.g} {objdump -sj.tdata tlsso.t}} - "tls.so"} + "tls.so"} {"TLSTOC static exec" "-melf64ppc tmpdir/tlslib.o " "" "-a64" {tlstoc.s} {{objdump -dr tlstoc.d} {objdump -sj.got tlstoc.g} {objdump -sj.tdata tlstoc.t}} - "tlstoc"} + "tlstoc"} {"TLSTOC dynamic exec" "-melf64ppc --no-ld-generated-unwind-info --hash-style=sysv tmpdir/tlstoc.o tmpdir/libtlslib.so" "" "" {} {{readelf -WSsrl tlsexetoc.r} {objdump -dr tlsexetoc.d} {objdump -sj.got tlsexetoc.g} {objdump -sj.tdata tlsexetoc.t}} - "tlsexetoc"} + "tlsexetoc"} {"TLSTOC dynamic old" "-melf64ppc --no-ld-generated-unwind-info --hash-style=sysv tmpdir/tlstoc.o tmpdir/liboldlib.so" "" "" {} {{readelf -WSsrl tlsexetoc.r} {objdump -dr tlsexetoc.d} {objdump -sj.got tlsexetoc.g} {objdump -sj.tdata tlsexetoc.t}} - "tlsexetocold"} + "tlsexetocold"} {"TLSTOC shared" "-shared -melf64ppc --no-ld-generated-unwind-info --hash-style=sysv tmpdir/tlstoc.o" "" "" {} {{readelf -WSsrl tlstocso.r} {objdump -dr tlstocso.d} {objdump -sj.got tlstocso.g} {objdump -sj.tdata tlstocso.t}} - "tlstoc.so"} + "tlstoc.so"} {"TLS markers" "-melf64ppc" "" "-a64" {tlsmark.s tlslib.s} {{objdump -dr tlsmark.d}} - "tlsmark"} + "tlsmark"} {"TLS opt 1" "-melf64ppc" "" "-a64" {tlsopt1.s tlslib.s} {{objdump -dr tlsopt1.d}} - "tlsopt1"} + "tlsopt1"} {"TLS opt 2" "-melf64ppc" "" "-a64" {tlsopt2.s tlslib.s} {{objdump -dr tlsopt2.d}} - "tlsopt2"} + "tlsopt2"} {"TLS opt 3" "-melf64ppc" "" "-a64" {tlsopt3.s tlslib.s} {{objdump -dr tlsopt3.d}} - "tlsopt3"} + "tlsopt3"} {"TLS opt 4" "-melf64ppc" "" "-a64" {tlsopt4.s tlslib.s} {{objdump -dr tlsopt4.d}} - "tlsopt4"} + "tlsopt4"} {"TLS DLL" "-shared -melf64ppc --version-script tlsdll.ver" "" "-a64" {tlsdll.s} {} "tlsdll.so"} {"TLS opt 5" "-melf64ppc -shared --gc-sections --no-plt-localentry tmpdir/tlsdll.so" "" "-a64" {tlsopt5.s} {{objdump -dr tlsopt5.d} {readelf -wf tlsopt5.wf}} - "tlsopt5"} + "tlsopt5"} {"sym@tocbase" "-shared -melf64ppc" "" "-a64" {symtocbase-1.s symtocbase-2.s} {{objdump -dj.data symtocbase.d}} "symtocbase.so"} {"TOC opt" "-melf64ppc" "" "-a64" {tocopt.s} -- cgit v1.1