Implement Thread Local Storage (TLS) in CBackend.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@35951 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/CBackend/CBackend.cpp b/lib/Target/CBackend/CBackend.cpp
index f4852bf..9f64bd1 100644
--- a/lib/Target/CBackend/CBackend.cpp
+++ b/lib/Target/CBackend/CBackend.cpp
@@ -1505,22 +1505,23 @@
     Out << "\n/* External Global Variable Declarations */\n";
     for (Module::global_iterator I = M.global_begin(), E = M.global_end();
          I != E; ++I) {
-      if (I->hasExternalLinkage()) {
+
+      if (I->hasExternalLinkage() || I->hasExternalWeakLinkage())
         Out << "extern ";
-        printType(Out, I->getType()->getElementType(), false, 
-                  GetValueName(I));
-        Out << ";\n";
-      } else if (I->hasDLLImportLinkage()) {
+      else if (I->hasDLLImportLinkage())
         Out << "__declspec(dllimport) ";
-        printType(Out, I->getType()->getElementType(), false, 
-                  GetValueName(I));
-        Out << ";\n";        
-      } else if (I->hasExternalWeakLinkage()) {
-        Out << "extern ";
-        printType(Out, I->getType()->getElementType(), false,
-                  GetValueName(I));
-        Out << " __EXTERNAL_WEAK__ ;\n";
-      }
+      else
+        continue; // Internal Global
+
+      // Thread Local Storage
+      if (I->isThreadLocal())
+        Out << "__thread ";
+
+      printType(Out, I->getType()->getElementType(), false, GetValueName(I));
+
+      if (I->hasExternalWeakLinkage())
+         Out << " __EXTERNAL_WEAK__";
+      Out << ";\n";
     }
   }
 
@@ -1563,11 +1564,16 @@
         // Ignore special globals, such as debug info.
         if (getGlobalVariableClass(I))
           continue;
-        
+
         if (I->hasInternalLinkage())
           Out << "static ";
         else
           Out << "extern ";
+
+        // Thread Local Storage
+        if (I->isThreadLocal())
+          Out << "__thread ";
+
         printType(Out, I->getType()->getElementType(), false, 
                   GetValueName(I));
 
@@ -1592,14 +1598,18 @@
         // Ignore special globals, such as debug info.
         if (getGlobalVariableClass(I))
           continue;
-        
+
         if (I->hasInternalLinkage())
           Out << "static ";
         else if (I->hasDLLImportLinkage())
           Out << "__declspec(dllimport) ";
         else if (I->hasDLLExportLinkage())
           Out << "__declspec(dllexport) ";
-            
+
+        // Thread Local Storage
+        if (I->isThreadLocal())
+          Out << "__thread ";
+
         printType(Out, I->getType()->getElementType(), false, 
                   GetValueName(I));
         if (I->hasLinkOnceLinkage())