always respect threadlocal for variables with external linkage

Previously if you had, for example:

extern "c" threadlocal var errno: c_int;

This would turn errno into a normal variable for --single-threaded
builds. However for variables with external linkage, there is an ABI
to uphold.

This is needed to make errno work for DragonFly BSD. See #2381.
This commit is contained in:
Andrew Kelley 2019-05-03 14:39:54 -04:00
parent 8cda4fd73a
commit bd9c629c4c
No known key found for this signature in database
GPG Key ID: 7C5F548F728501A9

View File

@ -6639,7 +6639,7 @@ static void validate_inline_fns(CodeGen *g) {
}
static void set_global_tls(CodeGen *g, ZigVar *var, LLVMValueRef global_value) {
if (var->is_thread_local && !g->is_single_threaded) {
if (var->is_thread_local && (!g->is_single_threaded || var->linkage != VarLinkageInternal)) {
LLVMSetThreadLocalMode(global_value, LLVMGeneralDynamicTLSModel);
}
}