diff options
-rw-r--r-- | lld/ELF/Target.cpp | 10 | ||||
-rw-r--r-- | lld/test/ELF/mips-tls-static.s | 17 |
2 files changed, 23 insertions, 4 deletions
diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp index 165647fea0f..b0ecced3a90 100644 --- a/lld/ELF/Target.cpp +++ b/lld/ELF/Target.cpp @@ -2062,6 +2062,8 @@ uint64_t MipsTargetInfo<ELFT>::getImplicitAddend(const uint8_t *Buf, return 0; case R_MIPS_32: case R_MIPS_GPREL32: + case R_MIPS_TLS_DTPREL32: + case R_MIPS_TLS_TPREL32: return read32<E>(Buf); case R_MIPS_26: // FIXME (simon): If the relocation target symbol is not a PLT entry @@ -2121,15 +2123,19 @@ void MipsTargetInfo<ELFT>::relocateOne(uint8_t *Loc, uint32_t Type, const endianness E = ELFT::TargetEndianness; // Thread pointer and DRP offsets from the start of TLS data area. // https://www.linux-mips.org/wiki/NPTL - if (Type == R_MIPS_TLS_DTPREL_HI16 || Type == R_MIPS_TLS_DTPREL_LO16) + if (Type == R_MIPS_TLS_DTPREL_HI16 || Type == R_MIPS_TLS_DTPREL_LO16 || + Type == R_MIPS_TLS_DTPREL32) Val -= 0x8000; - else if (Type == R_MIPS_TLS_TPREL_HI16 || Type == R_MIPS_TLS_TPREL_LO16) + else if (Type == R_MIPS_TLS_TPREL_HI16 || Type == R_MIPS_TLS_TPREL_LO16 || + Type == R_MIPS_TLS_TPREL32) Val -= 0x7000; if (ELFT::Is64Bits) std::tie(Type, Val) = calculateMips64RelChain(Type, Val); switch (Type) { case R_MIPS_32: case R_MIPS_GPREL32: + case R_MIPS_TLS_DTPREL32: + case R_MIPS_TLS_TPREL32: write32<E>(Loc, Val); break; case R_MIPS_64: diff --git a/lld/test/ELF/mips-tls-static.s b/lld/test/ELF/mips-tls-static.s index dbfd7697b24..a641a8edea9 100644 --- a/lld/test/ELF/mips-tls-static.s +++ b/lld/test/ELF/mips-tls-static.s @@ -3,11 +3,16 @@ # RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux %s -o %t # RUN: ld.lld -static %t -o %t.exe -# RUN: llvm-readobj -d %t.exe | FileCheck %s +# RUN: llvm-objdump -s -t %t.exe | FileCheck %s # REQUIRES: mips -# CHECK: LoadName +# CHECK: Contents of section .data: +# CHECK-NEXT: 40000 00020004 ffff8004 ffff9004 +# +# CHECK: SYMBOL TABLE: +# CHECK: 00020004 .text 00000000 __tls_get_addr +# CHECK: 00000000 g .tdata 00000000 tls1 .text .global __start @@ -21,3 +26,11 @@ __tls_get_addr: .data loc: .word __tls_get_addr + .dtprelword tls1+4 # R_MIPS_TLS_DTPREL32 + .tprelword tls1+4 # R_MIPS_TLS_TPREL32 + + .section .tdata,"awT",%progbits + .global tls1 +tls1: + .word __tls_get_addr + .word 0 |