diff options
Diffstat (limited to 'third_party/rust/cranelift-codegen/src/isa/unwind.rs')
-rw-r--r-- | third_party/rust/cranelift-codegen/src/isa/unwind.rs | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/third_party/rust/cranelift-codegen/src/isa/unwind.rs b/third_party/rust/cranelift-codegen/src/isa/unwind.rs new file mode 100644 index 0000000000..a4c5f0b6b7 --- /dev/null +++ b/third_party/rust/cranelift-codegen/src/isa/unwind.rs @@ -0,0 +1,88 @@ +//! Represents information relating to function unwinding. +#[cfg(feature = "enable-serde")] +use serde::{Deserialize, Serialize}; + +#[cfg(feature = "unwind")] +pub mod systemv; + +#[cfg(feature = "unwind")] +pub mod winx64; + +/// Represents unwind information for a single function. +#[derive(Clone, Debug, PartialEq, Eq)] +#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] +#[non_exhaustive] +pub enum UnwindInfo { + /// Windows x64 ABI unwind information. + #[cfg(feature = "unwind")] + WindowsX64(winx64::UnwindInfo), + /// System V ABI unwind information. + #[cfg(feature = "unwind")] + SystemV(systemv::UnwindInfo), +} + +/// Intermediate representation for the unwind information +/// generated by a backend. +pub mod input { + use crate::binemit::CodeOffset; + use alloc::vec::Vec; + #[cfg(feature = "enable-serde")] + use serde::{Deserialize, Serialize}; + + /// Elementary operation in the unwind operations. + #[derive(Clone, Debug, PartialEq, Eq)] + #[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] + pub enum UnwindCode<Reg> { + /// Defines that a register is saved at the specified offset. + SaveRegister { + /// The saved register. + reg: Reg, + /// The specified offset relative to the stack pointer. + stack_offset: u32, + }, + /// Defines that a register is as defined before call. + RestoreRegister { + /// The restored register. + reg: Reg, + }, + /// The stack pointer was adjusted to allocate the stack. + StackAlloc { + /// Size to allocate. + size: u32, + }, + /// The stack pointer was adjusted to free the stack. + StackDealloc { + /// Size to deallocate. + size: u32, + }, + /// The alternative register was assigned as frame pointer base. + SetFramePointer { + /// The specified register. + reg: Reg, + }, + /// Restores a frame pointer base to default register. + RestoreFramePointer, + /// Saves the state. + RememberState, + /// Restores the state. + RestoreState, + } + + /// Unwind information as generated by a backend. + #[derive(Clone, Debug, PartialEq, Eq)] + #[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))] + pub struct UnwindInfo<Reg> { + /// Size of the prologue. + pub prologue_size: CodeOffset, + /// Unwind codes for prologue. + pub prologue_unwind_codes: Vec<(CodeOffset, UnwindCode<Reg>)>, + /// Unwind codes for epilogues. + pub epilogues_unwind_codes: Vec<Vec<(CodeOffset, UnwindCode<Reg>)>>, + /// Entire function size. + pub function_size: CodeOffset, + /// Platform word size in bytes. + pub word_size: u8, + /// Initial stack pointer offset. + pub initial_sp_offset: u8, + } +} |