From c8984398174c7e7de5ba4ff84c2884b8d08ffad4 Mon Sep 17 00:00:00 2001 From: Lachlan Sneff Date: Thu, 11 Apr 2019 12:07:54 -0700 Subject: [PATCH] Add well placed unwind(allowed) attribute --- Cargo.lock | 2 ++ lib/llvm-backend/src/backend.rs | 6 ++++-- lib/runtime-core/Cargo.toml | 1 + lib/runtime-core/build.rs | 5 +++++ lib/runtime-core/src/lib.rs | 2 ++ lib/runtime-core/src/typed_func.rs | 5 ++++- lib/runtime/examples/call.rs | 4 ++-- 7 files changed, 20 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5f111b7b8..a82cca2b3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2274,6 +2274,7 @@ dependencies = [ "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", "nix 0.13.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", "wasmer-runtime-core 0.2.1", "wasmparser 0.28.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2372,6 +2373,7 @@ dependencies = [ "nix 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "page_size 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.90 (registry+https://github.com/rust-lang/crates.io-index)", "serde-bench 0.0.7 (registry+https://github.com/rust-lang/crates.io-index)", "serde_bytes 0.10.5 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/lib/llvm-backend/src/backend.rs b/lib/llvm-backend/src/backend.rs index f40a6dfb2..176702bc3 100644 --- a/lib/llvm-backend/src/backend.rs +++ b/lib/llvm-backend/src/backend.rs @@ -75,10 +75,12 @@ extern "C" { fn module_delete(module: *mut LLVMModule); fn get_func_symbol(module: *mut LLVMModule, name: *const c_char) -> *const vm::Func; - fn throw_trap(ty: i32) -> !; + fn throw_trap(ty: i32); /// This should be the same as spliting up the fat pointer into two arguments, /// but this is cleaner, I think? + #[cfg_attr(nightly, unwind(allowed))] + #[allow(improper_ctypes)] fn throw_any(data: *mut dyn Any) -> !; #[allow(improper_ctypes)] @@ -438,7 +440,7 @@ impl ProtectedCaller for LLVMProtectedCaller { impl UserTrapper for Placeholder { unsafe fn do_early_trap(&self, data: Box) -> ! { - throw_any(Box::leak(data)) + throw_any(Box::leak(data)); } } diff --git a/lib/runtime-core/Cargo.toml b/lib/runtime-core/Cargo.toml index 215df568a..41d472626 100644 --- a/lib/runtime-core/Cargo.toml +++ b/lib/runtime-core/Cargo.toml @@ -45,6 +45,7 @@ field-offset = "0.1.1" [build-dependencies] blake2b_simd = "0.4.1" +rustc_version = "0.2.3" [features] debug = [] diff --git a/lib/runtime-core/build.rs b/lib/runtime-core/build.rs index e91238bc6..38071e31c 100644 --- a/lib/runtime-core/build.rs +++ b/lib/runtime-core/build.rs @@ -23,4 +23,9 @@ fn main() { f_out .write_all(hash_string.as_bytes()) .expect("Could not write to file for wasmer hash value"); + + // Enable "nightly" cfg if the current compiler is nightly. + if rustc_version::version_meta().unwrap().channel == rustc_version::Channel::Nightly { + println!("cargo:rustc-cfg=nightly"); + } } diff --git a/lib/runtime-core/src/lib.rs b/lib/runtime-core/src/lib.rs index d7ef274fd..a43a4c63a 100644 --- a/lib/runtime-core/src/lib.rs +++ b/lib/runtime-core/src/lib.rs @@ -1,3 +1,5 @@ +#![cfg_attr(nightly, feature(unwind_attributes))] + #[cfg(test)] #[macro_use] extern crate field_offset; diff --git a/lib/runtime-core/src/typed_func.rs b/lib/runtime-core/src/typed_func.rs index 2ca67dba5..d18055ba1 100644 --- a/lib/runtime-core/src/typed_func.rs +++ b/lib/runtime-core/src/typed_func.rs @@ -339,11 +339,14 @@ macro_rules! impl_traits { fn to_raw(&self) -> NonNull { assert_eq!(mem::size_of::(), 0, "you cannot use a closure that captures state for `Func`."); + /// This is required for the llvm backend to be able to unwind through this function. + #[cfg_attr(nightly, unwind(allowed))] extern fn wrap<$( $x: WasmExternType, )* Rets: WasmTypeList, Trap: TrapEarly, FN: Fn( &mut Ctx $( ,$x )* ) -> Trap>( ctx: &mut Ctx $( ,$x: $x )* ) -> Rets::CStruct { let f: FN = unsafe { mem::transmute_copy(&()) }; let err = match panic::catch_unwind(panic::AssertUnwindSafe(|| { - f( ctx $( ,$x )* ).report() + let res = f( ctx $( ,$x )* ).report(); + res })) { Ok(Ok(returns)) => return returns.into_c_struct(), Ok(Err(err)) => err, diff --git a/lib/runtime/examples/call.rs b/lib/runtime/examples/call.rs index 12f149062..894fa4ab1 100644 --- a/lib/runtime/examples/call.rs +++ b/lib/runtime/examples/call.rs @@ -59,9 +59,9 @@ fn main() -> Result<(), error::Error> { }, })?; - let foo: Func<(), i32> = instance.func("dbz")?; + let foo = instance.dyn_func("dbz")?; - let result = foo.call(); + let result = foo.call(&[]); println!("result: {:?}", result);