Skip to main content

relibc/header/setjmp/
mod.rs

1//! `setjmp.h` implementation.
2//!
3//! See <https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/setjmp.h.html>.
4
5use 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
29//Each platform has different sizes for sigjmp_buf, currently only x86_64 is supported
30unsafe extern "C" {
31    /// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/setjmp.html>.
32    pub unsafe fn setjmp(env: *mut c_ulonglong) -> c_int;
33    /// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/sigsetjmp.html>.
34    pub unsafe fn sigsetjmp(env: *mut c_ulonglong, savemask: c_int) -> c_int;
35    /// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/longjmp.html>.
36    pub unsafe fn longjmp(env: *mut c_ulonglong, val: c_int);
37}
38
39/// See <https://pubs.opengroup.org/onlinepubs/9799919799/functions/siglongjmp.html>.
40#[unsafe(no_mangle)]
41pub unsafe extern "C" fn siglongjmp(env: *mut c_ulonglong, val: c_int) {
42    unsafe { longjmp(env, val) };
43}