Handle aliases to tls variables in all architectures, not just x86.
authorRafael Espindola <rafael.espindola@gmail.com>
Sat, 23 Jun 2012 00:30:03 +0000 (00:30 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Sat, 23 Jun 2012 00:30:03 +0000 (00:30 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@159058 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/TargetMachine.cpp
lib/Target/X86/X86ISelLowering.cpp
test/CodeGen/Mips/tls-alias.ll [new file with mode: 0644]

index b9b2526876fda96f9e9a1613d28a592d13b7d9c1..6cdab5a266ac8c47d43dbfe0f23562da3ac9590b 100644 (file)
@@ -11,7 +11,9 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "llvm/GlobalAlias.h"
 #include "llvm/GlobalValue.h"
+#include "llvm/GlobalVariable.h"
 #include "llvm/MC/MCAsmInfo.h"
 #include "llvm/MC/MCCodeGenInfo.h"
 #include "llvm/Target/TargetMachine.h"
@@ -76,11 +78,17 @@ CodeModel::Model TargetMachine::getCodeModel() const {
 }
 
 TLSModel::Model TargetMachine::getTLSModel(const GlobalValue *GV) const {
-  bool isLocal = GV->hasLocalLinkage();
-  bool isDeclaration = GV->isDeclaration();
+  // If GV is an alias then use the aliasee for determining
+  // thread-localness.
+  if (const GlobalAlias *GA = dyn_cast<GlobalAlias>(GV))
+    GV = GA->resolveAliasedGlobal(false);
+  const GlobalVariable *Var = cast<GlobalVariable>(GV);
+
+  bool isLocal = Var->hasLocalLinkage();
+  bool isDeclaration = Var->isDeclaration();
   // FIXME: what should we do for protected and internal visibility?
   // For variables, is internal different from hidden?
-  bool isHidden = GV->hasHiddenVisibility();
+  bool isHidden = Var->hasHiddenVisibility();
 
   if (getRelocationModel() == Reloc::PIC_ &&
       !Options.PositionIndependentExecutable) {
index 2576821d39f35a4b1aa3f9c5c93686c6eb73dfcc..4426f300d56ae7a7b792f2726ba6ad557b84c8eb 100644 (file)
@@ -7419,11 +7419,6 @@ X86TargetLowering::LowerGlobalTLSAddress(SDValue Op, SelectionDAG &DAG) const {
   const GlobalValue *GV = GA->getGlobal();
 
   if (Subtarget->isTargetELF()) {
-    // If GV is an alias then use the aliasee for determining
-    // thread-localness.
-    if (const GlobalAlias *GA = dyn_cast<GlobalAlias>(GV))
-      GV = GA->resolveAliasedGlobal(false);
-
     TLSModel::Model model = getTargetMachine().getTLSModel(GV);
 
     switch (model) {
diff --git a/test/CodeGen/Mips/tls-alias.ll b/test/CodeGen/Mips/tls-alias.ll
new file mode 100644 (file)
index 0000000..d681091
--- /dev/null
@@ -0,0 +1,10 @@
+; RUN: llc -march=mipsel -relocation-model=pic < %s | FileCheck %s
+
+@foo = thread_local global i32 42
+@bar = hidden alias i32* @foo
+
+define i32* @zed() {
+; CHECK: __tls_get_addr
+; CHECK-NEXT: %tlsgd(bar)
+       ret i32* @bar
+}