| //! 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() | |
| } |