make _Unwind_Action
a type alias, not enum
It's bitflags in practice, so an enum is unsound, as an enum must only have the described values. The x86_64 psABI declares it as a `typedef int _Unwind_Action`, which seems reasonable. I made a newtype first but that was more annoying than just a typedef. We don't really use this value for much other than a short check.
This commit is contained in:
parent
81d8edc200
commit
f20a6c70fb
3 changed files with 16 additions and 22 deletions
|
@ -220,7 +220,7 @@ cfg_if::cfg_if! {
|
|||
Ok(action) => action,
|
||||
Err(_) => return uw::_URC_FATAL_PHASE1_ERROR,
|
||||
};
|
||||
if actions as i32 & uw::_UA_SEARCH_PHASE as i32 != 0 {
|
||||
if actions & uw::_UA_SEARCH_PHASE != 0 {
|
||||
match eh_action {
|
||||
EHAction::None | EHAction::Cleanup(_) => uw::_URC_CONTINUE_UNWIND,
|
||||
EHAction::Catch(_) | EHAction::Filter(_) => uw::_URC_HANDLER_FOUND,
|
||||
|
@ -230,7 +230,7 @@ cfg_if::cfg_if! {
|
|||
match eh_action {
|
||||
EHAction::None => uw::_URC_CONTINUE_UNWIND,
|
||||
// Forced unwinding hits a terminate action.
|
||||
EHAction::Filter(_) if actions as i32 & uw::_UA_FORCE_UNWIND as i32 != 0 => uw::_URC_CONTINUE_UNWIND,
|
||||
EHAction::Filter(_) if actions & uw::_UA_FORCE_UNWIND != 0 => uw::_URC_CONTINUE_UNWIND,
|
||||
EHAction::Cleanup(lpad) | EHAction::Catch(lpad) | EHAction::Filter(lpad) => {
|
||||
uw::_Unwind_SetGR(
|
||||
context,
|
||||
|
|
|
@ -125,16 +125,13 @@ if #[cfg(any(target_vendor = "apple", target_os = "netbsd", not(target_arch = "a
|
|||
//
|
||||
// 32-bit ARM on iOS/tvOS/watchOS use either DWARF/Compact unwinding or
|
||||
// "setjmp-longjmp" / SjLj unwinding.
|
||||
#[repr(C)]
|
||||
#[derive(Copy, Clone, PartialEq)]
|
||||
pub enum _Unwind_Action {
|
||||
_UA_SEARCH_PHASE = 1,
|
||||
_UA_CLEANUP_PHASE = 2,
|
||||
_UA_HANDLER_FRAME = 4,
|
||||
_UA_FORCE_UNWIND = 8,
|
||||
_UA_END_OF_STACK = 16,
|
||||
}
|
||||
pub use _Unwind_Action::*;
|
||||
pub type _Unwind_Action = c_int;
|
||||
|
||||
pub const _UA_SEARCH_PHASE: c_int = 1;
|
||||
pub const _UA_CLEANUP_PHASE: c_int = 2;
|
||||
pub const _UA_HANDLER_FRAME: c_int = 4;
|
||||
pub const _UA_FORCE_UNWIND: c_int = 8;
|
||||
pub const _UA_END_OF_STACK: c_int = 16;
|
||||
|
||||
#[cfg_attr(
|
||||
all(feature = "llvm-libunwind", any(target_os = "fuchsia", target_os = "linux", target_os = "xous")),
|
||||
|
|
|
@ -2,16 +2,13 @@
|
|||
|
||||
use core::ffi::{c_int, c_void};
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Copy, Clone, PartialEq)]
|
||||
pub enum _Unwind_Action {
|
||||
_UA_SEARCH_PHASE = 1,
|
||||
_UA_CLEANUP_PHASE = 2,
|
||||
_UA_HANDLER_FRAME = 4,
|
||||
_UA_FORCE_UNWIND = 8,
|
||||
_UA_END_OF_STACK = 16,
|
||||
}
|
||||
pub use _Unwind_Action::*;
|
||||
pub type _Unwind_Action = c_int;
|
||||
|
||||
pub const _UA_SEARCH_PHASE: c_int = 1;
|
||||
pub const _UA_CLEANUP_PHASE: c_int = 2;
|
||||
pub const _UA_HANDLER_FRAME: c_int = 4;
|
||||
pub const _UA_FORCE_UNWIND: c_int = 8;
|
||||
pub const _UA_END_OF_STACK: c_int = 16;
|
||||
|
||||
#[repr(C)]
|
||||
#[derive(Debug, Copy, Clone, PartialEq)]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue