| //@ ignore-loongarch64 (handles dso_local differently) | |
| //@ ignore-powerpc64 (handles dso_local differently) | |
| //@ ignore-apple (handles dso_local differently) | |
| //@ revisions: DEFAULT PIE DIRECT INDIRECT | |
| //@ [DEFAULT] compile-flags: -C relocation-model=static | |
| //@ [PIE] compile-flags: -C relocation-model=pie | |
| //@ [DIRECT] compile-flags: -C relocation-model=pie -Z direct-access-external-data=yes | |
| //@ [INDIRECT] compile-flags: -C relocation-model=static -Z direct-access-external-data=no | |
| #![crate_type = "rlib"] | |
| #![feature(linkage)] | |
| unsafe extern "C" { | |
| // CHECK: @VAR = external | |
| // DEFAULT-SAME: dso_local | |
| // PIE-NOT: dso_local | |
| // DIRECT-SAME: dso_local | |
| // INDIRECT-NOT: dso_local | |
| // CHECK-SAME: global i32 | |
| safe static VAR: i32; | |
| // When "linkage" is used, we generate an indirection global. | |
| // Check dso_local is still applied to the actual global. | |
| // CHECK: @EXTERNAL = external | |
| // DEFAULT-SAME: dso_local | |
| // PIE-NOT: dso_local | |
| // DIRECT-SAME: dso_local | |
| // INDIRECT-NOT: dso_local | |
| // CHECK-SAME: global i8 | |
| #[linkage = "external"] | |
| safe static EXTERNAL: *const u32; | |
| // CHECK: @WEAK = extern_weak | |
| // DEFAULT-SAME: dso_local | |
| // PIE-NOT: dso_local | |
| // DIRECT-SAME: dso_local | |
| // INDIRECT-NOT: dso_local | |
| // CHECK-SAME: global i8 | |
| #[linkage = "extern_weak"] | |
| safe static WEAK: *const u32; | |
| } | |
| #[no_mangle] | |
| pub fn refer() { | |
| core::hint::black_box(VAR); | |
| core::hint::black_box(EXTERNAL); | |
| core::hint::black_box(WEAK); | |
| } |