[llvm-commits] [llvm] r120121 - in /llvm/trunk: lib/MC/ELFObjectWriter.cpp lib/MC/MCParser/ELFAsmParser.cpp test/MC/ELF/relocation-386.s

Rafael Espindola rafael.espindola at gmail.com
Wed Nov 24 13:57:39 PST 2010


Author: rafael
Date: Wed Nov 24 15:57:39 2010
New Revision: 120121

URL: http://llvm.org/viewvc/llvm-project?rev=120121&view=rev
Log:
Behave a bit more like gnu as and use the symbol (instead of the section)
for any relocation to a symbol defined in a tls section.

Modified:
    llvm/trunk/lib/MC/ELFObjectWriter.cpp
    llvm/trunk/lib/MC/MCParser/ELFAsmParser.cpp
    llvm/trunk/test/MC/ELF/relocation-386.s

Modified: llvm/trunk/lib/MC/ELFObjectWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/ELFObjectWriter.cpp?rev=120121&r1=120120&r2=120121&view=diff
==============================================================================
--- llvm/trunk/lib/MC/ELFObjectWriter.cpp (original)
+++ llvm/trunk/lib/MC/ELFObjectWriter.cpp Wed Nov 24 15:57:39 2010
@@ -718,10 +718,17 @@
 
   const MCSectionELF &Section =
     static_cast<const MCSectionELF&>(ASymbol.getSection());
+  const SectionKind secKind = Section.getKind();
 
-  if (Section.getKind().isBSS())
+  if (secKind.isBSS())
     return NULL;
 
+  if (secKind.isThreadLocal()) {
+    if (Renamed)
+      return Renamed;
+    return &Symbol;
+  }
+
   MCSymbolRefExpr::VariantKind Kind = Target.getSymA()->getKind();
   const MCSectionELF &Sec2 =
     static_cast<const MCSectionELF&>(F.getParent()->getSection());
@@ -729,8 +736,7 @@
   if (&Sec2 != &Section &&
       (Kind == MCSymbolRefExpr::VK_PLT ||
        Kind == MCSymbolRefExpr::VK_GOTPCREL ||
-       Kind == MCSymbolRefExpr::VK_GOTOFF ||
-       Kind == MCSymbolRefExpr::VK_NTPOFF)) {
+       Kind == MCSymbolRefExpr::VK_GOTOFF)) {
     if (Renamed)
       return Renamed;
     return &Symbol;

Modified: llvm/trunk/lib/MC/MCParser/ELFAsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/ELFAsmParser.cpp?rev=120121&r1=120120&r2=120121&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCParser/ELFAsmParser.cpp (original)
+++ llvm/trunk/lib/MC/MCParser/ELFAsmParser.cpp Wed Nov 24 15:57:39 2010
@@ -193,6 +193,14 @@
   return false;
 }
 
+static SectionKind computeSectionKind(unsigned Flags) {
+  if (Flags & MCSectionELF::SHF_EXECINSTR)
+    return SectionKind::getText();
+  if (Flags & MCSectionELF::SHF_TLS)
+    return SectionKind::getThreadData();
+  return SectionKind::getDataRel();
+}
+
 // FIXME: This is a work in progress.
 bool ELFAsmParser::ParseDirectiveSection(StringRef, SMLoc) {
   StringRef SectionName;
@@ -322,9 +330,7 @@
       return TokError("unknown section type");
   }
 
-  SectionKind Kind = (Flags & MCSectionELF::SHF_EXECINSTR)
-                     ? SectionKind::getText()
-                     : SectionKind::getDataRel();
+  SectionKind Kind = computeSectionKind(Flags);
   getStreamer().SwitchSection(getContext().getELFSection(SectionName, Type,
                                                          Flags, Kind, Size,
                                                          GroupName));

Modified: llvm/trunk/test/MC/ELF/relocation-386.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/relocation-386.s?rev=120121&r1=120120&r2=120121&view=diff
==============================================================================
--- llvm/trunk/test/MC/ELF/relocation-386.s (original)
+++ llvm/trunk/test/MC/ELF/relocation-386.s Wed Nov 24 15:57:39 2010
@@ -114,12 +114,66 @@
 // CHECK-NEXT:  ('r_sym', 0x00000000)
 // CHECK-NEXT:  ('r_type', 0x00000002)
 // CHECK-NEXT: ),
-// Relocation 13 (zed at NTPOFF) is of type R_386_TLS_LE and uses the symbol
+// Relocation 13 (zed at GOT) is of type R_386_GOT32 and uses the symbol
 // CHECK-NEXT: # Relocation 0x0000000d
 // CHECK-NEXT: (('r_offset', 0x0000004e)
 // CHECK-NEXT:  ('r_sym', 0x00000004)
+// CHECK-NEXT:  ('r_type', 0x00000003)
+// CHECK-NEXT: ),
+// Relocation 14 (zed at GOTOFF) is of type R_386_GOTOFF and uses the symbol
+// CHECK-NEXT: # Relocation 0x0000000e
+// CHECK-NEXT: (('r_offset', 0x00000054)
+// CHECK-NEXT:  ('r_sym', 0x00000004)
+// CHECK-NEXT:  ('r_type', 0x00000009)
+// CHECK-NEXT: ),
+// Relocation 15 (zed at INDNTPOFF) is of type R_386_TLS_IE and uses the symbol
+// CHECK-NEXT: # Relocation 0x0000000f
+// CHECK-NEXT: (('r_offset', 0x0000005a)
+// CHECK-NEXT:  ('r_sym', 0x00000004)
+// CHECK-NEXT:  ('r_type', 0x0000000f)
+// CHECK-NEXT: ),
+// Relocation 16 (zed at NTPOFF) is of type R_386_TLS_LE and uses the symbol
+// CHECK-NEXT: # Relocation 0x00000010
+// CHECK-NEXT: (('r_offset', 0x00000060)
+// CHECK-NEXT:  ('r_sym', 0x00000004)
 // CHECK-NEXT:  ('r_type', 0x00000011)
 // CHECK-NEXT: ),
+// Relocation 17 (zed at GOTNTPOFF) is of type R_386_TLS_GOTIE and uses the symbol
+// CHECK-NEXT: # Relocation 0x00000011
+// CHECK-NEXT: (('r_offset', 0x00000066)
+// CHECK-NEXT:  ('r_sym', 0x00000004)
+// CHECK-NEXT:  ('r_type', 0x00000010)
+// CHECK-NEXT: ),
+// Relocation 18 (zed at PLT) is of type R_386_PLT32 and uses the symbol
+// CHECK-NEXT: # Relocation 0x00000012
+// CHECK-NEXT: (('r_offset', 0x0000006b)
+// CHECK-NEXT:  ('r_sym', 0x00000004)
+// CHECK-NEXT:  ('r_type', 0x00000004)
+// CHECK-NEXT: ),
+// Relocation 19 (zed at TLSGD) is of type R_386_TLS_GD and uses the symbol
+// CHECK-NEXT: # Relocation 0x00000013
+// CHECK-NEXT: (('r_offset', 0x00000071)
+// CHECK-NEXT:  ('r_sym', 0x00000004)
+// CHECK-NEXT:  ('r_type', 0x00000012)
+// CHECK-NEXT: ),
+// Relocation 20 (zed at TLSLDM) is of type R_386_TLS_LDM and uses the symbol
+// CHECK-NEXT: # Relocation 0x00000014
+// CHECK-NEXT: (('r_offset', 0x00000077)
+// CHECK-NEXT:  ('r_sym', 0x00000004)
+// CHECK-NEXT:  ('r_type', 0x00000013)
+// CHECK-NEXT: ),
+// Relocation 21 (zed at TPOFF) is of type R_386_TLS_LE_32 and uses the symbol
+// CHECK-NEXT:# Relocation 0x00000015
+// CHECK-NEXT: (('r_offset', 0x0000007d)
+// CHECK-NEXT:  ('r_sym', 0x00000004)
+// CHECK-NEXT:  ('r_type', 0x00000022)
+// CHECK-NEXT: ),
+// Relocation 22 (zed at DTPOFF) is of type R_386_TLS_LDO_32 and uses the symbol
+// CHECK-NEXT: Relocation 0x00000016
+// CHECK-NEXT: (('r_offset', 0x00000083)
+// CHECK-NEXT:  ('r_sym', 0x00000004)
+// CHECK-NEXT:  ('r_type', 0x00000020)
+// CHECK-NEXT: ),
 
         .text
 bar:
@@ -145,7 +199,16 @@
         leal foo at TLSLDM(%ebx), %eax
         leal foo at DTPOFF(%eax), %edx
         calll 4096
+        movl zed at GOT(%eax), %eax
+        movl zed at GOTOFF(%eax), %eax
+        movl zed at INDNTPOFF(%eax), %eax
         movl zed at NTPOFF(%eax), %eax
+        movl zed at GOTNTPOFF(%eax), %eax
+        call zed at PLT
+        movl zed at TLSGD(%eax), %eax
+        movl zed at TLSLDM(%eax), %eax
+        movl zed at TPOFF(%eax), %eax
+        movl zed at DTPOFF(%eax), %eax
 
         .section        zedsec,"awT", at progbits
 zed:





More information about the llvm-commits mailing list