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
13mod dwarf;
14
15#[cfg(not(any(test, doctest)))]
16cfg_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