Merge branch 'master' into feature/llvm-mcg-no-builder

This commit is contained in:
nlewycky
2020-03-20 12:27:48 -07:00
committed by GitHub
17 changed files with 1488 additions and 378 deletions

View File

@ -2,6 +2,7 @@
## **[Unreleased]**
- [#1303](https://github.com/wasmerio/wasmer/pull/1303) NaN canonicalization for singlepass backend.
- [#1305](https://github.com/wasmerio/wasmer/pull/1305) Handle panics from DynamicFunc.
- [#1301](https://github.com/wasmerio/wasmer/pull/1301) Update supported stable Rust version to 1.41.1.
- [#1300](https://github.com/wasmerio/wasmer/pull/1300) Add support for multiple versions of WASI tests: wasitests now test all versions of WASI.

2
Cargo.lock generated
View File

@ -2146,7 +2146,7 @@ dependencies = [
name = "wasmer-win-exception-handler"
version = "0.16.2"
dependencies = [
"cmake",
"cc",
"libc",
"wasmer-runtime-core",
"winapi",

View File

@ -322,7 +322,7 @@ ifeq ($(OS), Windows_NT)
else
ifeq ($(UNAME_S), Darwin)
cp target/release/libwasmer_runtime_c_api.dylib ./capi/lib/libwasmer.dylib
cp target/release/libwasmer_runtime_c_api.dylib ./capi/lib/libwasmer.a
cp target/release/libwasmer_runtime_c_api.a ./capi/lib/libwasmer.a
# Fix the rpath for the dylib
install_name_tool -id "@rpath/libwasmer.dylib" ./capi/lib/libwasmer.dylib
else

View File

@ -19,7 +19,7 @@ use std::mem;
use std::sync::{Arc, RwLock};
use wasmer_runtime_core::error::CompileError;
use wasmer_runtime_core::{
backend::{CacheGen, Token},
backend::{CacheGen, CompilerConfig, Token},
cache::{Artifact, Error as CacheError},
codegen::*,
memory::MemoryType,
@ -36,7 +36,7 @@ use wasmparser::Type as WpType;
static BACKEND_ID: &str = "cranelift";
pub struct CraneliftModuleCodeGenerator {
isa: Box<dyn isa::TargetIsa>,
isa: Option<Box<dyn isa::TargetIsa>>,
signatures: Option<Arc<Map<SigIndex, FuncSig>>>,
pub clif_signatures: Map<SigIndex, ir::Signature>,
function_signatures: Option<Arc<Map<FuncIndex, SigIndex>>>,
@ -47,9 +47,8 @@ impl ModuleCodeGenerator<CraneliftFunctionCodeGenerator, Caller, CodegenError>
for CraneliftModuleCodeGenerator
{
fn new() -> Self {
let isa = get_isa();
CraneliftModuleCodeGenerator {
isa,
isa: None,
clif_signatures: Map::new(),
functions: vec![],
function_signatures: None,
@ -100,7 +99,7 @@ impl ModuleCodeGenerator<CraneliftFunctionCodeGenerator, Caller, CodegenError>
position: Position::default(),
func_env: FunctionEnvironment {
module_info: Arc::clone(&module_info),
target_config: self.isa.frontend_config().clone(),
target_config: self.isa.as_ref().unwrap().frontend_config().clone(),
clif_signatures: self.clif_signatures.clone(),
},
loc,
@ -162,9 +161,9 @@ impl ModuleCodeGenerator<CraneliftFunctionCodeGenerator, Caller, CodegenError>
}
let (func_resolver_builder, debug_metadata, handler_data) =
FuncResolverBuilder::new(&*self.isa, func_bodies, module_info)?;
FuncResolverBuilder::new(&**self.isa.as_ref().unwrap(), func_bodies, module_info)?;
let trampolines = Arc::new(Trampolines::new(&*self.isa, module_info));
let trampolines = Arc::new(Trampolines::new(&**self.isa.as_ref().unwrap(), module_info));
let signatures_empty = Map::new();
let signatures = if self.signatures.is_some() {
@ -191,9 +190,19 @@ impl ModuleCodeGenerator<CraneliftFunctionCodeGenerator, Caller, CodegenError>
))
}
fn feed_compiler_config(&mut self, config: &CompilerConfig) -> Result<(), CodegenError> {
self.isa = Some(get_isa(Some(config)));
Ok(())
}
fn feed_signatures(&mut self, signatures: Map<SigIndex, FuncSig>) -> Result<(), CodegenError> {
self.signatures = Some(Arc::new(signatures));
let call_conv = self.isa.frontend_config().default_call_conv;
let call_conv = self
.isa
.as_ref()
.unwrap()
.frontend_config()
.default_call_conv;
for (_sig_idx, func_sig) in self.signatures.as_ref().unwrap().iter() {
self.clif_signatures
.push(convert_func_sig(func_sig, call_conv));
@ -1302,7 +1311,10 @@ fn generate_signature(
}
fn pointer_type(mcg: &CraneliftModuleCodeGenerator) -> ir::Type {
ir::Type::int(u16::from(mcg.isa.frontend_config().pointer_bits())).unwrap()
ir::Type::int(u16::from(
mcg.isa.as_ref().unwrap().frontend_config().pointer_bits(),
))
.unwrap()
}
/// Declare local variables for the signature parameters that correspond to WebAssembly locals.

View File

@ -29,6 +29,7 @@ use cranelift_codegen::{
settings::{self, Configurable},
};
use target_lexicon::Triple;
use wasmer_runtime_core::{backend::CompilerConfig, codegen::SimpleStreamingCompilerGen};
#[macro_use]
extern crate serde_derive;
@ -36,7 +37,7 @@ extern crate serde_derive;
extern crate rayon;
extern crate serde;
fn get_isa() -> Box<dyn isa::TargetIsa> {
fn get_isa(config: Option<&CompilerConfig>) -> Box<dyn isa::TargetIsa> {
let flags = {
let mut builder = settings::builder();
builder.set("opt_level", "speed_and_size").unwrap();
@ -48,6 +49,12 @@ fn get_isa() -> Box<dyn isa::TargetIsa> {
builder.set("enable_verifier", "false").unwrap();
}
if let Some(config) = config {
if config.nan_canonicalization {
builder.set("enable_nan_canonicalization", "true").unwrap();
}
}
let flags = settings::Flags::new(builder);
debug_assert_eq!(flags.opt_level(), settings::OptLevel::SpeedAndSize);
flags
@ -58,8 +65,6 @@ fn get_isa() -> Box<dyn isa::TargetIsa> {
/// The current version of this crate
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
use wasmer_runtime_core::codegen::SimpleStreamingCompilerGen;
/// Streaming compiler implementation for the Cranelift backed. Compiles web assembly binary into
/// machine code.
pub type CraneliftCompiler = SimpleStreamingCompilerGen<

View File

@ -212,8 +212,7 @@ fn wasm_ty_to_clif(ty: Type) -> ir::types::Type {
}
fn generate_trampoline_signature() -> ir::Signature {
let isa = super::get_isa();
let call_convention = isa.default_call_conv();
let call_convention = super::get_isa(None).default_call_conv();
let mut sig = ir::Signature::new(call_convention);
let ptr_param = ir::AbiParam {
@ -229,8 +228,7 @@ fn generate_trampoline_signature() -> ir::Signature {
}
fn generate_export_signature(func_sig: &FuncSig) -> ir::Signature {
let isa = super::get_isa();
let call_convention = isa.default_call_conv();
let call_convention = super::get_isa(None).default_call_conv();
let mut export_clif_sig = ir::Signature::new(call_convention);
let func_sig_iter = func_sig.params().iter().map(|wasm_ty| ir::AbiParam {

View File

@ -3700,7 +3700,7 @@ impl<'ctx> FunctionCodeGenerator<CodegenError> for LLVMFunctionCodeGenerator<'ct
.try_as_basic_value()
.left()
.unwrap();
state.push1_extra(res, i);
state.push1_extra(res, i | ExtraInfo::pending_f32_nan());
}
Operator::F64Trunc => {
let (v, i) = state.pop1_extra()?;
@ -3713,7 +3713,7 @@ impl<'ctx> FunctionCodeGenerator<CodegenError> for LLVMFunctionCodeGenerator<'ct
.try_as_basic_value()
.left()
.unwrap();
state.push1_extra(res, i);
state.push1_extra(res, i | ExtraInfo::pending_f64_nan());
}
Operator::F32Nearest => {
let (v, i) = state.pop1_extra()?;
@ -3726,7 +3726,7 @@ impl<'ctx> FunctionCodeGenerator<CodegenError> for LLVMFunctionCodeGenerator<'ct
.try_as_basic_value()
.left()
.unwrap();
state.push1_extra(res, i);
state.push1_extra(res, i | ExtraInfo::pending_f32_nan());
}
Operator::F64Nearest => {
let (v, i) = state.pop1_extra()?;
@ -3739,7 +3739,7 @@ impl<'ctx> FunctionCodeGenerator<CodegenError> for LLVMFunctionCodeGenerator<'ct
.try_as_basic_value()
.left()
.unwrap();
state.push1_extra(res, i);
state.push1_extra(res, i | ExtraInfo::pending_f64_nan());
}
Operator::F32Abs => {
let (v, i) = state.pop1_extra()?;

View File

@ -132,6 +132,10 @@ pub struct CompilerConfig {
/// When enabled there can be a small amount of runtime performance overhead.
pub full_preemption: bool,
/// Always choose a unique bit representation for NaN.
/// Enabling this makes execution deterministic but increases runtime overhead.
pub nan_canonicalization: bool,
pub features: Features,
// Target info. Presently only supported by LLVM.

File diff suppressed because it is too large Load Diff

View File

@ -3,15 +3,21 @@
(module
;; Auxiliary definitions
(type $out-i32 (func (result i32)))
(type $f32-id (func (param f32) (result f32)))
(type $f64-id (func (param f64) (result f64)))
(func $const-i32 (type $out-i32) (i32.const 0x132))
(table funcref
(elem
$const-i32
$nan-canonicalization-f32-func-call-target
$nan-canonicalization-f64-func-call-target
)
)
(memory 1)
;; https://github.com/wasmerio/wasmer/pull/1191
(func (export "call-indirect-from-spilled-stack") (result i32)
(i64.add (i64.const 0) (i64.const 0))
@ -28,6 +34,182 @@
(call_indirect (type $out-i32))
(return)
)
;; NaN canonicalization tests.
;; Things that are covered by spectests canonicalization (`fabs`, `fneg`, `fcopysign`, `reinterpret`, `const`) won't be duplicated here.
(func (export "nan-canonicalization-f32-add") (param i32) (result i32)
(i32.reinterpret_f32 (f32.add (f32.reinterpret_i32 (get_local 0)) (f32.const 0)))
)
(func (export "nan-canonicalization-f32-sub") (param i32) (result i32)
(i32.reinterpret_f32 (f32.sub (f32.reinterpret_i32 (get_local 0)) (f32.const 0)))
)
(func (export "nan-canonicalization-f32-mul") (param i32) (result i32)
(i32.reinterpret_f32 (f32.mul (f32.reinterpret_i32 (get_local 0)) (f32.const 0)))
)
(func (export "nan-canonicalization-f32-div") (param i32) (result i32)
(i32.reinterpret_f32 (f32.div (f32.reinterpret_i32 (get_local 0)) (f32.const 1)))
)
(func (export "nan-canonicalization-f32-max") (param i32) (result i32)
(i32.reinterpret_f32 (f32.max (f32.reinterpret_i32 (get_local 0)) (f32.const 1)))
)
(func (export "nan-canonicalization-f32-min") (param i32) (result i32)
(i32.reinterpret_f32 (f32.min (f32.reinterpret_i32 (get_local 0)) (f32.const 1)))
)
(func (export "nan-canonicalization-f32-nearest") (param i32) (result i32)
(i32.reinterpret_f32 (f32.nearest (f32.reinterpret_i32 (get_local 0))))
)
(func (export "nan-canonicalization-f32-floor") (param i32) (result i32)
(i32.reinterpret_f32 (f32.floor (f32.reinterpret_i32 (get_local 0))))
)
(func (export "nan-canonicalization-f32-ceil") (param i32) (result i32)
(i32.reinterpret_f32 (f32.ceil (f32.reinterpret_i32 (get_local 0))))
)
(func (export "nan-canonicalization-f32-trunc") (param i32) (result i32)
(i32.reinterpret_f32 (f32.trunc (f32.reinterpret_i32 (get_local 0))))
)
(func (export "nan-canonicalization-f32-sqrt") (param i32) (result i32)
(i32.reinterpret_f32 (f32.sqrt (f32.reinterpret_i32 (get_local 0))))
)
(func (export "nan-canonicalization-f32-mem") (param i32) (result i32)
(f32.store (i32.const 0) (f32.reinterpret_i32 (get_local 0)))
(i32.reinterpret_f32 (f32.load (i32.const 0)))
)
(func (export "nan-canonicalization-f32-mem-cncl") (param i32) (result i32)
(f32.store (i32.const 0) (f32.add (f32.reinterpret_i32 (get_local 0)) (f32.const 0)))
(i32.reinterpret_f32 (f32.load (i32.const 0)))
)
(func (export "nan-canonicalization-f32-local") (param i32) (result i32)
(local f32)
(set_local 1 (f32.reinterpret_i32 (get_local 0)))
(i32.reinterpret_f32 (get_local 1))
)
(func (export "nan-canonicalization-f32-local-cncl") (param i32) (result i32)
(local f32)
(set_local 1 (f32.add (f32.reinterpret_i32 (get_local 0)) (f32.const 0)))
(i32.reinterpret_f32 (get_local 1))
)
(func $nan-canonicalization-f32-func-call-target (param f32) (result f32)
(get_local 0)
)
(func (export "nan-canonicalization-f32-func-call") (param i32) (result i32)
(i32.reinterpret_f32 (call $nan-canonicalization-f32-func-call-target (f32.reinterpret_i32 (get_local 0))))
)
(func (export "nan-canonicalization-f32-func-call-cncl") (param i32) (result i32)
(i32.reinterpret_f32 (call $nan-canonicalization-f32-func-call-target (f32.add (f32.reinterpret_i32 (get_local 0)) (f32.const 0))))
)
(func (export "nan-canonicalization-f32-func-call-indirect") (param i32) (result i32)
(i32.reinterpret_f32 (call_indirect (type $f32-id) (f32.reinterpret_i32 (get_local 0)) (i32.const 1)))
)
(func (export "nan-canonicalization-f32-func-call-indirect-cncl") (param i32) (result i32)
(i32.reinterpret_f32 (call_indirect (type $f32-id) (f32.add (f32.reinterpret_i32 (get_local 0)) (f32.const 0)) (i32.const 1)))
)
(func (export "nan-canonicalization-f64-add") (param i64) (result i64)
(i64.reinterpret_f64 (f64.add (f64.reinterpret_i64 (get_local 0)) (f64.const 0)))
)
(func (export "nan-canonicalization-f64-sub") (param i64) (result i64)
(i64.reinterpret_f64 (f64.sub (f64.reinterpret_i64 (get_local 0)) (f64.const 0)))
)
(func (export "nan-canonicalization-f64-mul") (param i64) (result i64)
(i64.reinterpret_f64 (f64.mul (f64.reinterpret_i64 (get_local 0)) (f64.const 0)))
)
(func (export "nan-canonicalization-f64-div") (param i64) (result i64)
(i64.reinterpret_f64 (f64.div (f64.reinterpret_i64 (get_local 0)) (f64.const 1)))
)
(func (export "nan-canonicalization-f64-max") (param i64) (result i64)
(i64.reinterpret_f64 (f64.max (f64.reinterpret_i64 (get_local 0)) (f64.const 1)))
)
(func (export "nan-canonicalization-f64-min") (param i64) (result i64)
(i64.reinterpret_f64 (f64.min (f64.reinterpret_i64 (get_local 0)) (f64.const 1)))
)
(func (export "nan-canonicalization-f64-nearest") (param i64) (result i64)
(i64.reinterpret_f64 (f64.nearest (f64.reinterpret_i64 (get_local 0))))
)
(func (export "nan-canonicalization-f64-floor") (param i64) (result i64)
(i64.reinterpret_f64 (f64.floor (f64.reinterpret_i64 (get_local 0))))
)
(func (export "nan-canonicalization-f64-ceil") (param i64) (result i64)
(i64.reinterpret_f64 (f64.ceil (f64.reinterpret_i64 (get_local 0))))
)
(func (export "nan-canonicalization-f64-trunc") (param i64) (result i64)
(i64.reinterpret_f64 (f64.trunc (f64.reinterpret_i64 (get_local 0))))
)
(func (export "nan-canonicalization-f64-sqrt") (param i64) (result i64)
(i64.reinterpret_f64 (f64.sqrt (f64.reinterpret_i64 (get_local 0))))
)
(func (export "nan-canonicalization-f64-mem") (param i64) (result i64)
(f64.store (i32.const 0) (f64.reinterpret_i64 (get_local 0)))
(i64.reinterpret_f64 (f64.load (i32.const 0)))
)
(func (export "nan-canonicalization-f64-mem-cncl") (param i64) (result i64)
(f64.store (i32.const 0) (f64.add (f64.reinterpret_i64 (get_local 0)) (f64.const 0)))
(i64.reinterpret_f64 (f64.load (i32.const 0)))
)
(func (export "nan-canonicalization-f64-local") (param i64) (result i64)
(local f64)
(set_local 1 (f64.reinterpret_i64 (get_local 0)))
(i64.reinterpret_f64 (get_local 1))
)
(func (export "nan-canonicalization-f64-local-cncl") (param i64) (result i64)
(local f64)
(set_local 1 (f64.add (f64.reinterpret_i64 (get_local 0)) (f64.const 0)))
(i64.reinterpret_f64 (get_local 1))
)
(func $nan-canonicalization-f64-func-call-target (param f64) (result f64)
(get_local 0)
)
(func (export "nan-canonicalization-f64-func-call") (param i64) (result i64)
(i64.reinterpret_f64 (call $nan-canonicalization-f64-func-call-target (f64.reinterpret_i64 (get_local 0))))
)
(func (export "nan-canonicalization-f64-func-call-cncl") (param i64) (result i64)
(i64.reinterpret_f64 (call $nan-canonicalization-f64-func-call-target (f64.add (f64.reinterpret_i64 (get_local 0)) (f64.const 0))))
)
(func (export "nan-canonicalization-f64-func-call-indirect") (param i64) (result i64)
(i64.reinterpret_f64 (call_indirect (type $f64-id) (f64.reinterpret_i64 (get_local 0)) (i32.const 2)))
)
(func (export "nan-canonicalization-f64-func-call-indirect-cncl") (param i64) (result i64)
(i64.reinterpret_f64 (call_indirect (type $f64-id) (f64.add (f64.reinterpret_i64 (get_local 0)) (f64.const 0)) (i32.const 2)))
)
)
(assert_return (invoke "call-indirect-from-spilled-stack") (i32.const 0x132))
(assert_return (invoke "nan-canonicalization-f32-add" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
(assert_return (invoke "nan-canonicalization-f32-sub" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
(assert_return (invoke "nan-canonicalization-f32-mul" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
(assert_return (invoke "nan-canonicalization-f32-div" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
(assert_return (invoke "nan-canonicalization-f32-max" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
(assert_return (invoke "nan-canonicalization-f32-min" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
(assert_return (invoke "nan-canonicalization-f32-nearest" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
(assert_return (invoke "nan-canonicalization-f32-floor" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
(assert_return (invoke "nan-canonicalization-f32-ceil" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
(assert_return (invoke "nan-canonicalization-f32-trunc" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
(assert_return (invoke "nan-canonicalization-f32-sqrt" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
(assert_return (invoke "nan-canonicalization-f32-mem" (i32.const 0x7fc00001)) (i32.const 0x7fc00001))
(assert_return (invoke "nan-canonicalization-f32-mem-cncl" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
(assert_return (invoke "nan-canonicalization-f32-local" (i32.const 0x7fc00001)) (i32.const 0x7fc00001))
(assert_return (invoke "nan-canonicalization-f32-local-cncl" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
(assert_return (invoke "nan-canonicalization-f32-func-call" (i32.const 0x7fc00001)) (i32.const 0x7fc00001))
(assert_return (invoke "nan-canonicalization-f32-func-call-cncl" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
(assert_return (invoke "nan-canonicalization-f32-func-call-indirect" (i32.const 0x7fc00001)) (i32.const 0x7fc00001))
(assert_return (invoke "nan-canonicalization-f32-func-call-indirect-cncl" (i32.const 0x7fc00001)) (i32.const 0x7fc00000))
(assert_return (invoke "nan-canonicalization-f64-add" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
(assert_return (invoke "nan-canonicalization-f64-sub" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
(assert_return (invoke "nan-canonicalization-f64-mul" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
(assert_return (invoke "nan-canonicalization-f64-div" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
(assert_return (invoke "nan-canonicalization-f64-max" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
(assert_return (invoke "nan-canonicalization-f64-min" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
(assert_return (invoke "nan-canonicalization-f64-nearest" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
(assert_return (invoke "nan-canonicalization-f64-floor" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
(assert_return (invoke "nan-canonicalization-f64-ceil" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
(assert_return (invoke "nan-canonicalization-f64-trunc" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
(assert_return (invoke "nan-canonicalization-f64-sqrt" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
(assert_return (invoke "nan-canonicalization-f64-mem" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000001))
(assert_return (invoke "nan-canonicalization-f64-mem-cncl" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
(assert_return (invoke "nan-canonicalization-f64-local" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000001))
(assert_return (invoke "nan-canonicalization-f64-local-cncl" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
(assert_return (invoke "nan-canonicalization-f64-func-call" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000001))
(assert_return (invoke "nan-canonicalization-f64-func-call-cncl" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))
(assert_return (invoke "nan-canonicalization-f64-func-call-indirect" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000001))
(assert_return (invoke "nan-canonicalization-f64-func-call-indirect-cncl" (i64.const 0x7ff8000000000001)) (i64.const 0x7ff8000000000000))

View File

@ -244,10 +244,6 @@ clif:fail:exports.wast:167:windows # Module - caught panic Any
clif:fail:exports.wast:168:windows # Module - caught panic Any
clif:fail:exports.wast:169:windows # Module - caught panic Any
clif:fail:exports.wast:170:windows # Module - caught panic Any
clif:fail:f32.wast:2496:windows # "AssertReturnArithmeticNan" - value is not arithmetic nan F32(NaN)
clif:fail:f32.wast:2498:windows # "AssertReturnArithmeticNan" - value is not arithmetic nan F32(NaN)
clif:fail:f64.wast:2496:windows # "AssertReturnArithmeticNan" - value is not arithmetic nan F64(NaN)
clif:fail:f64.wast:2498:windows # "AssertReturnArithmeticNan" - value is not arithmetic nan F64(NaN)
clif:fail:func.wast:289:windows # Module - caught panic Any
clif:fail:memory.wast:3:windows # Module - caught panic Any
clif:fail:memory.wast:4:windows # Module - caught panic Any
@ -524,3 +520,35 @@ singlepass:fail:traps.wast:54:*:aarch64 # AssertTrap - expected trap, got []
singlepass:fail:traps.wast:55:*:aarch64 # AssertTrap - expected trap, got []
singlepass:fail:traps.wast:56:*:aarch64 # AssertTrap - expected trap, got []
singlepass:fail:traps.wast:57:*:aarch64 # AssertTrap - expected trap, got []
# NaN canonicalization is not yet implemented for aarch64.
singlepass:fail:wasmer.wast:177:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
singlepass:fail:wasmer.wast:178:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
singlepass:fail:wasmer.wast:179:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
singlepass:fail:wasmer.wast:180:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
singlepass:fail:wasmer.wast:181:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
singlepass:fail:wasmer.wast:182:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
singlepass:fail:wasmer.wast:183:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
singlepass:fail:wasmer.wast:184:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
singlepass:fail:wasmer.wast:185:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
singlepass:fail:wasmer.wast:186:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
singlepass:fail:wasmer.wast:187:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
singlepass:fail:wasmer.wast:189:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
singlepass:fail:wasmer.wast:191:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
singlepass:fail:wasmer.wast:193:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
singlepass:fail:wasmer.wast:195:*:aarch64 # AssertReturn - result I32(2143289345) ("0x7fc00001") does not match expected I32(2143289344) ("0x7fc00000")
singlepass:fail:wasmer.wast:197:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
singlepass:fail:wasmer.wast:198:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
singlepass:fail:wasmer.wast:199:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
singlepass:fail:wasmer.wast:200:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
singlepass:fail:wasmer.wast:201:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
singlepass:fail:wasmer.wast:202:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
singlepass:fail:wasmer.wast:203:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
singlepass:fail:wasmer.wast:204:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
singlepass:fail:wasmer.wast:205:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
singlepass:fail:wasmer.wast:206:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
singlepass:fail:wasmer.wast:207:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
singlepass:fail:wasmer.wast:209:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
singlepass:fail:wasmer.wast:211:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
singlepass:fail:wasmer.wast:213:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")
singlepass:fail:wasmer.wast:215:*:aarch64 # AssertReturn - result I64(9221120237041090561) ("0x7ff8000000000001") does not match expected I64(9221120237041090560) ("0x7ff8000000000000")

View File

@ -336,6 +336,7 @@ mod tests {
simd: true,
threads: true,
},
nan_canonicalization: true,
..Default::default()
};
let module = compile_with_config(&module.into_vec(), config)
@ -774,6 +775,7 @@ mod tests {
simd: true,
threads: true,
},
nan_canonicalization: true,
..Default::default()
};
compile_with_config(&module.into_vec(), config)
@ -826,6 +828,7 @@ mod tests {
simd: true,
threads: true,
},
nan_canonicalization: true,
..Default::default()
};
compile_with_config(&module.into_vec(), config)
@ -877,6 +880,7 @@ mod tests {
simd: true,
threads: true,
},
nan_canonicalization: true,
..Default::default()
};
let module = compile_with_config(&module.into_vec(), config)
@ -972,6 +976,7 @@ mod tests {
simd: true,
threads: true,
},
nan_canonicalization: true,
..Default::default()
};
let module = compile_with_config(&module.into_vec(), config)

View File

@ -13,4 +13,4 @@ winapi = { version = "0.3.8", features = ["winbase", "errhandlingapi", "minwinde
libc = "0.2.60"
[build-dependencies]
cmake = "0.1"
cc = "1.0"

View File

@ -1,10 +1,10 @@
fn main() {
#[cfg(target_os = "windows")]
{
use cmake::Config;
let project_name = "exception_handling";
let dst = Config::new(project_name).build();
println!("cargo:rustc-link-search=native={}", dst.display());
println!("cargo:rustc-link-lib=static={}", project_name);
if std::env::var("CARGO_CFG_TARGET_OS").expect("TARGET_OS not specified") != "windows" {
return;
}
cc::Build::new()
.include("exception_handling")
.file("exception_handling/exception_handling.c")
.compile("exception_handling");
}

View File

@ -1 +0,0 @@
cmake-build-*

View File

@ -1,6 +0,0 @@
cmake_minimum_required(VERSION 3.0)
project(exception_handling C)
add_library(exception_handling STATIC exception_handling.c)
install(TARGETS exception_handling DESTINATION .)

View File

@ -1,5 +1,6 @@
#include <windows.h>
#include <setjmp.h>
#include <intrin.h>
#include "exception_handling.h"
#define CALL_FIRST 1