runtime: handle traps on Windows x32. (#1740)
This commit is contained in:
@@ -2,6 +2,9 @@ cfg_if::cfg_if! {
|
|||||||
if #[cfg(all(windows, target_arch = "x86_64"))] {
|
if #[cfg(all(windows, target_arch = "x86_64"))] {
|
||||||
mod winx64;
|
mod winx64;
|
||||||
pub use self::winx64::*;
|
pub use self::winx64::*;
|
||||||
|
} else if #[cfg(all(windows, target_arch = "x86"))] {
|
||||||
|
mod winx32;
|
||||||
|
pub use self::winx32::*;
|
||||||
} else if #[cfg(unix)] {
|
} else if #[cfg(unix)] {
|
||||||
mod systemv;
|
mod systemv;
|
||||||
pub use self::systemv::*;
|
pub use self::systemv::*;
|
||||||
|
|||||||
20
crates/jit/src/unwind/winx32.rs
Normal file
20
crates/jit/src/unwind/winx32.rs
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
//! Stub unwind registry for Windows x32.
|
||||||
|
|
||||||
|
use anyhow::{bail, Result};
|
||||||
|
use cranelift_codegen::isa::{unwind::UnwindInfo, TargetIsa};
|
||||||
|
|
||||||
|
pub struct UnwindRegistry {}
|
||||||
|
|
||||||
|
impl UnwindRegistry {
|
||||||
|
pub fn new(_base_address: usize) -> Self {
|
||||||
|
Self {}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn register(&mut self, _func_start: u32, _func_len: u32, _info: &UnwindInfo) -> Result<()> {
|
||||||
|
bail!("winx32 has no unwind registry")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn publish(&mut self, _isa: &dyn TargetIsa) -> Result<()> {
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -224,10 +224,16 @@ cfg_if::cfg_if! {
|
|||||||
Some(info) => info,
|
Some(info) => info,
|
||||||
None => return EXCEPTION_CONTINUE_SEARCH,
|
None => return EXCEPTION_CONTINUE_SEARCH,
|
||||||
};
|
};
|
||||||
let jmp_buf = info.handle_trap(
|
cfg_if::cfg_if! {
|
||||||
(*(*exception_info).ContextRecord).Rip as *const u8,
|
if #[cfg(target_arch = "x86_64")] {
|
||||||
|handler| handler(exception_info),
|
let ip = (*(*exception_info).ContextRecord).Rip as *const u8;
|
||||||
);
|
} else if #[cfg(target_arch = "x86")] {
|
||||||
|
let ip = (*(*exception_info).ContextRecord).Eip as *const u8;
|
||||||
|
} else {
|
||||||
|
compile_error!("unsupported platform");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let jmp_buf = info.handle_trap(ip, |handler| handler(exception_info));
|
||||||
if jmp_buf.is_null() {
|
if jmp_buf.is_null() {
|
||||||
EXCEPTION_CONTINUE_SEARCH
|
EXCEPTION_CONTINUE_SEARCH
|
||||||
} else if jmp_buf as usize == 1 {
|
} else if jmp_buf as usize == 1 {
|
||||||
|
|||||||
Reference in New Issue
Block a user