From d59caf39b6667c8147b02b235554bfd78f0f4436 Mon Sep 17 00:00:00 2001 From: Chris Fallin Date: Tue, 8 Nov 2022 15:03:17 -0800 Subject: [PATCH] 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. --- cranelift/native/src/lib.rs | 7 ++++++- crates/jit/src/unwind.rs | 3 --- crates/jit/src/unwind/winx32.rs | 20 -------------------- crates/runtime/src/traphandlers/macos.rs | 2 +- crates/runtime/src/traphandlers/unix.rs | 20 +++++--------------- crates/runtime/src/traphandlers/windows.rs | 3 --- 6 files changed, 12 insertions(+), 43 deletions(-) delete mode 100644 crates/jit/src/unwind/winx32.rs diff --git a/cranelift/native/src/lib.rs b/cranelift/native/src/lib.rs index 8250b1e524..8d2a3ca1cc 100644 --- a/cranelift/native/src/lib.rs +++ b/cranelift/native/src/lib.rs @@ -46,7 +46,12 @@ pub fn builder_with_options(infer_native_flags: bool) -> Result "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; diff --git a/crates/jit/src/unwind.rs b/crates/jit/src/unwind.rs index feb37c50f3..72284872ce 100644 --- a/crates/jit/src/unwind.rs +++ b/crates/jit/src/unwind.rs @@ -2,9 +2,6 @@ cfg_if::cfg_if! { if #[cfg(all(windows, any(target_arch = "x86_64", target_arch = "aarch64")))] { mod winx64; pub use self::winx64::*; - } else if #[cfg(all(windows, target_arch = "x86"))] { - mod winx32; - pub use self::winx32::*; } else if #[cfg(unix)] { mod systemv; pub use self::systemv::*; diff --git a/crates/jit/src/unwind/winx32.rs b/crates/jit/src/unwind/winx32.rs deleted file mode 100644 index 25b887ce72..0000000000 --- a/crates/jit/src/unwind/winx32.rs +++ /dev/null @@ -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(()) - } -} diff --git a/crates/runtime/src/traphandlers/macos.rs b/crates/runtime/src/traphandlers/macos.rs index 54f9d0269e..b8047e03a2 100644 --- a/crates/runtime/src/traphandlers/macos.rs +++ b/crates/runtime/src/traphandlers/macos.rs @@ -120,7 +120,7 @@ mod mach_addons { 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; #[cfg(target_arch = "aarch64")] pub static THREAD_STATE_NONE: thread_state_flavor_t = 5; diff --git a/crates/runtime/src/traphandlers/unix.rs b/crates/runtime/src/traphandlers/unix.rs index 64dfe58f16..de7b335ce1 100644 --- a/crates/runtime/src/traphandlers/unix.rs +++ b/crates/runtime/src/traphandlers/unix.rs @@ -47,16 +47,18 @@ pub unsafe fn platform_init() { register(&mut PREV_SIGILL, libc::SIGILL); // 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); } // Sometimes we need to handle SIGBUS too: - // - On ARM, handle Unaligned Accesses. // - 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); } + + // 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( @@ -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_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"))] { 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.__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"))] { let cx = &*(cx as *const libc::ucontext_t); ( diff --git a/crates/runtime/src/traphandlers/windows.rs b/crates/runtime/src/traphandlers/windows.rs index c76c1b0c06..a9c1b4f044 100644 --- a/crates/runtime/src/traphandlers/windows.rs +++ b/crates/runtime/src/traphandlers/windows.rs @@ -55,9 +55,6 @@ unsafe extern "system" fn exception_handler(exception_info: *mut EXCEPTION_POINT if #[cfg(target_arch = "x86_64")] { let ip = (*(*exception_info).ContextRecord).Rip as *const u8; 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")] { let ip = (*(*exception_info).ContextRecord).Pc as *const u8; let fp = (*(*exception_info).ContextRecord).Anonymous.Anonymous.Fp as usize;