Implement DTPOFF.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 28 Oct 2010 14:48:59 +0000 (14:48 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 28 Oct 2010 14:48:59 +0000 (14:48 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@117546 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCExpr.h
lib/MC/ELFObjectWriter.cpp
lib/MC/MCExpr.cpp
test/MC/ELF/relocation-386.s

index e1f27f156cb34f567a7ddff4b533a64a51f35820..272c7c0e07bb96223f6a59a1f32a48c20a39050c 100644 (file)
@@ -139,6 +139,7 @@ public:
     VK_TLSGD,
     VK_TLSLDM,
     VK_TPOFF,
+    VK_DTPOFF,
     VK_ARM_HI16, // The R_ARM_MOVT_ABS relocation (:upper16: in the asm file)
     VK_ARM_LO16, // The R_ARM_MOVW_ABS_NC relocation (:lower16: in the asm file)
     VK_ARM_PLT,  // ARM-style PLT symbol references. i.e., (PLT) instead of @PLT
index 22005022851a2b3fab9e9f80dfbeb8d55afca69e..5cffef03d3ae29c92826f95d24a8374a34f37c0f 100644 (file)
@@ -92,6 +92,7 @@ static bool RelocNeedsGOT(MCSymbolRefExpr::VariantKind Variant) {
   case MCSymbolRefExpr::VK_NTPOFF:
   case MCSymbolRefExpr::VK_GOTNTPOFF:
   case MCSymbolRefExpr::VK_TLSLDM:
+  case MCSymbolRefExpr::VK_DTPOFF:
     return true;
   }
 }
@@ -788,6 +789,9 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm,
         case MCSymbolRefExpr::VK_TLSLDM:
           Type = ELF::R_386_TLS_LDM;
           break;
+        case MCSymbolRefExpr::VK_DTPOFF:
+          Type = ELF::R_386_TLS_LDO_32;
+          break;
         }
         break;
       case FK_Data_2: Type = ELF::R_386_16; break;
index 6ee2520e69a8a763e4be27c13a95d668110b3c81..5780ba9411c0e77d58f24aa7d2522d9154451fdb 100644 (file)
@@ -180,6 +180,7 @@ StringRef MCSymbolRefExpr::getVariantKindName(VariantKind Kind) {
   case VK_TLSGD: return "TLSGD";
   case VK_TLSLDM: return "TLSLDM";
   case VK_TPOFF: return "TPOFF";
+  case VK_DTPOFF: return "DTPOFF";
   case VK_ARM_HI16: return ":upper16:";
   case VK_ARM_LO16: return ":lower16:";
   case VK_ARM_PLT: return "(PLT)";
@@ -201,6 +202,7 @@ MCSymbolRefExpr::getVariantKindForName(StringRef Name) {
     .Case("TLSGD", VK_TLSGD)
     .Case("TLSLDM", VK_TLSLDM)
     .Case("TPOFF", VK_TPOFF)
+    .Case("DTPOFF", VK_DTPOFF)
     .Case("TLVP", VK_TLVP)
     .Default(VK_Invalid);
 }
index 9fb0befb03f858ad4bf01aae4d1d52da7470dff1..c3903236187a539093b45c56c407e6dd4fc77e35 100644 (file)
 // CHECK-NEXT:  ('r_sym', 0x0000000b)
 // CHECK-NEXT:  ('r_type', 0x00000013)
 // CHECK-NEXT: ),
+
+// Relocation 11 (foo@DTPOFF) is of type R_386_TLS_LDO_32
+// CHECK-NEXT: # Relocation 0x0000000b
+// CHECK-NEXT: (('r_offset', 0x00000043)
+// CHECK-NEXT:  ('r_sym', 0x0000000b)
+// CHECK-NEXT:  ('r_type', 0x00000020)
+// CHECK-NEXT: ),
+
         .text
 bar:
        leal    .Lfoo@GOTOFF(%ebx), %eax
@@ -113,6 +121,7 @@ bar2:
         addl foo@NTPOFF(%eax), %eax
         addl foo@GOTNTPOFF(%ebx), %ecx
         leal foo@TLSLDM(%ebx), %eax
+        leal foo@DTPOFF(%eax), %edx
 
         .section       .rodata.str1.16,"aMS",@progbits,1
 .Lfoo: