Use the same tls section name as msvc.
authorRafael Espindola <rafael.espindola@gmail.com>
Wed, 27 Nov 2013 15:52:11 +0000 (15:52 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Wed, 27 Nov 2013 15:52:11 +0000 (15:52 +0000)
We currently error in clang with:
"error: thread-local storage is unsupported for the current target", but we
can start to get the llvm level ready.

When compiling

template<typename T>
struct foo {
  static __declspec(thread) int bar;
};
template<typename T>
__declspec(therad) int foo<T>::bar;
template struct foo<int>;

msvc produces

SECTION HEADER #3
   .tls$ name
       0 physical address
       0 virtual address
       4 size of raw data
     12F file pointer to raw data (0000012F to 00000132)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
C0301040 flags
         Initialized Data
         COMDAT; sym= "public: static int foo<int>::bar" (?bar@?$foo@H@@2HA)
         4 byte align
         Read Write

gcc produces a ".data$__emutls_v.<symbol>" for the testcase with
__declspec(thread) replaced with thread_local.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@195849 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/TargetLoweringObjectFileImpl.cpp
test/MC/COFF/weak-symbol.ll

index 229ccfae28a5a3db20b1dedae3e07ed01cc1a356..25d8cdc43994cd4624b091951aabcc2d03819b0b 100644 (file)
@@ -744,7 +744,7 @@ static const char *getCOFFSectionNameForUniqueGlobal(SectionKind Kind) {
   if (Kind.isBSS ())
     return ".bss";
   if (Kind.isThreadLocal())
-    return ".tls";
+    return ".tls$";
   if (Kind.isWriteable())
     return ".data";
   return ".rdata";
index f23063e59c92c5b8a99c9a93641d7b30e63e6fa3..c06692ed908e771edd84aed02b9583e755edd6da 100644 (file)
@@ -36,3 +36,13 @@ define weak void @f() section ".sect" {
 ; X64: .globl a\r
 ; X64: .zero 12\r
 @a = weak unnamed_addr constant { i32, i32, i32 } { i32 0, i32 0, i32 0}, section ".data"\r
+\r
+; X86:  .section        .tls$,"w",discard,_b\r
+; X86:  .globl  _b\r
+; X86:  .long   0\r
+;\r
+; X64:  .section        .tls$,"w",discard,b\r
+; X64:  .globl  b\r
+; X64:  .long   0\r
+\r
+@b = weak_odr thread_local global i32 0, align 4\r