From c807ff3b449a8dafc5cef539e5e65b2fe6dab879 Mon Sep 17 00:00:00 2001 From: Vadim Chugunov Date: Sun, 18 Oct 2015 14:31:32 -0700 Subject: [PATCH] Create entry points for unwind frame registry in libstd. --- src/libstd/lib.rs | 9 +++++++++ src/libstd/sys/common/libunwind.rs | 4 ++++ src/libstd/sys/common/unwind/gcc.rs | 21 +++++++++++++++++++++ 3 files changed, 34 insertions(+) diff --git a/src/libstd/lib.rs b/src/libstd/lib.rs index a624b352126..f318cde71bd 100644 --- a/src/libstd/lib.rs +++ b/src/libstd/lib.rs @@ -400,6 +400,15 @@ pub mod __rand { pub use rand::{thread_rng, ThreadRng, Rng}; } +// Rust runtime's startup objects depend on these symbols, so they must be public. +// Since sys_common isn't public, we have to re-export them here explicitly. +#[doc(hidden)] +#[unstable(feature = "eh_frame_registry", issue = "0")] +#[cfg(all(target_os="windows", target_arch = "x86", target_env="gnu"))] +pub mod __frame_registry { + pub use sys_common::unwind::imp::eh_frame_registry::*; +} + // Include a number of private modules that exist solely to provide // the rustdoc documentation for primitive types. Using `include!` // because rustdoc only looks for these modules at the crate level. diff --git a/src/libstd/sys/common/libunwind.rs b/src/libstd/sys/common/libunwind.rs index 04f677a90c4..74d334bd062 100644 --- a/src/libstd/sys/common/libunwind.rs +++ b/src/libstd/sys/common/libunwind.rs @@ -128,6 +128,10 @@ extern {} #[link(name = "c++abi")] extern {} +#[cfg(all(target_os = "windows", target_env="gnu"))] +#[link(name = "gcc_eh")] +extern {} + extern "C" { // iOS on armv7 uses SjLj exceptions and requires to link // against corresponding routine (..._SjLj_...) diff --git a/src/libstd/sys/common/unwind/gcc.rs b/src/libstd/sys/common/unwind/gcc.rs index 5ee14d9f57a..6d82eb7dfb1 100644 --- a/src/libstd/sys/common/unwind/gcc.rs +++ b/src/libstd/sys/common/unwind/gcc.rs @@ -238,3 +238,24 @@ pub mod eabi { unsafe extern fn rust_eh_unwind_resume(panic_ctx: *mut u8) -> ! { uw::_Unwind_Resume(panic_ctx as *mut uw::_Unwind_Exception); } + +#[cfg(all(target_os="windows", target_arch = "x86", target_env="gnu"))] +pub mod eh_frame_registry { + #[link(name = "gcc_eh")] + extern { + fn __register_frame_info(eh_frame_begin: *const u8, object: *mut u8); + fn __deregister_frame_info(eh_frame_begin: *const u8, object: *mut u8); + } + #[cfg(not(test))] + #[no_mangle] + pub unsafe extern fn rust_eh_register_frames(eh_frame_begin: *const u8, + object: *mut u8) { + __register_frame_info(eh_frame_begin, object); + } + #[cfg(not(test))] + #[no_mangle] + pub unsafe extern fn rust_eh_unregister_frames(eh_frame_begin: *const u8, + object: *mut u8) { + __deregister_frame_info(eh_frame_begin, object); + } +}