|
10 | 10 | macro_rules! __thread_local_inner {
|
11 | 11 | // used to generate the `LocalKey` value for const-initialized thread locals
|
12 | 12 | (@key $t:ty, const $init:expr) => {{
|
13 |
| - #[cfg_attr(not(windows), inline)] // see comments below |
| 13 | + #[cfg_attr(not(bootstrap), inline)] |
14 | 14 | #[deny(unsafe_op_in_unsafe_fn)]
|
15 | 15 | unsafe fn __getit(
|
16 | 16 | _init: $crate::option::Option<&mut $crate::option::Option<$t>>,
|
@@ -77,29 +77,7 @@ macro_rules! __thread_local_inner {
|
77 | 77 | #[inline]
|
78 | 78 | fn __init() -> $t { $init }
|
79 | 79 |
|
80 |
| - // When reading this function you might ask "why is this inlined |
81 |
| - // everywhere other than Windows?", and that's a very reasonable |
82 |
| - // question to ask. The short story is that it segfaults rustc if |
83 |
| - // this function is inlined. The longer story is that Windows looks |
84 |
| - // to not support `extern` references to thread locals across DLL |
85 |
| - // boundaries. This appears to at least not be supported in the ABI |
86 |
| - // that LLVM implements. |
87 |
| - // |
88 |
| - // Because of this we never inline on Windows, but we do inline on |
89 |
| - // other platforms (where external references to thread locals |
90 |
| - // across DLLs are supported). A better fix for this would be to |
91 |
| - // inline this function on Windows, but only for "statically linked" |
92 |
| - // components. For example if two separately compiled rlibs end up |
93 |
| - // getting linked into a DLL then it's fine to inline this function |
94 |
| - // across that boundary. It's only not fine to inline this function |
95 |
| - // across a DLL boundary. Unfortunately rustc doesn't currently |
96 |
| - // have this sort of logic available in an attribute, and it's not |
97 |
| - // clear that rustc is even equipped to answer this (it's more of a |
98 |
| - // Cargo question kinda). This means that, unfortunately, Windows |
99 |
| - // gets the pessimistic path for now where it's never inlined. |
100 |
| - // |
101 |
| - // The issue of "should enable on Windows sometimes" is #84933 |
102 |
| - #[cfg_attr(not(windows), inline)] |
| 80 | + #[cfg_attr(not(bootstrap), inline)] |
103 | 81 | unsafe fn __getit(
|
104 | 82 | init: $crate::option::Option<&mut $crate::option::Option<$t>>,
|
105 | 83 | ) -> $crate::option::Option<&'static $t> {
|
|
0 commit comments