[ELF][MIPS] Support R_MIPS_TLS_DTPREL32 / R_MIPS_TLS_TPREL32 relocations calculation
authorSimon Atanasyan <simon@atanasyan.com>
Mon, 5 Sep 2016 15:42:39 +0000 (15:42 +0000)
committerSimon Atanasyan <simon@atanasyan.com>
Mon, 5 Sep 2016 15:42:39 +0000 (15:42 +0000)
llvm-svn: 280665

lld/ELF/Target.cpp
lld/test/ELF/mips-tls-static.s

index 165647f..b0ecced 100644 (file)
@@ -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:
index dbfd769..a641a8e 100644 (file)
@@ -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