relibc/header/setjmp/
mod.rs1use core::arch::global_asm;
6
7use crate::platform::types::{c_int, c_ulonglong};
8
9macro_rules! platform_specific {
10 ($($rust_arch:expr,$c_arch:expr,$ext:expr;)+) => {
11 $(
12 #[cfg(target_arch = $rust_arch)]
13 global_asm!(include_str!(concat!("impl/", $c_arch, "/setjmp.", $ext)));
14 #[cfg(target_arch = $rust_arch)]
15 global_asm!(include_str!(concat!("impl/", $c_arch, "/sigsetjmp.", $ext)));
16 #[cfg(target_arch = $rust_arch)]
17 global_asm!(include_str!(concat!("impl/", $c_arch, "/longjmp.", $ext)));
18 )+
19 }
20}
21
22platform_specific! {
23 "aarch64","aarch64", "s";
24 "x86","i386","s";
25 "x86_64","x86_64","s";
26 "riscv64", "riscv64", "S";
27}
28
29unsafe extern "C" {
31 pub unsafe fn setjmp(env: *mut c_ulonglong) -> c_int;
33 pub unsafe fn sigsetjmp(env: *mut c_ulonglong, savemask: c_int) -> c_int;
35 pub unsafe fn longjmp(env: *mut c_ulonglong, val: c_int);
37}
38
39#[unsafe(no_mangle)]
41pub unsafe extern "C" fn siglongjmp(env: *mut c_ulonglong, val: c_int) {
42 unsafe { longjmp(env, val) };
43}