[all-commits] [llvm/llvm-project] 6f9077: [lld/ELF] Avoid unnecessary TPOFF relocations in G...

Ulrich Weigand via All-commits all-commits at lists.llvm.org
Wed Feb 14 09:26:49 PST 2024


  Branch: refs/heads/main
  Home:   https://github.com/llvm/llvm-project
  Commit: 6f907733e65d24edad65f763fb14402464bd578b
      https://github.com/llvm/llvm-project/commit/6f907733e65d24edad65f763fb14402464bd578b
  Author: Ulrich Weigand <ulrich.weigand at de.ibm.com>
  Date:   2024-02-14 (Wed, 14 Feb 2024)

  Changed paths:
    M lld/ELF/Relocations.cpp
    M lld/test/ELF/systemz-tls-ie.s

  Log Message:
  -----------
  [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.)




More information about the All-commits mailing list