Wasmtime+Cranelift: strip out some dead x86-32 code. (#5226)
* Wasmtime+Cranelift: strip out some dead x86-32 code. I was recently pointed to fastly/Viceroy#200 where it seems some folks are trying to compile Wasmtime (via Viceroy) for Windows x86-32 and the failures may not be loud enough. I've tried to reproduce this cross-compiling to i686-pc-windows-gnu from Linux and hit build failures (as expected) in several places. Nevertheless, while trying to discern what others may be attempting, I noticed some dead x86-32-specific code in our repo, and figured it would be a good idea to clean this up. Otherwise, it (i) sends some mixed messages -- "hey look, this codebase does support x86-32" -- and (ii) keeps untested code around, which is generally not great. This PR removes x86-32-specific cases in traphandlers and unwind code, and Cranelift's native feature detection. It adds helpful compile-error messages in a few cases. If we ever support x86-32 (contributors welcome! The big missing piece is Cranelift support; see #1980), these compile errors and git history should be enough to recover any knowledge we are now encoding in the source. I left the x86-32 support in `wasmtime-fiber` alone because that seems like a bit of a special case -- foundation library, separate from the rest of Wasmtime, with specific care to provide a (presumably working) full 32-bit version. * Remove some extraneous compile_error!s, already covered by others.
This commit is contained in:
@@ -46,7 +46,12 @@ pub fn builder_with_options(infer_native_flags: bool) -> Result<isa::Builder, &'
|
|||||||
isa::LookupError::Unsupported => "unsupported architecture",
|
isa::LookupError::Unsupported => "unsupported architecture",
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
|
#[cfg(target_arch = "x86")]
|
||||||
|
{
|
||||||
|
compile_error!("Unsupported architecture");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(target_arch = "x86_64")]
|
||||||
{
|
{
|
||||||
use cranelift_codegen::settings::Configurable;
|
use cranelift_codegen::settings::Configurable;
|
||||||
|
|
||||||
|
|||||||
@@ -2,9 +2,6 @@ cfg_if::cfg_if! {
|
|||||||
if #[cfg(all(windows, any(target_arch = "x86_64", target_arch = "aarch64")))] {
|
if #[cfg(all(windows, any(target_arch = "x86_64", target_arch = "aarch64")))] {
|
||||||
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::*;
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
//! 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(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -120,7 +120,7 @@ mod mach_addons {
|
|||||||
|
|
||||||
pub static ARM_THREAD_STATE64: thread_state_flavor_t = 6;
|
pub static ARM_THREAD_STATE64: thread_state_flavor_t = 6;
|
||||||
|
|
||||||
#[cfg(any(target_arch = "x86_64", target_arch = "x86"))]
|
#[cfg(target_arch = "x86_64")]
|
||||||
pub static THREAD_STATE_NONE: thread_state_flavor_t = 13;
|
pub static THREAD_STATE_NONE: thread_state_flavor_t = 13;
|
||||||
#[cfg(target_arch = "aarch64")]
|
#[cfg(target_arch = "aarch64")]
|
||||||
pub static THREAD_STATE_NONE: thread_state_flavor_t = 5;
|
pub static THREAD_STATE_NONE: thread_state_flavor_t = 5;
|
||||||
|
|||||||
@@ -47,16 +47,18 @@ pub unsafe fn platform_init() {
|
|||||||
register(&mut PREV_SIGILL, libc::SIGILL);
|
register(&mut PREV_SIGILL, libc::SIGILL);
|
||||||
|
|
||||||
// x86 and s390x use SIGFPE to report division by zero
|
// x86 and s390x use SIGFPE to report division by zero
|
||||||
if cfg!(target_arch = "x86") || cfg!(target_arch = "x86_64") || cfg!(target_arch = "s390x") {
|
if cfg!(target_arch = "x86_64") || cfg!(target_arch = "s390x") {
|
||||||
register(&mut PREV_SIGFPE, libc::SIGFPE);
|
register(&mut PREV_SIGFPE, libc::SIGFPE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sometimes we need to handle SIGBUS too:
|
// Sometimes we need to handle SIGBUS too:
|
||||||
// - On ARM, handle Unaligned Accesses.
|
|
||||||
// - On Darwin, guard page accesses are raised as SIGBUS.
|
// - On Darwin, guard page accesses are raised as SIGBUS.
|
||||||
if cfg!(target_arch = "arm") || cfg!(target_os = "macos") || cfg!(target_os = "freebsd") {
|
if cfg!(target_os = "macos") || cfg!(target_os = "freebsd") {
|
||||||
register(&mut PREV_SIGBUS, libc::SIGBUS);
|
register(&mut PREV_SIGBUS, libc::SIGBUS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO(#1980): x86-32, if we support it, will also need a SIGFPE handler.
|
||||||
|
// TODO(#1173): ARM32, if we support it, will also need a SIGBUS handler.
|
||||||
}
|
}
|
||||||
|
|
||||||
unsafe extern "C" fn trap_handler(
|
unsafe extern "C" fn trap_handler(
|
||||||
@@ -172,12 +174,6 @@ unsafe fn get_pc_and_fp(cx: *mut libc::c_void, _signum: libc::c_int) -> (*const
|
|||||||
cx.uc_mcontext.gregs[libc::REG_RIP as usize] as *const u8,
|
cx.uc_mcontext.gregs[libc::REG_RIP as usize] as *const u8,
|
||||||
cx.uc_mcontext.gregs[libc::REG_RBP as usize] as usize
|
cx.uc_mcontext.gregs[libc::REG_RBP as usize] as usize
|
||||||
)
|
)
|
||||||
} else if #[cfg(all(target_os = "linux", target_arch = "x86"))] {
|
|
||||||
let cx = &*(cx as *const libc::ucontext_t);
|
|
||||||
(
|
|
||||||
cx.uc_mcontext.gregs[libc::REG_EIP as usize] as *const u8,
|
|
||||||
cx.uc_mcontext.gregs[libc::REG_EBP as usize] as usize,
|
|
||||||
)
|
|
||||||
} else if #[cfg(all(any(target_os = "linux", target_os = "android"), target_arch = "aarch64"))] {
|
} else if #[cfg(all(any(target_os = "linux", target_os = "android"), target_arch = "aarch64"))] {
|
||||||
let cx = &*(cx as *const libc::ucontext_t);
|
let cx = &*(cx as *const libc::ucontext_t);
|
||||||
(
|
(
|
||||||
@@ -210,12 +206,6 @@ unsafe fn get_pc_and_fp(cx: *mut libc::c_void, _signum: libc::c_int) -> (*const
|
|||||||
(*cx.uc_mcontext).__ss.__rip as *const u8,
|
(*cx.uc_mcontext).__ss.__rip as *const u8,
|
||||||
(*cx.uc_mcontext).__ss.__rbp as usize,
|
(*cx.uc_mcontext).__ss.__rbp as usize,
|
||||||
)
|
)
|
||||||
} else if #[cfg(all(target_os = "macos", target_arch = "x86"))] {
|
|
||||||
let cx = &*(cx as *const libc::ucontext_t);
|
|
||||||
(
|
|
||||||
(*cx.uc_mcontext).__ss.__eip as *const u8,
|
|
||||||
(*cx.uc_mcontext).__ss.__ebp as usize,
|
|
||||||
)
|
|
||||||
} else if #[cfg(all(target_os = "macos", target_arch = "aarch64"))] {
|
} else if #[cfg(all(target_os = "macos", target_arch = "aarch64"))] {
|
||||||
let cx = &*(cx as *const libc::ucontext_t);
|
let cx = &*(cx as *const libc::ucontext_t);
|
||||||
(
|
(
|
||||||
|
|||||||
@@ -55,9 +55,6 @@ unsafe extern "system" fn exception_handler(exception_info: *mut EXCEPTION_POINT
|
|||||||
if #[cfg(target_arch = "x86_64")] {
|
if #[cfg(target_arch = "x86_64")] {
|
||||||
let ip = (*(*exception_info).ContextRecord).Rip as *const u8;
|
let ip = (*(*exception_info).ContextRecord).Rip as *const u8;
|
||||||
let fp = (*(*exception_info).ContextRecord).Rbp as usize;
|
let fp = (*(*exception_info).ContextRecord).Rbp as usize;
|
||||||
} else if #[cfg(target_arch = "x86")] {
|
|
||||||
let ip = (*(*exception_info).ContextRecord).Eip as *const u8;
|
|
||||||
let fp = (*(*exception_info).ContextRecord).Ebp as usize;
|
|
||||||
} else if #[cfg(target_arch = "aarch64")] {
|
} else if #[cfg(target_arch = "aarch64")] {
|
||||||
let ip = (*(*exception_info).ContextRecord).Pc as *const u8;
|
let ip = (*(*exception_info).ContextRecord).Pc as *const u8;
|
||||||
let fp = (*(*exception_info).ContextRecord).Anonymous.Anonymous.Fp as usize;
|
let fp = (*(*exception_info).ContextRecord).Anonymous.Anonymous.Fp as usize;
|
||||||
|
|||||||
Reference in New Issue
Block a user