diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-06-19 09:26:03 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-06-19 09:26:03 +0000 |
commit | 9918693037dce8aa4bb6f08741b6812923486c18 (patch) | |
tree | 21d2b40bec7e6a7ea664acee056eb3d08e15a1cf /vendor/unwinding/src/abi.rs | |
parent | Releasing progress-linux version 1.75.0+dfsg1-5~progress7.99u1. (diff) | |
download | rustc-9918693037dce8aa4bb6f08741b6812923486c18.tar.xz rustc-9918693037dce8aa4bb6f08741b6812923486c18.zip |
Merging upstream version 1.76.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/unwinding/src/abi.rs')
-rw-r--r-- | vendor/unwinding/src/abi.rs | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/vendor/unwinding/src/abi.rs b/vendor/unwinding/src/abi.rs new file mode 100644 index 000000000..12766c118 --- /dev/null +++ b/vendor/unwinding/src/abi.rs @@ -0,0 +1,172 @@ +use core::ffi::c_void; +use core::ops; + +use crate::util::*; + +#[cfg(not(feature = "unwinder"))] +use crate::arch::Arch; +#[cfg(feature = "unwinder")] +pub use crate::unwinder::*; + +#[repr(transparent)] +#[derive(Clone, Copy, PartialEq, Eq)] +pub struct UnwindReasonCode(pub c_int); + +#[allow(unused)] +impl UnwindReasonCode { + pub const NO_REASON: Self = Self(0); + pub const FOREIGN_EXCEPTION_CAUGHT: Self = Self(1); + pub const FATAL_PHASE2_ERROR: Self = Self(2); + pub const FATAL_PHASE1_ERROR: Self = Self(3); + pub const NORMAL_STOP: Self = Self(4); + pub const END_OF_STACK: Self = Self(5); + pub const HANDLER_FOUND: Self = Self(6); + pub const INSTALL_CONTEXT: Self = Self(7); + pub const CONTINUE_UNWIND: Self = Self(8); +} + +#[repr(transparent)] +#[derive(Clone, Copy, PartialEq, Eq)] +pub struct UnwindAction(pub c_int); + +impl UnwindAction { + pub const SEARCH_PHASE: Self = Self(1); + pub const CLEANUP_PHASE: Self = Self(2); + pub const HANDLER_FRAME: Self = Self(4); + pub const FORCE_UNWIND: Self = Self(8); + pub const END_OF_STACK: Self = Self(16); +} + +impl ops::BitOr for UnwindAction { + type Output = Self; + + #[inline] + fn bitor(self, rhs: Self) -> Self { + Self(self.0 | rhs.0) + } +} + +impl UnwindAction { + #[inline] + pub const fn empty() -> Self { + Self(0) + } + + #[inline] + pub const fn contains(&self, other: Self) -> bool { + self.0 & other.0 != 0 + } +} + +pub type UnwindExceptionCleanupFn = unsafe extern "C" fn(UnwindReasonCode, *mut UnwindException); + +pub type UnwindStopFn = unsafe extern "C" fn( + c_int, + UnwindAction, + u64, + *mut UnwindException, + &mut UnwindContext<'_>, + *mut c_void, +) -> UnwindReasonCode; + +#[cfg(not(feature = "unwinder"))] +#[repr(C)] +pub struct UnwindException { + pub exception_class: u64, + pub exception_cleanup: Option<UnwindExceptionCleanupFn>, + private: [usize; Arch::UNWIND_PRIVATE_DATA_SIZE], +} + +pub type UnwindTraceFn = + extern "C" fn(ctx: &UnwindContext<'_>, arg: *mut c_void) -> UnwindReasonCode; + +#[cfg(not(feature = "unwinder"))] +#[repr(C)] +pub struct UnwindContext<'a> { + opaque: usize, + phantom: core::marker::PhantomData<&'a ()>, +} + +pub type PersonalityRoutine = unsafe extern "C" fn( + c_int, + UnwindAction, + u64, + *mut UnwindException, + &mut UnwindContext<'_>, +) -> UnwindReasonCode; + +#[cfg(not(feature = "unwinder"))] +macro_rules! binding { + () => {}; + (unsafe extern $abi: literal fn $name: ident ($($arg: ident : $arg_ty: ty),*$(,)?) $(-> $ret: ty)?; $($rest: tt)*) => { + extern $abi { + pub fn $name($($arg: $arg_ty),*) $(-> $ret)?; + } + binding!($($rest)*); + }; + + (extern $abi: literal fn $name: ident ($($arg: ident : $arg_ty: ty),*$(,)?) $(-> $ret: ty)?; $($rest: tt)*) => { + #[allow(non_snake_case)] + #[inline] + pub fn $name($($arg: $arg_ty),*) $(-> $ret)? { + extern $abi { + fn $name($($arg: $arg_ty),*) $(-> $ret)?; + } + unsafe { $name($($arg),*) } + } + binding!($($rest)*); + }; +} + +#[cfg(feature = "unwinder")] +macro_rules! binding { + () => {}; + (unsafe extern $abi: literal fn $name: ident ($($arg: ident : $arg_ty: ty),*$(,)?) $(-> $ret: ty)?; $($rest: tt)*) => { + const _: unsafe extern $abi fn($($arg_ty),*) $(-> $ret)? = $name; + }; + + (extern $abi: literal fn $name: ident ($($arg: ident : $arg_ty: ty),*$(,)?) $(-> $ret: ty)?; $($rest: tt)*) => { + const _: extern $abi fn($($arg_ty),*) $(-> $ret)? = $name; + }; +} + +binding! { + extern "C" fn _Unwind_GetGR(unwind_ctx: &UnwindContext<'_>, index: c_int) -> usize; + extern "C" fn _Unwind_GetCFA(unwind_ctx: &UnwindContext<'_>) -> usize; + extern "C" fn _Unwind_SetGR( + unwind_ctx: &mut UnwindContext<'_>, + index: c_int, + value: usize, + ); + extern "C" fn _Unwind_GetIP(unwind_ctx: &UnwindContext<'_>) -> usize; + extern "C" fn _Unwind_GetIPInfo( + unwind_ctx: &UnwindContext<'_>, + ip_before_insn: &mut c_int, + ) -> usize; + extern "C" fn _Unwind_SetIP( + unwind_ctx: &mut UnwindContext<'_>, + value: usize, + ); + extern "C" fn _Unwind_GetLanguageSpecificData(unwind_ctx: &UnwindContext<'_>) -> *mut c_void; + extern "C" fn _Unwind_GetRegionStart(unwind_ctx: &UnwindContext<'_>) -> usize; + extern "C" fn _Unwind_GetTextRelBase(unwind_ctx: &UnwindContext<'_>) -> usize; + extern "C" fn _Unwind_GetDataRelBase(unwind_ctx: &UnwindContext<'_>) -> usize; + extern "C" fn _Unwind_FindEnclosingFunction(pc: *mut c_void) -> *mut c_void; + unsafe extern "C-unwind" fn _Unwind_RaiseException( + exception: *mut UnwindException, + ) -> UnwindReasonCode; + unsafe extern "C-unwind" fn _Unwind_ForcedUnwind( + exception: *mut UnwindException, + stop: UnwindStopFn, + stop_arg: *mut c_void, + ) -> UnwindReasonCode; + unsafe extern "C-unwind" fn _Unwind_Resume(exception: *mut UnwindException) -> !; + unsafe extern "C-unwind" fn _Unwind_Resume_or_Rethrow( + exception: *mut UnwindException, + ) -> UnwindReasonCode; + unsafe extern "C" fn _Unwind_DeleteException(exception: *mut UnwindException); + extern "C-unwind" fn _Unwind_Backtrace( + trace: UnwindTraceFn, + trace_argument: *mut c_void, + ) -> UnwindReasonCode; +} |