[PATCH] D53905: [ELF] Refactor TLS layout TargetInfo config. NFC.

Ryan Prichard via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 30 15:18:22 PDT 2018


rprichard created this revision.
Herald added subscribers: llvm-commits, jsji, PkmX, atanasyan, fedor.sergeev, kbarton, kristof.beyls, arichardson, javed.absar, nemanjai, sdardis, emaste, jyknight.
Herald added a reviewer: espindola.

There are really three different kinds of TLS layouts:

- A fixed TLS-to-TP offset. On architectures like PowerPC, MIPS, and RISC-V, the thread pointer points to a fixed offset from the start of the executable's TLS segment. The offset is 0x7000 for PowerPC and MIPS, which allows a signed 16-bit offset to reach 0x1000 of per-thread implementation data and 0xf000 of the application's TLS segment. The size and layout of the TCB isn't relevant to the static linker and might not be known.
- A fixed TCB size. This is the format documented as "variant 1" in Ulrich Drepper's TLS spec. The thread pointer points to a 2-word TCB followed by the executable's TLS segment. The first word is always the DTV pointer. Used on ARM. The thread pointer must be aligned to the TLS segment's alignment, possibly creating alignment padding.
- Variant 2. This format predates variant 1 and is also documented in Drepper's TLS spec. It allocates the executable's TLS segment before the thread pointer, apparently for backwards-compatibility. It's used on x86 and SPARC.

Make the three layout types more explicit with an enum type. Change the
default to FixedOffset because it's the simplest layout.

Factor out an lld::elf::getTlsTpOffset() function for use in a
follow-up patch for Android.

Make the TlsTpOffset field signed and use a negative -0x7000 offset for
PPC64, so that the TlsTpOffset value is consistent with the value
returned by getTlsTpOffset.


Repository:
  rLLD LLVM Linker

https://reviews.llvm.org/D53905

Files:
  ELF/Arch/AArch64.cpp
  ELF/Arch/ARM.cpp
  ELF/Arch/PPC64.cpp
  ELF/Arch/X86.cpp
  ELF/Arch/X86_64.cpp
  ELF/InputSection.cpp
  ELF/InputSection.h
  ELF/Target.h

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D53905.171823.patch
Type: text/x-patch
Size: 6105 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181030/ab91085f/attachment.bin>


More information about the llvm-commits mailing list