Sp0tless wrote:

The immediate failure mode today is unresolved symbols at final link or JIT 
materialization time, and the references are produced even without JIT/ORC. 
Plain Clang with `--target=x86_64-pc-windows-msvc -femulated-tls` on ordinary 
code emits references to `__emutls_v._Init_thread_epoch` and 
`__emutls_v.__tls_guard` (the Compiler Explorer link in the PR description 
shows this). Neither symbol exists, since the CRT does not publish emutls 
descriptors for its own internal TLS state. The underlying CodeGen problem is 
therefore independent of whether the eventual consumer is an ordinary linker or 
a JIT symbol lookup.

I did try something close to providing the required behavior within the JIT in 
the #213568 prototype: a JIT-side accessor bridge for `_Init_thread_epoch` and 
an IR rewrite for dynamic TLS initialization. An emulated epoch initialized 
conservatively may be enough for function-local statics, but an emulated guard 
alone would not make the host CRT discover initializer functions in JIT 
allocations. The dynamic-init guard and initializer state also need to remain 
correct across incremental PTUs. My prototype tracked it in an executor-wide 
list with no ResourceTracker association, so unloading or undoing a PTU could 
leave stale state. I also did not find a good story for thread-exit 
destruction, since that is normally driven by `__tlregdtor` and PE TLS 
callbacks tied to a loader-managed module, which a JIT allocation is not. So it 
does not feel like just "two symbols" once I get into it, but rather an entry 
point into the JIT-owned TLS initialization and lifetime problem under the MSVC 
ABI, though I may be missing a simpler way to scope it down.

Separately, in case it is useful: even once this patch is in, ordinary 
`thread_local` accesses under emulated TLS still need `__emutls_get_address` to 
resolve in-process on Windows, and that path currently excludes MSVC. #209717's 
force-link/absolute-symbol workaround explicitly skips it ("MSVC has no such 
runtime"), and its test is `UNSUPPORTED: system-windows`. So that looks like 
the next thing this would run into. Beyond that, the two lifetime gaps 
mentioned above, PTU-scoped dynamic-init state and thread-exit destruction, 
still seem open as far as I can tell. Together with other COFFPlatform fixes 
from #213568, such as #217445, it feels like Windows COFFPlatform support may 
be within reach of a useful baseline, if that context is helpful.

Happy to go further in whichever direction is useful: more auditing on the 
Clang side, or digging into the JIT-side symbols and lifecycle gaps if that is 
still the direction you would like to take.


https://github.com/llvm/llvm-project/pull/220215
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to