diff --git a/lld/ELF/Arch/AArch64.cpp b/lld/ELF/Arch/AArch64.cpp index f85a3f48f218..99b3085852df 100644 --- a/lld/ELF/Arch/AArch64.cpp +++ b/lld/ELF/Arch/AArch64.cpp @@ -156,6 +156,8 @@ RelExpr AArch64::getRelExpr(RelType type, const Symbol &s, case R_AARCH64_PREL32: case R_AARCH64_PREL64: return R_PC; + case R_AARCH64_TLS_DTPREL64: + return R_DTPREL; case R_AARCH64_NONE: return R_NONE; default: @@ -649,6 +651,9 @@ void AArch64::relocate(uint8_t *loc, const Relocation &rel, checkInt(ctx, loc, val, 32, rel); write32(ctx, loc, val); break; + case R_AARCH64_TLS_DTPREL64: + write64(ctx, loc, val); + break; case R_AARCH64_ADD_ABS_LO12_NC: case R_AARCH64_AUTH_GOT_ADD_LO12_NC: write32Imm12(loc, val); diff --git a/lld/test/ELF/aarch64-tls-dtprel.s b/lld/test/ELF/aarch64-tls-dtprel.s new file mode 100644 index 000000000000..edf5566298b2 --- /dev/null +++ b/lld/test/ELF/aarch64-tls-dtprel.s @@ -0,0 +1,23 @@ +# REQUIRES: aarch64 +# RUN: llvm-mc -filetype=obj -triple=aarch64 %s -o %t.o +# RUN: llvm-readobj -r %t.o | FileCheck %s +# RUN: ld.lld %t.o -o %t + +# CHECK: .rela.debug_info { +# CHECK-NEXT: 0x0 R_AARCH64_TLS_DTPREL64 var 0x0 +# CHECK-NEXT: 0x8 R_AARCH64_TLS_DTPREL64 var 0x1 +# CHECK-NEXT: 0x10 R_AARCH64_TLS_DTPREL64 .tdata 0x0 +# CHECK-NEXT: 0x18 R_AARCH64_TLS_DTPREL64 .tdata 0x1 +# CHECK-NEXT: } + +.section .tdata,"awT",@progbits +.skip 8 +.globl var +var: + .word 0 + +.section .debug_info,"",@progbits + .xword %dtprel(var) + .xword %dtprel(var+1) + .xword %dtprel(.tdata) + .xword %dtprel(.tdata+1)