From 057ad39ea85a85f8137772f0e9c5064b8d1d808a Mon Sep 17 00:00:00 2001 From: Amanieu d'Antras Date: Wed, 1 Jan 2020 17:11:45 +0100 Subject: [PATCH] Update the barrier cache during ARM EHABI unwinding --- src/libpanic_unwind/gcc.rs | 8 +++++++- src/libunwind/libunwind.rs | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/libpanic_unwind/gcc.rs b/src/libpanic_unwind/gcc.rs index e5e8e805b6e..e612a63994b 100644 --- a/src/libpanic_unwind/gcc.rs +++ b/src/libpanic_unwind/gcc.rs @@ -188,7 +188,13 @@ fn rust_exception_class() -> uw::_Unwind_Exception_Class { match eh_action { EHAction::None | EHAction::Cleanup(_) => return continue_unwind(exception_object, context), - EHAction::Catch(_) => return uw::_URC_HANDLER_FOUND, + EHAction::Catch(_) => { + // EHABI requires the personality routine to update the + // SP value in the barrier cache of the exception object. + (*exception_object).private[5] = + uw::_Unwind_GetGR(context, uw::UNWIND_SP_REG); + return uw::_URC_HANDLER_FOUND; + } EHAction::Terminate => return uw::_URC_FAILURE, } } else { diff --git a/src/libunwind/libunwind.rs b/src/libunwind/libunwind.rs index c03b6bf416c..087bbb4beb5 100644 --- a/src/libunwind/libunwind.rs +++ b/src/libunwind/libunwind.rs @@ -23,6 +23,7 @@ pub enum _Unwind_Reason_Code { pub type _Unwind_Ptr = uintptr_t; pub type _Unwind_Trace_Fn = extern "C" fn(ctx: *mut _Unwind_Context, arg: *mut c_void) -> _Unwind_Reason_Code; + #[cfg(target_arch = "x86")] pub const unwinder_private_data_size: usize = 5; @@ -152,6 +153,7 @@ enum _Unwind_VRS_DataRepresentation { use _Unwind_VRS_DataRepresentation::*; pub const UNWIND_POINTER_REG: c_int = 12; + pub const UNWIND_SP_REG: c_int = 13; pub const UNWIND_IP_REG: c_int = 15; #[cfg_attr(all(feature = "llvm-libunwind", -- GitLab