diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:19:13 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:19:13 +0000 |
commit | 218caa410aa38c29984be31a5229b9fa717560ee (patch) | |
tree | c54bd55eeb6e4c508940a30e94c0032fbd45d677 /src/test/ui/asm/aarch64/sym.rs | |
parent | Releasing progress-linux version 1.67.1+dfsg1-1~progress7.99u1. (diff) | |
download | rustc-218caa410aa38c29984be31a5229b9fa717560ee.tar.xz rustc-218caa410aa38c29984be31a5229b9fa717560ee.zip |
Merging upstream version 1.68.2+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/test/ui/asm/aarch64/sym.rs')
-rw-r--r-- | src/test/ui/asm/aarch64/sym.rs | 84 |
1 files changed, 0 insertions, 84 deletions
diff --git a/src/test/ui/asm/aarch64/sym.rs b/src/test/ui/asm/aarch64/sym.rs deleted file mode 100644 index 6a6cdb00d..000000000 --- a/src/test/ui/asm/aarch64/sym.rs +++ /dev/null @@ -1,84 +0,0 @@ -// only-aarch64 -// only-linux -// needs-asm-support -// run-pass - -#![feature(thread_local)] - -use std::arch::asm; - -extern "C" fn f1() -> i32 { - 111 -} - -// The compiler will generate a shim to hide the caller location parameter. -#[track_caller] -fn f2() -> i32 { - 222 -} - -macro_rules! call { - ($func:path) => { - unsafe { - let result: i32; - asm!("bl {}", sym $func, - out("w0") result, - out("x20") _, out("x21") _, out("x22") _, - out("x23") _, out("x24") _, out("x25") _, - out("x26") _, out("x27") _, out("x28") _, - ); - result - } - } -} - -macro_rules! static_addr { - ($s:expr) => { - unsafe { - let result: *const u32; - asm!( - // ADRP gives the address of a 4KB page from a PC-relative address - "adrp {out}, {sym}", - // We then add the remaining lower 12 bits - "add {out}, {out}, #:lo12:{sym}", - out = out(reg) result, - sym = sym $s); - result - } - } -} -macro_rules! static_tls_addr { - ($s:expr) => { - unsafe { - let result: *const u32; - asm!( - // Load the thread pointer register - "mrs {out}, TPIDR_EL0", - // Add the top 12 bits of the symbol's offset - "add {out}, {out}, :tprel_hi12:{sym}", - // And the bottom 12 bits - "add {out}, {out}, :tprel_lo12_nc:{sym}", - out = out(reg) result, - sym = sym $s - ); - result - } - } -} - -static S1: u32 = 111; -#[thread_local] -static S2: u32 = 222; - -fn main() { - assert_eq!(call!(f1), 111); - assert_eq!(call!(f2), 222); - assert_eq!(static_addr!(S1), &S1 as *const u32); - assert_eq!(static_tls_addr!(S2), &S2 as *const u32); - std::thread::spawn(|| { - assert_eq!(static_addr!(S1), &S1 as *const u32); - assert_eq!(static_tls_addr!(S2), &S2 as *const u32); - }) - .join() - .unwrap(); -} |