mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-06 12:09:26 +08:00
252dcdf432
ppc64 ld optimises sequences like the following addis 3,13,wot@tprel@ha lwz 3,wot@tprel@l(3) to nop lwz 3,wot@tprel(13) when "wot" is located near enough to the thread pointer. However, the ABI doesn't require that R_PPC64_TPREL16_HA always be on an addis rt,13,imm instruction, and while ld checked for that on the high-part instruction it didn't disable the optimisation on the low-part instruction. This patch fixes that problem, disabling the tprel optimisation globally if high-part instructions don't pass sanity checks. The optimisation is also enabled for ppc32, where before ld.bfd had the code in the wrong place and ld.gold had it in a block only enabled for ppc64. bfd/ * elf32-ppc.c (ppc_elf_check_relocs): Set has_tls_reloc for high part tprel16 relocs. (ppc_elf_tls_optimize): Sanity check high part tprel16 relocs. Clear do_tls_opt on odd instructions. (ppc_elf_relocate_section): Move TPREL16_HA/LO optimisation later. Don't sanity check them here. * elf64-ppc.c (ppc64_elf_check_relocs): Set has_tls_reloc for high part tprel16 relocs. (ppc64_elf_tls_optimize): Sanity check high part tprel16 relocs. Clear do_tls_opt on odd instructions. (ppc64_elf_relocate_section): Don't sanity check TPREL16_HA. ld/ * testsuite/ld-powerpc/tls32.d: Update for TPREL_HA/LO optimisation. * testsuite/ld-powerpc/tlsexe32.d: Likewise. * testsuite/ld-powerpc/tlsldopt32.d: Likewise. * testsuite/ld-powerpc/tlsmark32.d: Likewise. * testsuite/ld-powerpc/tlsopt4_32.d: Likewise. * testsuite/ld-powerpc/tprel.s, * testsuite/ld-powerpc/tprel.d, * testsuite/ld-powerpc/tprel32.d: New tests. * testsuite/ld-powerpc/tprelbad.s, * testsuite/ld-powerpc/tprelbad.d: New test. * testsuite/ld-powerpc/powerpc.exp: Run them. gold/ * powerpc.cc (Target_powerpc): Add tprel_opt_ and accessors. (Target_powerpc::Scan::local): Sanity check tprel high relocs. (Target_powerpc::Scan::global): Likewise. (Target_powerpc::Relocate::relocate): Control tprel optimisation with tprel_opt_ and enable for 32-bit. |
||
---|---|---|
.. | ||
addpcis.d | ||
addpcis.s | ||
aix52.exp | ||
aix-abs-branch-1-32.nd | ||
aix-abs-branch-1-64.nd | ||
aix-abs-branch-1.dd | ||
aix-abs-branch-1.ex | ||
aix-abs-branch-1.im | ||
aix-abs-branch-1.s | ||
aix-abs-reloc-1-32.nd | ||
aix-abs-reloc-1-32.od | ||
aix-abs-reloc-1-64.nd | ||
aix-abs-reloc-1-64.od | ||
aix-abs-reloc-1.ex | ||
aix-abs-reloc-1.im | ||
aix-abs-reloc-1.s | ||
aix-core-sec-1.ex | ||
aix-core-sec-1.hd | ||
aix-core-sec-1.s | ||
aix-core-sec-2.ex | ||
aix-core-sec-2.hd | ||
aix-core-sec-2.s | ||
aix-core-sec-3.ex | ||
aix-core-sec-3.hd | ||
aix-core-sec-3.s | ||
aix-export-1-all-32.dd | ||
aix-export-1-all-64.dd | ||
aix-export-1-full-32.dd | ||
aix-export-1-full-64.dd | ||
aix-export-1a.s | ||
aix-export-1b.s | ||
aix-export-2-32.nd | ||
aix-export-2-64.nd | ||
aix-export-2.s | ||
aix-gc-1-32.dd | ||
aix-gc-1-32.nd | ||
aix-gc-1-64.dd | ||
aix-gc-1-64.nd | ||
aix-gc-1.ex | ||
aix-gc-1.s | ||
aix-glink-1-32.d | ||
aix-glink-1-32.dd | ||
aix-glink-1-64.d | ||
aix-glink-1-64.dd | ||
aix-glink-1.ex | ||
aix-glink-1.s | ||
aix-glink-2-32.dd | ||
aix-glink-2-64.dd | ||
aix-glink-2a.ex | ||
aix-glink-2a.s | ||
aix-glink-2b.s | ||
aix-glink-2c.ex | ||
aix-glink-2c.s | ||
aix-glink-2d.s | ||
aix-glink-3-32.d | ||
aix-glink-3-32.dd | ||
aix-glink-3-64.d | ||
aix-glink-3-64.dd | ||
aix-glink-3.s | ||
aix-glink-3a.s | ||
aix-glink-3b.s | ||
aix-lineno-1.s | ||
aix-lineno-1.txt | ||
aix-lineno-1a-32.dd | ||
aix-lineno-1a-32.nd | ||
aix-lineno-1a-64.dd | ||
aix-lineno-1a-64.nd | ||
aix-lineno-1b-32.dd | ||
aix-lineno-1b-32.nd | ||
aix-lineno-1b-64.dd | ||
aix-lineno-1b-64.nd | ||
aix-no-dup-syms-1-dso-32.dnd | ||
aix-no-dup-syms-1-dso-32.drd | ||
aix-no-dup-syms-1-dso-32.nd | ||
aix-no-dup-syms-1-dso-32.rd | ||
aix-no-dup-syms-1-dso-64.dnd | ||
aix-no-dup-syms-1-dso-64.drd | ||
aix-no-dup-syms-1-dso-64.nd | ||
aix-no-dup-syms-1-dso-64.rd | ||
aix-no-dup-syms-1-rel.nd | ||
aix-no-dup-syms-1-rel.rd | ||
aix-no-dup-syms-1.ex | ||
aix-no-dup-syms-1.im | ||
aix-no-dup-syms-1a.s | ||
aix-no-dup-syms-1b.s | ||
aix-ref-1-32.od | ||
aix-ref-1-64.od | ||
aix-ref-1.s | ||
aix-rel-1.od | ||
aix-rel-1.s | ||
aix-toc-1-32.dd | ||
aix-toc-1-64.dd | ||
aix-toc-1.ex | ||
aix-toc-1a.s | ||
aix-toc-1b.s | ||
aix-weak-1-dso-32.dnd | ||
aix-weak-1-dso-32.hd | ||
aix-weak-1-dso-32.nd | ||
aix-weak-1-dso-64.dnd | ||
aix-weak-1-dso-64.hd | ||
aix-weak-1-dso-64.nd | ||
aix-weak-1-gcdso-32.dnd | ||
aix-weak-1-gcdso-32.hd | ||
aix-weak-1-gcdso-32.nd | ||
aix-weak-1-gcdso-64.dnd | ||
aix-weak-1-gcdso-64.hd | ||
aix-weak-1-gcdso-64.nd | ||
aix-weak-1-rel.hd | ||
aix-weak-1-rel.nd | ||
aix-weak-1.ex | ||
aix-weak-1a.s | ||
aix-weak-1b.s | ||
aix-weak-2a-32.nd | ||
aix-weak-2a-64.nd | ||
aix-weak-2a.ex | ||
aix-weak-2a.s | ||
aix-weak-2b-32.nd | ||
aix-weak-2b-64.nd | ||
aix-weak-2b.s | ||
aix-weak-2c-32.nd | ||
aix-weak-2c-32.od | ||
aix-weak-2c-64.nd | ||
aix-weak-2c-64.od | ||
aix-weak-2c.ex | ||
aix-weak-2c.s | ||
aix-weak-3-32.d | ||
aix-weak-3-32.dd | ||
aix-weak-3-64.d | ||
aix-weak-3-64.dd | ||
aix-weak-3a.ex | ||
aix-weak-3a.s | ||
aix-weak-3b.ex | ||
aix-weak-3b.s | ||
ambiguousv1.d | ||
ambiguousv1b.d | ||
ambiguousv2.d | ||
ambiguousv2b.d | ||
apuinfo1.s | ||
apuinfo2.s | ||
apuinfo-nul1.s | ||
apuinfo-nul.rd | ||
apuinfo-nul.s | ||
apuinfo-vle2.s | ||
apuinfo-vle.rd | ||
apuinfo-vle.s | ||
apuinfo.rd | ||
attr-gnu-4-0.s | ||
attr-gnu-4-1.s | ||
attr-gnu-4-2.s | ||
attr-gnu-4-3.s | ||
attr-gnu-4-00.d | ||
attr-gnu-4-01.d | ||
attr-gnu-4-02.d | ||
attr-gnu-4-03.d | ||
attr-gnu-4-10.d | ||
attr-gnu-4-11.d | ||
attr-gnu-4-12.d | ||
attr-gnu-4-13.d | ||
attr-gnu-4-20.d | ||
attr-gnu-4-21.d | ||
attr-gnu-4-22.d | ||
attr-gnu-4-23.d | ||
attr-gnu-4-31.d | ||
attr-gnu-4-32.d | ||
attr-gnu-4-33.d | ||
attr-gnu-8-1.s | ||
attr-gnu-8-2.s | ||
attr-gnu-8-3.s | ||
attr-gnu-8-11.d | ||
attr-gnu-8-23.d | ||
attr-gnu-8-31.d | ||
attr-gnu-12-1.s | ||
attr-gnu-12-2.s | ||
attr-gnu-12-11.d | ||
attr-gnu-12-21.d | ||
big.s | ||
callstub-1.d | ||
callstub-1.s | ||
callstub-2.d | ||
callstub-2.s | ||
callstub-3.d | ||
callstub-4.d | ||
defsym.d | ||
defsym.s | ||
dotsym1.d | ||
dotsym2.d | ||
dotsym3.d | ||
dotsym4.d | ||
dotsymref.s | ||
elfv2-2a.s | ||
elfv2-2b.s | ||
elfv2-2exe.d | ||
elfv2-2so.d | ||
elfv2.s | ||
elfv2exe.d | ||
elfv2so.d | ||
export-class.exp | ||
ext.d | ||
ext.lnk | ||
ext.s | ||
funref2.s | ||
funref.s | ||
funv1.s | ||
funv2.s | ||
inline-1.d | ||
inline-2.d | ||
inline-3.d | ||
inline-4.d | ||
inline.s | ||
inlinepcrel-1.d | ||
inlinepcrel-2.d | ||
inlinepcrel-3.d | ||
inlinepcrel.s | ||
localgot.d | ||
localgot.s | ||
nodotsym.s | ||
non-contiguous-powerpc64.d | ||
non-contiguous-powerpc.d | ||
non-contiguous-powerpc.ld | ||
non-contiguous-powerpc.s | ||
notoc2.d | ||
notoc2.s | ||
notoc3.d | ||
notoc3.s | ||
notoc3.wf | ||
notoc.d | ||
notoc.s | ||
notoc.wf | ||
oldtlslib.s | ||
pcrelopt.d | ||
pcrelopt.s | ||
pcrelopt.sec | ||
plt1.d | ||
plt1.s | ||
powerpc-32-export-class.rd | ||
powerpc-32-export-class.xd | ||
powerpc-64-export-class.rd | ||
powerpc-64-export-class.xd | ||
powerpc.exp | ||
ppc476-shared2.d | ||
ppc476-shared.d | ||
ppc476-shared.lnk | ||
ppc476-shared.s | ||
pr23937.d | ||
pr23937.s | ||
relax.d | ||
relax.s | ||
relaxr.d | ||
relaxrl.d | ||
relbrlt.d | ||
relbrlt.s | ||
reloc.d | ||
reloc.s | ||
relocsort.d | ||
relocsort.s | ||
sdabase2.d | ||
sdabase2.t | ||
sdabase.d | ||
sdabase.s | ||
sdabase.t | ||
sdadyn.d | ||
sdadyn.s | ||
sdalib.s | ||
startv1.s | ||
startv2.s | ||
symtocbase-1.s | ||
symtocbase-2.s | ||
symtocbase.d | ||
tls32.d | ||
tls32.g | ||
tls32.s | ||
tls32.t | ||
tls32no.d | ||
tls32no.g | ||
tls.d | ||
tls.g | ||
tls.s | ||
tls.t | ||
tlsdesc2.d | ||
tlsdesc2.wf | ||
tlsdesc3.d | ||
tlsdesc3.wf | ||
tlsdesc4.d | ||
tlsdesc4.s | ||
tlsdesc4.wf | ||
tlsdesc.d | ||
tlsdesc.s | ||
tlsdesc.wf | ||
tlsdll_32.s | ||
tlsdll.s | ||
tlsdll.ver | ||
tlsexe32.d | ||
tlsexe32.g | ||
tlsexe32.r | ||
tlsexe32.t | ||
tlsexe32no.d | ||
tlsexe32no.g | ||
tlsexe32no.r | ||
tlsexe.d | ||
tlsexe.g | ||
tlsexe.r | ||
tlsexe.t | ||
tlsexeno.d | ||
tlsexeno.g | ||
tlsexeno.r | ||
tlsexenors.d | ||
tlsexenors.r | ||
tlsexers.d | ||
tlsexers.r | ||
tlsexetoc.d | ||
tlsexetoc.g | ||
tlsexetoc.r | ||
tlsexetoc.t | ||
tlsexetocno.d | ||
tlsexetocno.g | ||
tlsexetocnors.d | ||
tlsexetocrs.d | ||
tlsexetocrs.r | ||
tlsgd.d | ||
tlsgd.s | ||
tlsie.d | ||
tlsie.s | ||
tlsld.d | ||
tlsld.s | ||
tlsldopt32.d | ||
tlsldopt32.s | ||
tlsldopt.d | ||
tlsldopt.s | ||
tlslib32.s | ||
tlslib.s | ||
tlsmark32.d | ||
tlsmark32.s | ||
tlsmark.d | ||
tlsmark.s | ||
tlsno.d | ||
tlsno.g | ||
tlsopt1_32.d | ||
tlsopt1_32.s | ||
tlsopt1.d | ||
tlsopt1.s | ||
tlsopt2_32.d | ||
tlsopt2_32.s | ||
tlsopt2.d | ||
tlsopt2.s | ||
tlsopt3_32.d | ||
tlsopt3_32.s | ||
tlsopt3.d | ||
tlsopt3.s | ||
tlsopt4_32.d | ||
tlsopt4_32.s | ||
tlsopt4.d | ||
tlsopt4.s | ||
tlsopt5_32.d | ||
tlsopt5_32.s | ||
tlsopt5.d | ||
tlsopt5.s | ||
tlsopt5.wf | ||
tlsopt6.d | ||
tlsopt6.wf | ||
tlsso32.d | ||
tlsso32.g | ||
tlsso32.r | ||
tlsso32.t | ||
tlsso.d | ||
tlsso.g | ||
tlsso.r | ||
tlsso.t | ||
tlstoc.d | ||
tlstoc.g | ||
tlstoc.s | ||
tlstoc.t | ||
tlstocno.d | ||
tlstocno.g | ||
tlstocso.d | ||
tlstocso.g | ||
tlstocso.r | ||
tlstocso.t | ||
tocnovar.d | ||
tocnovar.s | ||
tocopt2.d | ||
tocopt2.out | ||
tocopt2.s | ||
tocopt3.d | ||
tocopt3.s | ||
tocopt4.d | ||
tocopt4a.s | ||
tocopt4b.s | ||
tocopt5.d | ||
tocopt5.s | ||
tocopt6-inc.s | ||
tocopt6.d | ||
tocopt6a.s | ||
tocopt6b.s | ||
tocopt6c.s | ||
tocopt7.d | ||
tocopt7.out | ||
tocopt7.s | ||
tocopt8.d | ||
tocopt8.s | ||
tocopt.d | ||
tocopt.out | ||
tocopt.s | ||
tocsave1.s | ||
tocsave1a.d | ||
tocsave1s.d | ||
tocsave2.s | ||
tocsave2a.d | ||
tocsave2s.d | ||
tocsavelib.s | ||
tocvar.d | ||
tocvar.s | ||
tprel32.d | ||
tprel.d | ||
tprel.s | ||
tprelbad.d | ||
tprelbad.s | ||
vle-multiseg-1.d | ||
vle-multiseg-1.ld | ||
vle-multiseg-2.d | ||
vle-multiseg-2.ld | ||
vle-multiseg-3.d | ||
vle-multiseg-3.ld | ||
vle-multiseg-4.d | ||
vle-multiseg-4.ld | ||
vle-multiseg-5.d | ||
vle-multiseg-5.ld | ||
vle-multiseg-6.d | ||
vle-multiseg-6.ld | ||
vle-multiseg-6a.s | ||
vle-multiseg-6b.s | ||
vle-multiseg-6c.s | ||
vle-multiseg-6d.s | ||
vle-multiseg.s | ||
vle-reloc-1.d | ||
vle-reloc-1.s | ||
vle-reloc-2.d | ||
vle-reloc-2.s | ||
vle-reloc-3.d | ||
vle-reloc-3.s | ||
vle-reloc-def-1.s | ||
vle-reloc-def-2.s | ||
vle-reloc-def-3.s | ||
vle.ld | ||
vxworks1-lib.dd | ||
vxworks1-lib.nd | ||
vxworks1-lib.rd | ||
vxworks1-lib.s | ||
vxworks1-lib.sd | ||
vxworks1-lib.td | ||
vxworks1-static.d | ||
vxworks1.dd | ||
vxworks1.ld | ||
vxworks1.rd | ||
vxworks1.s | ||
vxworks2-static.sd | ||
vxworks2.s | ||
vxworks2.sd | ||
vxworks-relax-2.rd | ||
vxworks-relax-2.s | ||
vxworks-relax.rd | ||
vxworks-relax.s |