Currently, on Emscripten, dynamic linking is not supported with threads.
This means that if thread-local storage is used, it must be used in a
statically-linked executable. Hence, local-exec is the only possible model.
This diff compiles all TLS variables to use local-exec on Emscripten as a
temporary measure until dynamic linking is supported with threads.
The goal for this is to allow C++ types with constructors to be thread-local.
Currently, when clang compiles a thread_local variable with a constructor,
it generates __tls_guard variable:
@__tls_guard = internal thread_local global i8 0, align 1
As no TLS model is specified, this is treated as general-dynamic, which we do
not support (and cannot support without implementing dynamic linking support
with threads in Emscripten). As a result, any C++ constructor in thread_local
variables would not compile.
By compiling all thread_local as local-exec, __tls_guard will compile and
we can support C++ constructors with TLS without implementing dynamic linking
with threads.
Depends on D64537
If this condition is to be removed once emscripten support dynamic linking with threads, rather than XXX, how about marking as TODO Remove this condition once emscripten supports dynamic linking with threads or something?