| //! This module contains the implementation of the `eh_personality` lang item. |
| //! |
| //! The actual implementation is heavily dependent on the target since Rust |
| //! tries to use the native stack unwinding mechanism whenever possible. |
| //! |
| //! This personality function is still required with `-C panic=abort` because |
| //! it is used to catch foreign exceptions from `extern "C-unwind"` and turn |
| //! them into aborts. |
| //! |
| //! Additionally, ARM EHABI uses the personality function when generating |
| //! backtraces. |
| |
| mod dwarf; |
| |
| #[cfg(not(test))] |
| cfg_if::cfg_if! { |
| if #[cfg(target_os = "emscripten")] { |
| mod emcc; |
| } else if #[cfg(target_env = "msvc")] { |
| // This is required by the compiler to exist (e.g., it's a lang item), |
| // but it's never actually called by the compiler because |
| // _CxxFrameHandler3 is the personality function that is always used. |
| // Hence this is just an aborting stub. |
| #[lang = "eh_personality"] |
| fn rust_eh_personality() { |
| core::intrinsics::abort() |
| } |
| } else if #[cfg(any( |
| all(target_family = "windows", target_env = "gnu"), |
| target_os = "psp", |
| target_os = "solid_asp3", |
| all(target_family = "unix", not(target_os = "espidf")), |
| all(target_vendor = "fortanix", target_env = "sgx"), |
| ))] { |
| mod gcc; |
| } else { |
| // Targets that don't support unwinding. |
| // - family=wasm |
| // - os=none ("bare metal" targets) |
| // - os=uefi |
| // - os=espidf |
| // - os=hermit |
| // - nvptx64-nvidia-cuda |
| // - arch=avr |
| } |
| } |