aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2021-05-05 11:47:47 +0100
committergingerBill <bill@gingerbill.org>2021-05-05 11:47:47 +0100
commit579b317be8d136df7af134b2ad441fe16684fdbb (patch)
treeb4c23f5c35c2c631ee4850fe0a9ba8ad33cca9c3
parent08360e2337ee2b4b581b2e52bcef7566e642c489 (diff)
Mark external thread local globals
-rw-r--r--src/llvm_backend.cpp19
-rw-r--r--src/main.cpp3
2 files changed, 22 insertions, 0 deletions
diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp
index 78a75cf5b..c4d704cc6 100644
--- a/src/llvm_backend.cpp
+++ b/src/llvm_backend.cpp
@@ -5773,6 +5773,25 @@ lbValue lb_find_value_from_entity(lbModule *m, Entity *e) {
g.type = alloc_type_pointer(e->type);
LLVMSetLinkage(g.value, LLVMExternalLinkage);
+ if (e->Variable.thread_local_model != "") {
+ LLVMSetThreadLocal(g.value, true);
+
+ String m = e->Variable.thread_local_model;
+ LLVMThreadLocalMode mode = LLVMGeneralDynamicTLSModel;
+ if (m == "default") {
+ mode = LLVMGeneralDynamicTLSModel;
+ } else if (m == "localdynamic") {
+ mode = LLVMLocalDynamicTLSModel;
+ } else if (m == "initialexec") {
+ mode = LLVMInitialExecTLSModel;
+ } else if (m == "localexec") {
+ mode = LLVMLocalExecTLSModel;
+ } else {
+ GB_PANIC("Unhandled thread local mode %.*s", LIT(m));
+ }
+ LLVMSetThreadLocalMode(g.value, mode);
+ }
+
lb_add_entity(m, e, g);
lb_add_member(m, name, g);
return g;
diff --git a/src/main.cpp b/src/main.cpp
index 756fcc3ac..8f13b28f6 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -2176,6 +2176,9 @@ int main(int arg_count, char const **arg_ptr) {
case BuildMode_DynamicLibrary:
i32 result = linker_stage(&gen);
if (result != 0) {
+ if (build_context.show_timings) {
+ show_timings(&checker, timings);
+ }
return 1;
}
break;