diff --git a/Cargo.lock b/Cargo.lock index c226554d0..3d8212e67 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2389,6 +2389,7 @@ name = "sel4-panicking" version = "0.1.0" dependencies = [ "cfg-if", + "rustc_version", "sel4-immediate-sync-once-cell", "sel4-panicking-env", "unwinding", diff --git a/crates/sel4-panicking/Cargo.nix b/crates/sel4-panicking/Cargo.nix index ff91edaae..5b9e8bd8f 100644 --- a/crates/sel4-panicking/Cargo.nix +++ b/crates/sel4-panicking/Cargo.nix @@ -15,6 +15,9 @@ mk { sel4-immediate-sync-once-cell ; }; + build-dependencies = { + inherit (versions) rustc_version; + }; target."cfg(not(target_arch = \"arm\"))".dependencies = { unwinding = unwindingWith [ "personality" ] // { optional = true; }; }; diff --git a/crates/sel4-panicking/Cargo.toml b/crates/sel4-panicking/Cargo.toml index 467281c2a..95253e4a2 100644 --- a/crates/sel4-panicking/Cargo.toml +++ b/crates/sel4-panicking/Cargo.toml @@ -24,6 +24,9 @@ cfg-if = "1.0.0" sel4-immediate-sync-once-cell = { path = "../sel4-immediate-sync-once-cell" } sel4-panicking-env = { path = "env" } +[build-dependencies] +rustc_version = "0.4.0" + [target."cfg(not(target_arch = \"arm\"))".dependencies.unwinding] version = "0.1.6" default-features = false diff --git a/crates/sel4-panicking/build.rs b/crates/sel4-panicking/build.rs new file mode 100644 index 000000000..1b110f35e --- /dev/null +++ b/crates/sel4-panicking/build.rs @@ -0,0 +1,25 @@ +// +// Copyright 2024, Colias Group, LLC +// +// SPDX-License-Identifier: BSD-2-Clause +// + +use core::cmp::Reverse; + +// Determine whether rustc includes https://github.com/rust-lang/rust/pull/121598 + +fn main() { + let version_meta = rustc_version::version_meta().unwrap(); + let semver = version_meta.semver; + let commit_date = order_date(version_meta.commit_date); + let key = (semver.major, semver.minor, semver.patch, commit_date); + let first_with_change = (1, 78, 0, order_date(Some("2024-02-28".to_owned()))); + if key < first_with_change { + println!("cargo:rustc-cfg=catch_unwind_intrinsic_still_named_try"); + } +} + +// assume no build date means more recent +fn order_date(date: Option) -> Reverse>> { + Reverse(date.map(Reverse)) +} diff --git a/crates/sel4-panicking/src/lib.rs b/crates/sel4-panicking/src/lib.rs index 247f1fae0..a16fd34a9 100644 --- a/crates/sel4-panicking/src/lib.rs +++ b/crates/sel4-panicking/src/lib.rs @@ -21,6 +21,8 @@ use core::mem::ManuallyDrop; use core::panic::Location; use core::panic::{PanicInfo, UnwindSafe}; +use cfg_if::cfg_if; + use sel4_panicking_env::abort; mod count; @@ -108,6 +110,14 @@ fn do_panic(info: ExternalPanicInfo) -> ! { } } +cfg_if! { + if #[cfg(catch_unwind_intrinsic_still_named_try)] { + use core::intrinsics::r#try as catch_unwind_intrinsic; + } else { + use core::intrinsics::catch_unwind as catch_unwind_intrinsic; + } +} + pub fn catch_unwind R + UnwindSafe>(f: F) -> Result { union Data { f: ManuallyDrop, @@ -121,7 +131,7 @@ pub fn catch_unwind R + UnwindSafe>(f: F) -> Result, data_ptr, do_catch::) == 0 { + return if catch_unwind_intrinsic(do_call::, data_ptr, do_catch::) == 0 { Ok(ManuallyDrop::into_inner(data.r)) } else { Err(ManuallyDrop::into_inner(data.p)) diff --git a/hacking/cargo-manifest-management/manifest-scope.nix b/hacking/cargo-manifest-management/manifest-scope.nix index 412aa85d1..668f6f820 100644 --- a/hacking/cargo-manifest-management/manifest-scope.nix +++ b/hacking/cargo-manifest-management/manifest-scope.nix @@ -107,6 +107,7 @@ in rec { proc-macro2 = "1.0.50"; quote = "1.0.23"; rand = "0.8.5"; + rustc_version = "0.4.0"; serde = "1.0.147"; serde_json = "1.0.87"; serde_yaml = "0.9.14";