[lld] [ELF] Handle and optimize x86-64 PLTOFF64 TLS sequences (PR #216263)

Jessica Clarke via llvm-commits llvm-commits at lists.llvm.org
Mon Aug 17 10:00:37 PDT 2026


================
@@ -0,0 +1,100 @@
+# REQUIRES: x86
+## Test dynamic TLS sequences that call __tls_get_addr indirectly through
+## R_X86_64_PLTOFF64 instead of a direct call.
+
+# RUN: rm -rf %t && split-file %s %t && cd %t
+# RUN: llvm-mc -filetype=obj -triple=x86_64 a.s -o a.o
+# RUN: llvm-mc -filetype=obj -triple=x86_64 b.s -o b.o
+# RUN: ld.lld -shared b.o -soname=b.so -o b.so
+
+# RUN: ld.lld a.o b.so -o out
+# RUN: llvm-readelf -Sr out | FileCheck %s --check-prefix=SEC
+# RUN: llvm-objdump -d --no-show-raw-insn --no-print-imm-hex out | FileCheck %s --check-prefix=EXE
+
+# RUN: ld.lld -shared a.o b.so -o out.so
+# RUN: llvm-readelf -r out.so | FileCheck %s --check-prefix=SDYN
+# RUN: llvm-objdump -d --no-show-raw-insn --no-print-imm-hex out.so | FileCheck %s --check-prefix=SHARED
+
+# SEC:      .got PROGBITS 0000000000202418
+# SEC:      Relocation section '.rela.dyn' {{.*}} contains 1 entries:
+# SEC:      0000000000202418 {{.*}} R_X86_64_TPOFF64 {{.*}} y + 0
+
+## The TLS block is 15 bytes. x1 is at DTPOFF 7 and TPOFF -8, and x2 at DTPOFF 11
+## and TPOFF -4. Each optimized sequence is padded with a nop to the original 22 bytes.
+# EXE-LABEL: <_start>:
+# EXE:         movq %fs:0, %rax
+# EXE-NEXT:    leaq -8(%rax), %rax
+# EXE-NEXT:    nopw (%rax,%rax)
+
+## y is preemptible. Its GD sequence is optimized to IE.
+# EXE-NEXT:    movq %fs:0, %rax
+# EXE-NEXT:    addq 4331(%rip), %rax # 0x202418
+# EXE-NEXT:    nopw (%rax,%rax)
+
+# EXE-NEXT:    nopw %cs:(%rax,%rax)
+# EXE-NEXT:    movq %fs:0, %rax
+# EXE-NEXT:    leaq -8(%rax), %rcx
+# EXE-NEXT:    leaq -4(%rax), %rdx
+
+# SDYN:      Relocation section '.rela.dyn' {{.*}} contains 4 entries:
+# SDYN:      00000000000024f0 {{.*}} R_X86_64_DTPMOD64 0
+# SDYN-NEXT: 0000000000002500 {{.*}} R_X86_64_DTPMOD64 0
+# SDYN-NEXT: 0000000000002510 {{.*}} R_X86_64_DTPMOD64 {{.*}} y + 0
+# SDYN-NEXT: 0000000000002518 {{.*}} R_X86_64_DTPOFF64 {{.*}} y + 0
+# SDYN:      Relocation section '.rela.plt' {{.*}} contains 1 entries:
+# SDYN:      {{.*}} R_X86_64_JUMP_SLOT {{.*}} __tls_get_addr + 0
+
+# SHARED-LABEL: <_start>:
+# SHARED:        leaq 4458(%rip), %rdi # 0x2500
----------------
jrtc27 wrote:

As above for matching the instruction address for RIP-relative offsets

https://github.com/llvm/llvm-project/pull/216263


More information about the llvm-commits mailing list