[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