]> git.lizzy.rs Git - rust.git/blob - tests/codegen/thread-local.rs
Rollup merge of #106477 - Nathan-Fenner:nathanf/refined-error-span-trait-impl, r...
[rust.git] / tests / codegen / thread-local.rs
1 // compile-flags: -O
2 // aux-build:thread_local_aux.rs
3 // ignore-windows FIXME(#84933)
4 // ignore-wasm globals are used instead of thread locals
5 // ignore-emscripten globals are used instead of thread locals
6 // ignore-android does not use #[thread_local]
7
8 #![crate_type = "lib"]
9
10 extern crate thread_local_aux as aux;
11
12 use std::cell::Cell;
13
14 thread_local!(static A: Cell<u32> = const { Cell::new(1) });
15
16 // CHECK: [[TLS_AUX:@.+]] = external thread_local local_unnamed_addr global i64
17 // CHECK: [[TLS:@.+]] = internal thread_local unnamed_addr global
18
19 // CHECK-LABEL: @get
20 #[no_mangle]
21 fn get() -> u32 {
22     // CHECK: %0 = load i32, {{.*}}[[TLS]]{{.*}}
23     // CHECK-NEXT: ret i32 %0
24     A.with(|a| a.get())
25 }
26
27 // CHECK-LABEL: @set
28 #[no_mangle]
29 fn set(v: u32) {
30     // CHECK: store i32 %0, {{.*}}[[TLS]]{{.*}}
31     // CHECK-NEXT: ret void
32     A.with(|a| a.set(v))
33 }
34
35 // CHECK-LABEL: @get_aux
36 #[no_mangle]
37 fn get_aux() -> u64 {
38     // CHECK: %0 = load i64, {{.*}}[[TLS_AUX]]
39     // CHECK-NEXT: ret i64 %0
40     aux::A.with(|a| a.get())
41 }
42
43 // CHECK-LABEL: @set_aux
44 #[no_mangle]
45 fn set_aux(v: u64) {
46     // CHECK: store i64 %0, {{.*}}[[TLS_AUX]]
47     // CHECK-NEXT: ret void
48     aux::A.with(|a| a.set(v))
49 }