summaryrefslogtreecommitdiffstats
path: root/third_party/rust/cranelift-codegen/src/isa/unwind.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/cranelift-codegen/src/isa/unwind.rs')
-rw-r--r--third_party/rust/cranelift-codegen/src/isa/unwind.rs88
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,
+ }
+}