[llvm-commits] [llvm] r120076 - in /llvm/trunk: lib/MC/MCELFStreamer.cpp test/MC/ELF/tls.s

Rafael Espindola rafael.espindola at gmail.com
Tue Nov 23 18:19:40 PST 2010


Author: rafael
Date: Tue Nov 23 20:19:40 2010
New Revision: 120076

URL: http://llvm.org/viewvc/llvm-project?rev=120076&view=rev
Log:
If a symbol is used as tls, mark it as tls even if not declare as so. Probably
fixes PR8659.

Modified:
    llvm/trunk/lib/MC/MCELFStreamer.cpp
    llvm/trunk/test/MC/ELF/tls.s

Modified: llvm/trunk/lib/MC/MCELFStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCELFStreamer.cpp?rev=120076&r1=120075&r2=120076&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCELFStreamer.cpp (original)
+++ llvm/trunk/lib/MC/MCELFStreamer.cpp Tue Nov 23 20:19:40 2010
@@ -144,6 +144,8 @@
   virtual void EmitInstToFragment(const MCInst &Inst);
   virtual void EmitInstToData(const MCInst &Inst);
 
+  void fixSymbolsInTLSFixups(const MCExpr *expr);
+
   struct LocalCommon {
     MCSymbolData *SD;
     uint64_t Size;
@@ -450,6 +452,38 @@
   SD.setFlags(ELF_STT_File | ELF_STB_Local | ELF_STV_Default);
 }
 
+void  MCELFStreamer::fixSymbolsInTLSFixups(const MCExpr *expr) {
+  switch (expr->getKind()) {
+  case MCExpr::Target: llvm_unreachable("Can't handle target exprs yet!");
+  case MCExpr::Constant:
+    break;
+
+  case MCExpr::Binary: {
+    const MCBinaryExpr *be = cast<MCBinaryExpr>(expr);
+    fixSymbolsInTLSFixups(be->getLHS());
+    fixSymbolsInTLSFixups(be->getRHS());
+    break;
+  }
+
+  case MCExpr::SymbolRef: {
+    const MCSymbolRefExpr &symRef = *cast<MCSymbolRefExpr>(expr);
+    MCSymbolRefExpr::VariantKind kind = symRef.getKind();
+    if (kind != MCSymbolRefExpr::VK_TLSGD &&
+	kind != MCSymbolRefExpr::VK_TLSLD &&
+	kind != MCSymbolRefExpr::VK_TLSLDM &&
+	kind != MCSymbolRefExpr::VK_ARM_TLSGD)
+      return;
+    MCSymbolData &SD = getAssembler().getOrCreateSymbolData(symRef.getSymbol());
+    SetType(SD, ELF::STT_TLS);
+    break;
+  }
+
+  case MCExpr::Unary:
+    fixSymbolsInTLSFixups(cast<MCUnaryExpr>(expr)->getSubExpr());
+    break;
+  }
+}
+
 void MCELFStreamer::EmitInstToFragment(const MCInst &Inst) {
   MCInstFragment *IF = new MCInstFragment(Inst, getCurrentSectionData());
 
@@ -463,6 +497,9 @@
   getAssembler().getEmitter().EncodeInstruction(Inst, VecOS, Fixups);
   VecOS.flush();
 
+  for (unsigned i = 0, e = Fixups.size(); i != e; ++i)
+    fixSymbolsInTLSFixups(Fixups[i].getValue());
+
   IF->getCode() = Code;
   IF->getFixups() = Fixups;
 }
@@ -476,6 +513,9 @@
   getAssembler().getEmitter().EncodeInstruction(Inst, VecOS, Fixups);
   VecOS.flush();
 
+  for (unsigned i = 0, e = Fixups.size(); i != e; ++i)
+    fixSymbolsInTLSFixups(Fixups[i].getValue());
+
   // Add the fixups and data.
   for (unsigned i = 0, e = Fixups.size(); i != e; ++i) {
     Fixups[i].setOffset(Fixups[i].getOffset() + DF->getContents().size());

Modified: llvm/trunk/test/MC/ELF/tls.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/tls.s?rev=120076&r1=120075&r2=120076&view=diff
==============================================================================
--- llvm/trunk/test/MC/ELF/tls.s (original)
+++ llvm/trunk/test/MC/ELF/tls.s Tue Nov 23 20:19:40 2010
@@ -1,15 +1,27 @@
 // RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | elf-dump  | FileCheck %s
 
-// Test that foobar is of type STT_TLS.
+// Test that foo and foobar is of type STT_TLS.
+
+	leaq	foo at TLSGD(%rip), %rdi
 
 	.section	.zed,"awT", at progbits
 foobar:
 	.long	43
 
-// CHECK:      (('st_name', 0x00000001) # 'foobar'
+// CHECK:      (('st_name', 0x00000005) # 'foobar'
 // CHECK-NEXT:  ('st_bind', 0x00000000)
 // CHECK-NEXT:  ('st_type', 0x00000006)
 // CHECK-NEXT:  ('st_other', 0x00000000)
 // CHECK-NEXT:  ('st_shndx', 0x00000004)
 // CHECK-NEXT:  ('st_value', 0x00000000)
 // CHECK-NEXT:  ('st_size', 0x00000000)
+// CHECK-NEXT: ),
+
+// CHECK:      (('st_name', 0x00000001) # 'foo'
+// CHECK-NEXT:  ('st_bind', 0x00000001)
+// CHECK-NEXT:  ('st_type', 0x00000006)
+// CHECK-NEXT:  ('st_other', 0x00000000)
+// CHECK-NEXT:  ('st_shndx', 0x00000000)
+// CHECK-NEXT:  ('st_value', 0x00000000)
+// CHECK-NEXT:  ('st_size', 0x00000000)
+// CHECK-NEXT: ),





More information about the llvm-commits mailing list