|
| 1 | +//@ only-loongarch64 |
| 2 | + |
| 3 | +//@ revisions: DEFAULT PIE DIRECT INDIRECT |
| 4 | +//@ [DEFAULT] compile-flags: -C relocation-model=static |
| 5 | +//@ [PIE] compile-flags: -C relocation-model=pie |
| 6 | +//@ [DIRECT] compile-flags: -C relocation-model=pie -Z direct-access-external-data=yes |
| 7 | +//@ [INDIRECT] compile-flags: -C relocation-model=static -Z direct-access-external-data=no |
| 8 | + |
| 9 | +#![crate_type = "rlib"] |
| 10 | +#![feature(linkage)] |
| 11 | + |
| 12 | +unsafe extern "C" { |
| 13 | + // CHECK: @VAR = external |
| 14 | + // DEFAULT-NOT: dso_local |
| 15 | + // PIE-NOT: dso_local |
| 16 | + // DIRECT-SAME: dso_local |
| 17 | + // INDIRECT-NOT: dso_local |
| 18 | + // CHECK-SAME: global i32 |
| 19 | + safe static VAR: i32; |
| 20 | + |
| 21 | + // When "linkage" is used, we generate an indirection global. |
| 22 | + // Check dso_local is still applied to the actual global. |
| 23 | + // CHECK: @EXTERNAL = external |
| 24 | + // DEFAULT-NOT: dso_local |
| 25 | + // PIE-NOT: dso_local |
| 26 | + // DIRECT-SAME: dso_local |
| 27 | + // INDIRECT-NOT: dso_local |
| 28 | + // CHECK-SAME: global i8 |
| 29 | + #[linkage = "external"] |
| 30 | + safe static EXTERNAL: *const u32; |
| 31 | + |
| 32 | + // CHECK: @WEAK = extern_weak |
| 33 | + // DEFAULT-NOT: dso_local |
| 34 | + // PIE-NOT: dso_local |
| 35 | + // DIRECT-SAME: dso_local |
| 36 | + // INDIRECT-NOT: dso_local |
| 37 | + // CHECK-SAME: global i8 |
| 38 | + #[linkage = "extern_weak"] |
| 39 | + safe static WEAK: *const u32; |
| 40 | +} |
| 41 | + |
| 42 | +#[no_mangle] |
| 43 | +pub fn refer() { |
| 44 | + core::hint::black_box(VAR); |
| 45 | + core::hint::black_box(EXTERNAL); |
| 46 | + core::hint::black_box(WEAK); |
| 47 | +} |
0 commit comments