Implement emitting Windows unwind information for fastcall functions. (#1155)
* Implement emitting Windows unwind information for fastcall functions. This commit implements emitting Windows unwind information for x64 fastcall calling convention functions. The unwind information can be used to construct a Windows function table at runtime for JIT'd code, enabling stack walking and unwinding by the operating system. * Address code review feedback. This commit addresses code review feedback: * Remove unnecessary unsafe code. * Emit the unwind information always as little endian. * Fix comments. A dependency from cranelift-codegen to the byteorder crate was added. The byteorder crate is a no-dependencies crate with a reasonable abstraction for writing binary data for a specific endianness. * Address code review feedback. * Disable default features for the `byteorder` crate. * Add a comment regarding the Windows ABI unwind code numerical values. * Panic if we encounter a Windows function with a prologue greater than 256 bytes in size.
This commit is contained in:
@@ -83,6 +83,11 @@ pub struct Function {
|
||||
/// Track the original source location for each instruction. The source locations are not
|
||||
/// interpreted by Cranelift, only preserved.
|
||||
pub srclocs: SourceLocs,
|
||||
|
||||
/// Instruction that marks the end (inclusive) of the function's prologue.
|
||||
///
|
||||
/// This is used for some calling conventions to track the end of unwind information.
|
||||
pub prologue_end: Option<Inst>,
|
||||
}
|
||||
|
||||
impl Function {
|
||||
@@ -104,6 +109,7 @@ impl Function {
|
||||
offsets: SecondaryMap::new(),
|
||||
jt_offsets: SecondaryMap::new(),
|
||||
srclocs: SecondaryMap::new(),
|
||||
prologue_end: None,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -123,6 +129,7 @@ impl Function {
|
||||
self.offsets.clear();
|
||||
self.jt_offsets.clear();
|
||||
self.srclocs.clear();
|
||||
self.prologue_end = None;
|
||||
}
|
||||
|
||||
/// Create a new empty, anonymous function with a Fast calling convention.
|
||||
|
||||
Reference in New Issue
Block a user