diff options
| author | bors <bors@rust-lang.org> | 2021-05-19 15:59:46 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2021-05-19 15:59:46 +0000 |
| commit | 3bcaeb0bf9e1c29d18abc32928fd2f23d1bed0bd (patch) | |
| tree | bdd1506fefce08fffd85d76c0685efe6ddac3731 /src/test/codegen | |
| parent | 3e827cc21e0734edd26170e8d1481f0d66a1426b (diff) | |
| parent | 641d3b09f41b441f2c2618de32983ad3d13ea3f8 (diff) | |
| download | rust-3bcaeb0bf9e1c29d18abc32928fd2f23d1bed0bd.tar.gz rust-3bcaeb0bf9e1c29d18abc32928fd2f23d1bed0bd.zip | |
Auto merge of #84876 - alexcrichton:inline-thread-locals-cross-crate, r=Mark-Simulacrum
std: Attempt again to inline thread-local-init across crates Issue #25088 has been part of `thread_local!` for quite some time now. Historical attempts have been made to add `#[inline]` to `__getit` in #43931, #50252, and #59720, but these attempts ended up not landing at the time due to segfaults on Windows. In the interim though with `const`-initialized thread locals AFAIK this is the only remaining bug which is why you might want to use `#[thread_local]` over `thread_local!`. As a result I figured it was time to resubmit this and see how it fares on CI and if I can help debugging any issues that crop up. Closes #25088
Diffstat (limited to 'src/test/codegen')
| -rw-r--r-- | src/test/codegen/auxiliary/thread_local_aux.rs | 6 | ||||
| -rw-r--r-- | src/test/codegen/thread-local.rs | 50 |
2 files changed, 56 insertions, 0 deletions
diff --git a/src/test/codegen/auxiliary/thread_local_aux.rs b/src/test/codegen/auxiliary/thread_local_aux.rs new file mode 100644 index 00000000000..29b5e3ca244 --- /dev/null +++ b/src/test/codegen/auxiliary/thread_local_aux.rs @@ -0,0 +1,6 @@ +#![crate_type = "lib"] +#![feature(thread_local_const_init)] + +use std::cell::Cell; + +thread_local!(pub static A: Cell<u64> = const { Cell::new(0) }); diff --git a/src/test/codegen/thread-local.rs b/src/test/codegen/thread-local.rs new file mode 100644 index 00000000000..f14368e3990 --- /dev/null +++ b/src/test/codegen/thread-local.rs @@ -0,0 +1,50 @@ +// compile-flags: -O +// aux-build:thread_local_aux.rs +// ignore-windows FIXME(#84933) +// ignore-wasm globals are used instead of thread locals +// ignore-emscripten globals are used instead of thread locals +// ignore-android does not use #[thread_local] + +#![crate_type = "lib"] +#![feature(thread_local_const_init)] + +extern crate thread_local_aux as aux; + +use std::cell::Cell; + +thread_local!(static A: Cell<u32> = const { Cell::new(1) }); + +// CHECK: [[TLS_AUX:@.+]] = external thread_local local_unnamed_addr global i64 +// CHECK: [[TLS:@.+]] = internal thread_local unnamed_addr global + +// CHECK-LABEL: @get +#[no_mangle] +fn get() -> u32 { + // CHECK: %0 = load i32, i32* bitcast ({{.*}} [[TLS]] to i32*) + // CHECK-NEXT: ret i32 %0 + A.with(|a| a.get()) +} + +// CHECK-LABEL: @set +#[no_mangle] +fn set(v: u32) { + // CHECK: store i32 %0, i32* bitcast ({{.*}} [[TLS]] to i32*) + // CHECK-NEXT: ret void + A.with(|a| a.set(v)) +} + +// CHECK-LABEL: @get_aux +#[no_mangle] +fn get_aux() -> u64 { + // CHECK: %0 = load i64, i64* [[TLS_AUX]] + // CHECK-NEXT: ret i64 %0 + aux::A.with(|a| a.get()) +} + +// CHECK-LABEL: @set_aux +#[no_mangle] +fn set_aux(v: u64) { + // CHECK: store i64 %0, i64* [[TLS_AUX]] + // CHECK-NEXT: ret void + aux::A.with(|a| a.set(v)) +} |
