1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
//! 该模块包含 `eh_personality` lang 项的实现。
//!
//! 实际实现很大程度上取决于目标,因为 Rust 尽可能尝试使用原生栈展开机制。
//!
//! `-C panic=abort` 仍然需要这个 personality 函数,因为它用于从 `extern "C-unwind"` 捕获外部异常并将它们转换为中止。
//!
//!
//! 此外,ARM EHABI 在生成回溯时使用了 personality 函数。
//!
//!
//!
mod dwarf;
#[cfg(not(test))]
cfg_if::cfg_if! {
if #[cfg(target_os = "emscripten")] {
mod emcc;
} else if #[cfg(target_env = "msvc")] {
// 这是编译器要求存在的 (例如,它是一个 lang 项),但编译器实际上从未调用它,因为 _CxxFrameHandler3 是始终使用的 personality 函数。
//
// 因此,这只是一个正在中止的存根。
//
#[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 {
// 不支持的目标展开。
// - family=wasm
// - os=none ("bare metal" targets)
// - os=uefi
// - os=espidf
// - os=hermit
// - nvptx64-nvidia-cuda
// - arch=avr
}
}