[llvm-commits] [dragonegg] r159193 - in /dragonegg/trunk: src/Backend.cpp test/validator/c/ThreadLocalVariables.c

Hans Wennborg hans at hanshq.net
Tue Jun 26 02:21:09 PDT 2012


Author: hans
Date: Tue Jun 26 04:21:08 2012
New Revision: 159193

URL: http://llvm.org/viewvc/llvm-project?rev=159193&view=rev
Log:
Pass TLS model through to LLVM.

Now that LLVM has a way of representing TLS models in the IR,
let's make use of them.

Added:
    dragonegg/trunk/test/validator/c/ThreadLocalVariables.c
Modified:
    dragonegg/trunk/src/Backend.cpp

Modified: dragonegg/trunk/src/Backend.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/src/Backend.cpp?rev=159193&r1=159192&r2=159193&view=diff
==============================================================================
--- dragonegg/trunk/src/Backend.cpp (original)
+++ dragonegg/trunk/src/Backend.cpp Tue Jun 26 04:21:08 2012
@@ -1034,9 +1034,31 @@
   }
 
   // Set thread local (TLS)
-  if (isa<VAR_DECL>(decl) && DECL_THREAD_LOCAL_P(decl))
+  if (isa<VAR_DECL>(decl) && DECL_THREAD_LOCAL_P(decl)) {
     GV->setThreadLocal(true);
 
+    switch (DECL_TLS_MODEL(decl)) {
+    case TLS_MODEL_NONE:
+      llvm_unreachable("TLS_MODEL_NONE for thread local var is impossible");
+      break;
+    case TLS_MODEL_EMULATED:
+      llvm_unreachable("LLVM does not support TLS_MODEL_EMULATED");
+      break;
+    case TLS_MODEL_GLOBAL_DYNAMIC:
+      GV->setThreadLocalMode(GlobalVariable::GeneralDynamicTLSModel);
+      break;
+    case TLS_MODEL_LOCAL_DYNAMIC:
+      GV->setThreadLocalMode(GlobalVariable::LocalDynamicTLSModel);
+      break;
+    case TLS_MODEL_INITIAL_EXEC:
+      GV->setThreadLocalMode(GlobalVariable::InitialExecTLSModel);
+      break;
+    case TLS_MODEL_LOCAL_EXEC:
+      GV->setThreadLocalMode(GlobalVariable::LocalExecTLSModel);
+      break;
+    }
+  }
+
   // Set the linkage.
   GlobalValue::LinkageTypes Linkage;
 

Added: dragonegg/trunk/test/validator/c/ThreadLocalVariables.c
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/test/validator/c/ThreadLocalVariables.c?rev=159193&view=auto
==============================================================================
--- dragonegg/trunk/test/validator/c/ThreadLocalVariables.c (added)
+++ dragonegg/trunk/test/validator/c/ThreadLocalVariables.c Tue Jun 26 04:21:08 2012
@@ -0,0 +1,13 @@
+// RUN: %dragonegg -fpic -O -S %s -o - | FileCheck %s
+
+__thread __attribute((tls_model("global-dynamic"))) int a;
+__thread __attribute((tls_model("local-dynamic"))) int b;
+__thread __attribute((tls_model("initial-exec"))) int c;
+__thread __attribute((tls_model("local-exec"))) int d;
+__thread int e;
+
+// CHECK: @e = thread_local unnamed_addr global i32 0
+// CHECK: @d = thread_local(localexec) unnamed_addr global i32 0
+// CHECK: @c = thread_local(initialexec) unnamed_addr global i32 0
+// CHECK: @b = thread_local(localdynamic) unnamed_addr global i32 0
+// CHECK: @a = thread_local unnamed_addr global i32 0





More information about the llvm-commits mailing list