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" )), |
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 | |