summaryrefslogtreecommitdiffstats
path: root/library/unwind/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'library/unwind/src/lib.rs')
-rw-r--r--library/unwind/src/lib.rs90
1 files changed, 90 insertions, 0 deletions
diff --git a/library/unwind/src/lib.rs b/library/unwind/src/lib.rs
new file mode 100644
index 000000000..4a6ba6e10
--- /dev/null
+++ b/library/unwind/src/lib.rs
@@ -0,0 +1,90 @@
+#![no_std]
+#![unstable(feature = "panic_unwind", issue = "32837")]
+#![feature(link_cfg)]
+#![feature(staged_api)]
+#![feature(c_unwind)]
+#![feature(cfg_target_abi)]
+#![cfg_attr(not(target_env = "msvc"), feature(libc))]
+
+cfg_if::cfg_if! {
+ if #[cfg(target_env = "msvc")] {
+ // Windows MSVC no extra unwinder support needed
+ } else if #[cfg(any(
+ target_os = "l4re",
+ target_os = "none",
+ target_os = "espidf",
+ ))] {
+ // These "unix" family members do not have unwinder.
+ // Note this also matches x86_64-unknown-none-linuxkernel.
+ } else if #[cfg(any(
+ unix,
+ windows,
+ target_os = "psp",
+ target_os = "solid_asp3",
+ all(target_vendor = "fortanix", target_env = "sgx"),
+ ))] {
+ mod libunwind;
+ pub use libunwind::*;
+ } else {
+ // no unwinder on the system!
+ // - wasm32 (not emscripten, which is "unix" family)
+ // - os=none ("bare metal" targets)
+ // - os=hermit
+ // - os=uefi
+ // - os=cuda
+ // - nvptx64-nvidia-cuda
+ // - Any new targets not listed above.
+ }
+}
+
+#[cfg(target_env = "musl")]
+cfg_if::cfg_if! {
+ if #[cfg(all(feature = "llvm-libunwind", feature = "system-llvm-libunwind"))] {
+ compile_error!("`llvm-libunwind` and `system-llvm-libunwind` cannot be enabled at the same time");
+ } else if #[cfg(feature = "llvm-libunwind")] {
+ #[link(name = "unwind", kind = "static", modifiers = "-bundle")]
+ extern "C" {}
+ } else if #[cfg(feature = "system-llvm-libunwind")] {
+ #[link(name = "unwind", kind = "static", modifiers = "-bundle", cfg(target_feature = "crt-static"))]
+ #[link(name = "unwind", cfg(not(target_feature = "crt-static")))]
+ extern "C" {}
+ } else {
+ #[link(name = "unwind", kind = "static", modifiers = "-bundle", cfg(target_feature = "crt-static"))]
+ #[link(name = "gcc_s", cfg(not(target_feature = "crt-static")))]
+ extern "C" {}
+ }
+}
+
+// When building with crt-static, we get `gcc_eh` from the `libc` crate, since
+// glibc needs it, and needs it listed later on the linker command line. We
+// don't want to duplicate it here.
+#[cfg(all(
+ target_os = "linux",
+ any(target_env = "gnu", target_env = "uclibc"),
+ not(feature = "llvm-libunwind"),
+ not(feature = "system-llvm-libunwind")
+))]
+#[link(name = "gcc_s", cfg(not(target_feature = "crt-static")))]
+extern "C" {}
+
+#[cfg(all(
+ target_os = "linux",
+ any(target_env = "gnu", target_env = "uclibc"),
+ not(feature = "llvm-libunwind"),
+ feature = "system-llvm-libunwind"
+))]
+#[link(name = "unwind", cfg(not(target_feature = "crt-static")))]
+extern "C" {}
+
+#[cfg(target_os = "redox")]
+#[link(name = "gcc_eh", kind = "static", modifiers = "-bundle", cfg(target_feature = "crt-static"))]
+#[link(name = "gcc_s", cfg(not(target_feature = "crt-static")))]
+extern "C" {}
+
+#[cfg(all(target_vendor = "fortanix", target_env = "sgx"))]
+#[link(name = "unwind", kind = "static", modifiers = "-bundle")]
+extern "C" {}
+
+#[cfg(all(target_os = "windows", target_env = "gnu", target_abi = "llvm"))]
+#[link(name = "unwind", kind = "static", modifiers = "-bundle")]
+extern "C" {}