| 1 | //! This module contains the implementation of the `eh_personality` lang item. |
| 2 | //! |
| 3 | //! The actual implementation is heavily dependent on the target since Rust |
| 4 | //! tries to use the native stack unwinding mechanism whenever possible. |
| 5 | //! |
| 6 | //! This personality function is still required with `-C panic=abort` because |
| 7 | //! it is used to catch foreign exceptions from `extern "C-unwind"` and turn |
| 8 | //! them into aborts. |
| 9 | //! |
| 10 | //! Additionally, ARM EHABI uses the personality function when generating |
| 11 | //! backtraces. |
| 12 | |
| 13 | mod dwarf; |
| 14 | |
| 15 | #[cfg (not(any(test, doctest)))] |
| 16 | cfg_if::cfg_if! { |
| 17 | if #[cfg(target_os = "emscripten" )] { |
| 18 | mod emcc; |
| 19 | } else if #[cfg(any(target_env = "msvc" , target_family = "wasm" ))] { |
| 20 | // This is required by the compiler to exist (e.g., it's a lang item), |
| 21 | // but it's never actually called by the compiler because |
| 22 | // __CxxFrameHandler3 (msvc) / __gxx_wasm_personality_v0 (wasm) is the |
| 23 | // personality function that is always used. Hence this is just an |
| 24 | // aborting stub. |
| 25 | #[lang = "eh_personality" ] |
| 26 | fn rust_eh_personality() { |
| 27 | core::intrinsics::abort() |
| 28 | } |
| 29 | } else if #[cfg(any( |
| 30 | all(target_family = "windows" , target_env = "gnu" ), |
| 31 | target_os = "psp" , |
| 32 | target_os = "xous" , |
| 33 | target_os = "solid_asp3" , |
| 34 | all(target_family = "unix" , not(target_os = "espidf" ), not(target_os = "l4re" ), not(target_os = "nuttx" )), |
| 35 | all(target_vendor = "fortanix" , target_env = "sgx" ), |
| 36 | ))] { |
| 37 | mod gcc; |
| 38 | } else { |
| 39 | // Targets that don't support unwinding. |
| 40 | // - os=none ("bare metal" targets) |
| 41 | // - os=uefi |
| 42 | // - os=espidf |
| 43 | // - os=hermit |
| 44 | // - nvptx64-nvidia-cuda |
| 45 | // - arch=avr |
| 46 | } |
| 47 | } |
| 48 | |