diff options
author | Ulrich Weigand <ulrich.weigand@de.ibm.com> | 2024-02-14 18:26:38 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-14 18:26:38 +0100 |
commit | 6f907733e65d24edad65f763fb14402464bd578b (patch) | |
tree | 55942213eba019b597e731caf7f8b0d9e7d772c8 /llvm/lib/CodeGen/BasicBlockSections.cpp | |
parent | 60596716c2327575fc8ea16eab3321dabc4a706f (diff) | |
download | llvm-6f907733e65d24edad65f763fb14402464bd578b.zip llvm-6f907733e65d24edad65f763fb14402464bd578b.tar.gz llvm-6f907733e65d24edad65f763fb14402464bd578b.tar.bz2 |
[lld/ELF] Avoid unnecessary TPOFF relocations in GOT for -pie (#81739)
With the new SystemZ port we noticed that -pie executables generated
from files containing R_390_TLS_IEENT relocations will have unnecessary
relocations in their GOT:
9e8d8: R_390_TLS_TPOFF *ABS*+0x18
This is caused by the config->isPic conditon in addTpOffsetGotEntry:
static void addTpOffsetGotEntry(Symbol &sym) {
in.got->addEntry(sym);
uint64_t off = sym.getGotOffset();
if (!sym.isPreemptible && !config->isPic) {
in.got->addConstant({R_TPREL, target->symbolicRel, off, 0, &sym});
return;
}
It is correct that we need to retain a TPOFF relocation if the target
symbol is preemptible or if we're building a shared library. But when
building a -pie executable, those values are fixed at link time and
there's no need for any remaining dynamic relocation.
Note that the equivalent MIPS-specific code in MipsGotSection::build
checks for config->shared instead of config->isPic; we should use the
same check here. (Note also that on many other platforms we're not even
using addTpOffsetGotEntry in this case as an IE->LE relaxation is
applied before; we don't have this type of relaxation on SystemZ.)
Diffstat (limited to 'llvm/lib/CodeGen/BasicBlockSections.cpp')
0 files changed, 0 insertions, 0 deletions