Description
Out of curiosity, I ran a script to print out the list of targets where cfg(target_thread_local)
(indicating support for #[thread_local]
) is not true.
The results (and script) are available here: https://gist.github.com/thomcc/766d76e4da35ce1a73b93ccd548fd143
This looks somewhat wrong to me — I believe several of these should have support for static/linker thread local (or at least __thread
/__declspec(thread)
has worked there for me). Here are some items in that list which are... fairly suspicious to me.
- All the x86_64 (and probably other arches) unix ELF targets, like the various BSDs.
- i686-pc-windows-msvc, x86_64-pc-windows-gnu and i686-pc-windows-gnu
- aarch64-apple-ios (probably), aarch64-apple-tvos (almost certainly)
- ...
Playing around with1 clang
, gcc
, and msvc
a bit indicates that (the ones I can easily test of these) should have it, and probably others.
My suspicion is:
- Some of these are listed as not having thread locals by accident. It seems very easy to forget to change something like this when updating or adding a target
- Some of these are listed as unsupported because technically we might support very old versions.
If the issue is about old versions, I guess a question would be what should the cfg do in situations where the support is version-dependent...
This sounds like a tricky thing to decide! Worth noting: support for TLS is what caused us to choose 10.7 as the minimum supported version for macOS: #11927, but I guess back then2 we might not have had a #[cfg(target_thread_local)]
?.
But if nothing else, libstd probably has more concrete ideas about what it supports, and this causes it to be far more pessimistic in std::thread_local!
.
And more concretely: I'm pretty sure if I used #[thread_local]
in a malloc, I'd be pretty annoyed if it couldn't support, say, FreeBSD, since I know that at least GCC/Clang support __thread
on that target.
Footnotes
-
I think the correct thing to compare against would be
_Thread_local
/__thread
/__declspec(thread)
rather than C++'sthread_local
— these don't have ctor/dtor support, and thus map more directly to Rust's#[thread_local]
. That said, I don't really see a difference in what I've checked. ↩ -
I don't feel doing that much spelunking, seems likely that given the numeric gap between the macOS issue and the
thread_local
issue, that things probably worked very differently! ↩