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
    }
}