| //! Implementation of Rust panics via process aborts |
| //! |
| //! When compared to the implementation via unwinding, this crate is *much* |
| //! simpler! That being said, it's not quite as versatile, but here goes! |
| |
| #![no_std] |
| #![unstable(feature = "panic_abort", issue = "32837")] |
| #![doc(issue_tracker_base_url = "https://github.com/rust-lang/rust/issues/")] |
| #![panic_runtime] |
| #![feature(panic_runtime)] |
| #![feature(std_internals)] |
| #![feature(staged_api)] |
| #![feature(rustc_attrs)] |
| #![allow(internal_features)] |
| |
| #[cfg(target_os = "android")] |
| mod android; |
| |
| #[cfg(target_os = "zkvm")] |
| mod zkvm; |
| |
| use core::any::Any; |
| use core::panic::PanicPayload; |
| |
| #[rustc_std_internal_symbol] |
| #[allow(improper_ctypes_definitions)] |
| pub unsafe extern "C" fn __rust_panic_cleanup(_: *mut u8) -> *mut (dyn Any + Send + 'static) { |
| unreachable!() |
| } |
| |
| // "Leak" the payload and shim to the relevant abort on the platform in question. |
| #[rustc_std_internal_symbol] |
| pub unsafe fn __rust_start_panic(_payload: &mut dyn PanicPayload) -> u32 { |
| // Android has the ability to attach a message as part of the abort. |
| #[cfg(target_os = "android")] |
| unsafe { |
| android::android_set_abort_message(_payload); |
| } |
| #[cfg(target_os = "zkvm")] |
| unsafe { |
| zkvm::zkvm_set_abort_message(_payload); |
| } |
| |
| unsafe extern "Rust" { |
| // This is defined in std::rt. |
| #[rustc_std_internal_symbol] |
| safe fn __rust_abort() -> !; |
| } |
| |
| __rust_abort() |
| } |