From 5c15ff9673c2459dc31623cf997b527ea1108a28 Mon Sep 17 00:00:00 2001 From: losfair Date: Thu, 9 Jan 2020 01:42:21 +0800 Subject: [PATCH 01/12] `ExceptionCode` and `ExceptionTable`. --- lib/runtime-core/src/backend.rs | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/lib/runtime-core/src/backend.rs b/lib/runtime-core/src/backend.rs index 19995f3a7a8..96e6eb30a9c 100644 --- a/lib/runtime-core/src/backend.rs +++ b/lib/runtime-core/src/backend.rs @@ -183,6 +183,26 @@ pub struct CompilerConfig { pub backend_specific_config: Option, } +/// An exception table for a `RunnableModule`. +#[derive(Clone, Debug, Default)] +pub struct ExceptionTable { + /// Mappings from offsets in generated machine code to the corresponding exception code. + pub offset_to_code: HashMap, +} + +/// The code of an exception. +#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd)] +pub enum ExceptionCode { + /// An `unreachable` opcode was executed. + Unreachable, + + /// An arithmetic exception, e.g. divided by zero. + Arithmetic, + + /// Memory access exception, e.g. misaligned/out-of-bound read/write. + Memory, +} + pub trait Compiler { /// Compiles a `Module` from WebAssembly binary format. /// The `CompileToken` parameter ensures that this can only @@ -214,6 +234,10 @@ pub trait RunnableModule: Send + Sync { None } + fn get_exception_table(&self) -> Option<&ExceptionTable> { + None + } + unsafe fn patch_local_function(&self, _idx: usize, _target_address: usize) -> bool { false } From f44517b9fb5bb123a91f0801c9eca4272860feda Mon Sep 17 00:00:00 2001 From: losfair Date: Thu, 9 Jan 2020 01:42:50 +0800 Subject: [PATCH 02/12] Look up exception tables in trap handler. --- lib/runtime-core/src/fault.rs | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/runtime-core/src/fault.rs b/lib/runtime-core/src/fault.rs index 2628e5df5c4..d30578624f6 100644 --- a/lib/runtime-core/src/fault.rs +++ b/lib/runtime-core/src/fault.rs @@ -375,15 +375,23 @@ extern "C" fn signal_trap_handler( _ => {} } + // Now we have looked up all possible handler tables but failed to find a handler + // for this exception that allows a normal return. + // + // So here we check whether this exception is caused by a suspend signal, return the + // state image if so, or throw the exception out otherwise. + let ctx: &mut vm::Ctx = &mut **CURRENT_CTX.with(|x| x.get()); let es_image = fault .read_stack(None) .expect("fault.read_stack() failed. Broken invariants?"); if is_suspend_signal { + // If this is a suspend signal, we parse the runtime state and return the resulting image. let image = build_instance_image(ctx, es_image); unwind_result = Box::new(image); } else { + // Otherwise, this is a real exception and we just throw it to the caller. if es_image.frames.len() > 0 { eprintln!( "\n{}", @@ -391,7 +399,26 @@ extern "C" fn signal_trap_handler( ); es_image.print_backtrace_if_needed(); } - // Just let the error propagate otherwise + + // Look up the exception tables and try to find an exception code. + let exc_code = CURRENT_CODE_VERSIONS.with(|versions| { + let versions = versions.borrow(); + for v in versions.iter() { + if let Some(table) = v.runnable_module.get_exception_table() { + let ip = fault.ip.get(); + let end = v.base + v.msm.total_size; + if ip >= v.base && ip < end { + if let Some(exc_code) = table.offset_to_code.get(&(ip - v.base)) { + return Some(*exc_code); + } + } + } + } + None + }); + if let Some(code) = exc_code { + unwind_result = Box::new(code); + } } true From 4b5b8976e9616084dbd088123236253ebd452055 Mon Sep 17 00:00:00 2001 From: losfair Date: Fri, 10 Jan 2020 02:53:08 +0800 Subject: [PATCH 03/12] Serialize/deserialize exception codes. --- lib/runtime-core/src/backend.rs | 10 ++++++++-- lib/runtime-core/src/error.rs | 3 +++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/lib/runtime-core/src/backend.rs b/lib/runtime-core/src/backend.rs index 96e6eb30a9c..aceb752a755 100644 --- a/lib/runtime-core/src/backend.rs +++ b/lib/runtime-core/src/backend.rs @@ -184,14 +184,20 @@ pub struct CompilerConfig { } /// An exception table for a `RunnableModule`. -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug, Default, Serialize, Deserialize)] pub struct ExceptionTable { /// Mappings from offsets in generated machine code to the corresponding exception code. pub offset_to_code: HashMap, } +impl ExceptionTable { + pub fn new() -> Self { + Self::default() + } +} + /// The code of an exception. -#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd)] +#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Serialize, Deserialize)] pub enum ExceptionCode { /// An `unreachable` opcode was executed. Unreachable, diff --git a/lib/runtime-core/src/error.rs b/lib/runtime-core/src/error.rs index 391386e3b4f..fad87600549 100644 --- a/lib/runtime-core/src/error.rs +++ b/lib/runtime-core/src/error.rs @@ -1,6 +1,7 @@ //! The error module contains the data structures and helper functions used to implement errors that //! are produced and returned from the wasmer runtime core. use crate::types::{FuncSig, GlobalDescriptor, MemoryDescriptor, TableDescriptor, Type}; +use crate::backend::ExceptionCode; use core::borrow::Borrow; use std::any::Any; @@ -208,6 +209,8 @@ impl std::fmt::Display for RuntimeError { write!(f, "\"{}\"", s) } else if let Some(s) = data.downcast_ref::<&str>() { write!(f, "\"{}\"", s) + } else if let Some(exc_code) = data.downcast_ref::() { + write!(f, "\"{:?}\"", exc_code) } else { write!(f, "unknown error") } From 8bf0c1966cf6dc698d6554db03b0ca5b47320df0 Mon Sep 17 00:00:00 2001 From: losfair Date: Fri, 10 Jan 2020 02:53:31 +0800 Subject: [PATCH 04/12] Push code version for non-WASI entrypoints. --- src/bin/wasmer.rs | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/bin/wasmer.rs b/src/bin/wasmer.rs index 04ef6d3a2f3..cf33d2e5bab 100644 --- a/src/bin/wasmer.rs +++ b/src/bin/wasmer.rs @@ -41,6 +41,11 @@ use wasmer_runtime_core::{ loader::{Instance as LoadedInstance, LocalLoader}, Module, }; +#[cfg(unix)] +use wasmer_runtime_core::{ + fault::{pop_code_version, push_code_version}, + state::CodeVersion, +}; #[cfg(feature = "wasi")] use wasmer_wasi; @@ -472,12 +477,6 @@ fn execute_wasi( #[cfg(not(feature = "managed"))] { use wasmer_runtime::error::RuntimeError; - #[cfg(unix)] - use wasmer_runtime_core::{ - fault::{pop_code_version, push_code_version}, - state::CodeVersion, - }; - let result; #[cfg(unix)] @@ -849,11 +848,32 @@ fn execute_wasm(options: &Run) -> Result<(), String> { }; let args = options.parse_args(&module, invoke_fn)?; + #[cfg(unix)] + let cv_pushed = if let Some(msm) = instance.module.runnable_module.get_module_state_map() { + push_code_version(CodeVersion { + baseline: true, + msm: msm, + base: instance.module.runnable_module.get_code().unwrap().as_ptr() as usize, + backend: options.backend, + runnable_module: instance.module.runnable_module.clone(), + }); + true + } else { + false + }; + let result = instance .dyn_func(&invoke_fn) .map_err(|e| format!("{:?}", e))? .call(&args) .map_err(|e| format!("{:?}", e))?; + + #[cfg(unix)] + { + if cv_pushed { + pop_code_version().unwrap(); + } + } println!("{}({:?}) returned {:?}", invoke_fn, args, result); } } From 0a23327401801873c9c135ad92db814fec044d5c Mon Sep 17 00:00:00 2001 From: losfair Date: Fri, 10 Jan 2020 02:54:23 +0800 Subject: [PATCH 05/12] Emit exception table in singlepass. --- lib/singlepass-backend/src/codegen_x64.rs | 162 ++++++++++++++++++++-- 1 file changed, 154 insertions(+), 8 deletions(-) diff --git a/lib/singlepass-backend/src/codegen_x64.rs b/lib/singlepass-backend/src/codegen_x64.rs index ccc1089931b..c39fab5a5ea 100644 --- a/lib/singlepass-backend/src/codegen_x64.rs +++ b/lib/singlepass-backend/src/codegen_x64.rs @@ -25,6 +25,7 @@ use wasmer_runtime_core::{ sys::{Memory, Protect}, Architecture, Backend, CacheGen, CompilerConfig, InlineBreakpoint, InlineBreakpointType, MemoryBoundCheckMode, RunnableModule, Token, + ExceptionTable, ExceptionCode, }, cache::{Artifact, Error as CacheError}, codegen::*, @@ -224,6 +225,8 @@ pub struct X64FunctionCode { unreachable_depth: usize, config: Arc, + + exception_table: Option, } enum FuncPtrInner {} @@ -242,6 +245,7 @@ pub struct X64ExecutionContext { breakpoints: BreakpointMap, func_import_count: usize, msm: ModuleStateMap, + exception_table: ExceptionTable, } /// On-disk cache format. @@ -264,6 +268,9 @@ pub struct CacheImage { /// Module state map. msm: ModuleStateMap, + + /// An exception table that maps instruction offsets to exception codes. + exception_table: ExceptionTable, } #[derive(Debug)] @@ -322,6 +329,10 @@ impl RunnableModule for X64ExecutionContext { Some(self.breakpoints.clone()) } + fn get_exception_table(&self) -> Option<&ExceptionTable> { + Some(&self.exception_table) + } + unsafe fn patch_local_function(&self, idx: usize, target_address: usize) -> bool { /* 0: 48 b8 42 42 42 42 42 42 42 42 movabsq $4774451407313060418, %rax @@ -662,16 +673,18 @@ impl ModuleCodeGenerator &mut self, _module_info: Arc>, ) -> Result<&mut X64FunctionCode, CodegenError> { - let (mut assembler, mut function_labels, breakpoints) = match self.functions.last_mut() { + let (mut assembler, mut function_labels, breakpoints, exception_table) = match self.functions.last_mut() { Some(x) => ( x.assembler.take().unwrap(), x.function_labels.take().unwrap(), x.breakpoints.take().unwrap(), + x.exception_table.take().unwrap(), ), None => ( self.assembler.take().unwrap(), self.function_labels.take().unwrap(), HashMap::new(), + ExceptionTable::new(), ), }; @@ -707,6 +720,7 @@ impl ModuleCodeGenerator machine, unreachable_depth: 0, config: self.config.as_ref().unwrap().clone(), + exception_table: Some(exception_table), }; self.functions.push(code); Ok(self.functions.last_mut().unwrap()) @@ -716,16 +730,18 @@ impl ModuleCodeGenerator mut self, _: &ModuleInfo, ) -> Result<(X64ExecutionContext, Box), CodegenError> { - let (assembler, function_labels, breakpoints) = match self.functions.last_mut() { + let (assembler, function_labels, breakpoints, exception_table) = match self.functions.last_mut() { Some(x) => ( x.assembler.take().unwrap(), x.function_labels.take().unwrap(), x.breakpoints.take().unwrap(), + x.exception_table.take().unwrap(), ), None => ( self.assembler.take().unwrap(), self.function_labels.take().unwrap(), HashMap::new(), + ExceptionTable::new(), ), }; @@ -797,6 +813,7 @@ impl ModuleCodeGenerator function_offsets: out_offsets.iter().map(|x| x.0 as usize).collect(), func_import_count: self.func_import_count, msm: msm.clone(), + exception_table: exception_table.clone(), }; let cache = SinglepassCache { @@ -812,6 +829,7 @@ impl ModuleCodeGenerator function_pointers: out_labels, function_offsets: out_offsets, msm: msm, + exception_table, }, Box::new(cache), )) @@ -915,6 +933,7 @@ impl ModuleCodeGenerator breakpoints: Arc::new(HashMap::new()), func_import_count: cache_image.func_import_count, msm: cache_image.msm, + exception_table: cache_image.exception_table, }; Ok(ModuleInner { runnable_module: Arc::new(Box::new(ec)), @@ -947,10 +966,22 @@ impl X64FunctionCode { .insert(m.state.wasm_inst_offset, SuspendOffset::Trappable(offset)); } + /// Marks each address in the code range emitted by `f` with the exception code `code`. + fn mark_range_with_exception_code R, R>(a: &mut Assembler, etable: &mut ExceptionTable, code: ExceptionCode, f: F) -> R { + let begin = a.get_offset().0; + let ret = f(a); + let end = a.get_offset().0; + for i in begin..end { + etable.offset_to_code.insert(i, code); + } + ret + } + /// Moves `loc` to a valid location for `div`/`idiv`. fn emit_relaxed_xdiv( a: &mut Assembler, m: &mut Machine, + etable: &mut ExceptionTable, op: fn(&mut Assembler, Size, Location), sz: Size, loc: Location, @@ -962,10 +993,12 @@ impl X64FunctionCode { Location::Imm64(_) | Location::Imm32(_) => { a.emit_mov(sz, loc, Location::GPR(GPR::RCX)); // must not be used during div (rax, rdx) Self::mark_trappable(a, m, fsm, control_stack); + etable.offset_to_code.insert(a.get_offset().0, ExceptionCode::Arithmetic); op(a, sz, Location::GPR(GPR::RCX)); } _ => { Self::mark_trappable(a, m, fsm, control_stack); + etable.offset_to_code.insert(a.get_offset().0, ExceptionCode::Arithmetic); op(a, sz, loc); } } @@ -1876,6 +1909,7 @@ impl X64FunctionCode { config: &CodegenConfig, a: &mut Assembler, m: &mut Machine, + etable: &mut ExceptionTable, addr: Location, memarg: &MemoryImmediate, check_alignment: bool, @@ -1949,7 +1983,8 @@ impl X64FunctionCode { // Trap if the end address of the requested area is above that of the linear memory. a.emit_add(Size::S64, Location::GPR(tmp_base), Location::GPR(tmp_addr)); a.emit_cmp(Size::S64, Location::GPR(tmp_bound), Location::GPR(tmp_addr)); - a.emit_conditional_trap(Condition::Above); + + Self::mark_range_with_exception_code(a, etable, ExceptionCode::Memory, |a| a.emit_conditional_trap(Condition::Above)); m.release_temp_gpr(tmp_bound); } @@ -1989,11 +2024,13 @@ impl X64FunctionCode { Location::Imm32(align - 1), Location::GPR(tmp_aligncheck), ); - a.emit_conditional_trap(Condition::NotEqual); + Self::mark_range_with_exception_code(a, etable, ExceptionCode::Memory, |a| a.emit_conditional_trap(Condition::NotEqual)); m.release_temp_gpr(tmp_aligncheck); } - cb(a, m, tmp_addr)?; + Self::mark_range_with_exception_code(a, etable, ExceptionCode::Memory, |a| { + cb(a, m, tmp_addr) + })?; m.release_temp_gpr(tmp_addr); Ok(()) @@ -2005,6 +2042,7 @@ impl X64FunctionCode { config: &CodegenConfig, a: &mut Assembler, m: &mut Machine, + etable: &mut ExceptionTable, loc: Location, target: Location, ret: Location, @@ -2038,6 +2076,7 @@ impl X64FunctionCode { config, a, m, + etable, target, memarg, true, @@ -2108,6 +2147,7 @@ impl X64FunctionCode { fn emit_f32_int_conv_check_trap( a: &mut Assembler, m: &mut Machine, + etable: &mut ExceptionTable, reg: XMM, lower_bound: f32, upper_bound: f32, @@ -2117,6 +2157,7 @@ impl X64FunctionCode { Self::emit_f32_int_conv_check(a, m, reg, lower_bound, upper_bound, trap, trap, trap, end); a.emit_label(trap); + etable.offset_to_code.insert(a.get_offset().0, ExceptionCode::Arithmetic); a.emit_ud2(); a.emit_label(end); } @@ -2232,6 +2273,7 @@ impl X64FunctionCode { fn emit_f64_int_conv_check_trap( a: &mut Assembler, m: &mut Machine, + etable: &mut ExceptionTable, reg: XMM, lower_bound: f64, upper_bound: f64, @@ -2241,6 +2283,7 @@ impl X64FunctionCode { Self::emit_f64_int_conv_check(a, m, reg, lower_bound, upper_bound, trap, trap, trap, end); a.emit_label(trap); + etable.offset_to_code.insert(a.get_offset().0, ExceptionCode::Arithmetic); a.emit_ud2(); a.emit_label(end); } @@ -2365,7 +2408,7 @@ impl FunctionCodeGenerator for X64FunctionCode { ), Location::GPR(GPR::RSP), ); - a.emit_conditional_trap(Condition::Below); + Self::mark_range_with_exception_code(a, self.exception_table.as_mut().unwrap(), ExceptionCode::Memory, |a| a.emit_conditional_trap(Condition::Below)); } self.locals = self @@ -2788,6 +2831,7 @@ impl FunctionCodeGenerator for X64FunctionCode { Self::emit_relaxed_xdiv( a, &mut self.machine, + self.exception_table.as_mut().unwrap(), Assembler::emit_div, Size::S32, loc_b, @@ -2813,6 +2857,7 @@ impl FunctionCodeGenerator for X64FunctionCode { Self::emit_relaxed_xdiv( a, &mut self.machine, + self.exception_table.as_mut().unwrap(), Assembler::emit_idiv, Size::S32, loc_b, @@ -2838,6 +2883,7 @@ impl FunctionCodeGenerator for X64FunctionCode { Self::emit_relaxed_xdiv( a, &mut self.machine, + self.exception_table.as_mut().unwrap(), Assembler::emit_div, Size::S32, loc_b, @@ -2889,6 +2935,7 @@ impl FunctionCodeGenerator for X64FunctionCode { Self::emit_relaxed_xdiv( a, &mut self.machine, + self.exception_table.as_mut().unwrap(), Assembler::emit_idiv, Size::S32, loc_b, @@ -3187,6 +3234,7 @@ impl FunctionCodeGenerator for X64FunctionCode { Self::emit_relaxed_xdiv( a, &mut self.machine, + self.exception_table.as_mut().unwrap(), Assembler::emit_div, Size::S64, loc_b, @@ -3212,6 +3260,7 @@ impl FunctionCodeGenerator for X64FunctionCode { Self::emit_relaxed_xdiv( a, &mut self.machine, + self.exception_table.as_mut().unwrap(), Assembler::emit_idiv, Size::S64, loc_b, @@ -3237,6 +3286,7 @@ impl FunctionCodeGenerator for X64FunctionCode { Self::emit_relaxed_xdiv( a, &mut self.machine, + self.exception_table.as_mut().unwrap(), Assembler::emit_div, Size::S64, loc_b, @@ -3296,6 +3346,7 @@ impl FunctionCodeGenerator for X64FunctionCode { Self::emit_relaxed_xdiv( a, &mut self.machine, + self.exception_table.as_mut().unwrap(), Assembler::emit_idiv, Size::S64, loc_b, @@ -4748,6 +4799,7 @@ impl FunctionCodeGenerator for X64FunctionCode { Self::emit_f32_int_conv_check_trap( a, &mut self.machine, + self.exception_table.as_mut().unwrap(), tmp_in, GEF32_LT_U32_MIN, LEF32_GT_U32_MAX, @@ -4859,6 +4911,7 @@ impl FunctionCodeGenerator for X64FunctionCode { Self::emit_f32_int_conv_check_trap( a, &mut self.machine, + self.exception_table.as_mut().unwrap(), tmp_in, GEF32_LT_I32_MIN, LEF32_GT_I32_MAX, @@ -4976,6 +5029,7 @@ impl FunctionCodeGenerator for X64FunctionCode { Self::emit_f32_int_conv_check_trap( a, &mut self.machine, + self.exception_table.as_mut().unwrap(), tmp_in, GEF32_LT_I64_MIN, LEF32_GT_I64_MAX, @@ -5093,6 +5147,7 @@ impl FunctionCodeGenerator for X64FunctionCode { Self::emit_f32_int_conv_check_trap( a, &mut self.machine, + self.exception_table.as_mut().unwrap(), tmp_in, GEF32_LT_U64_MIN, LEF32_GT_U64_MAX, @@ -5253,6 +5308,7 @@ impl FunctionCodeGenerator for X64FunctionCode { Self::emit_f64_int_conv_check_trap( a, &mut self.machine, + self.exception_table.as_mut().unwrap(), tmp_in, GEF64_LT_U32_MIN, LEF64_GT_U32_MAX, @@ -5370,6 +5426,7 @@ impl FunctionCodeGenerator for X64FunctionCode { Self::emit_f64_int_conv_check_trap( a, &mut self.machine, + self.exception_table.as_mut().unwrap(), real_in, GEF64_LT_I32_MIN, LEF64_GT_I32_MAX, @@ -5493,6 +5550,7 @@ impl FunctionCodeGenerator for X64FunctionCode { Self::emit_f64_int_conv_check_trap( a, &mut self.machine, + self.exception_table.as_mut().unwrap(), tmp_in, GEF64_LT_I64_MIN, LEF64_GT_I64_MAX, @@ -5611,6 +5669,7 @@ impl FunctionCodeGenerator for X64FunctionCode { Self::emit_f64_int_conv_check_trap( a, &mut self.machine, + self.exception_table.as_mut().unwrap(), tmp_in, GEF64_LT_U64_MIN, LEF64_GT_U64_MAX, @@ -6210,7 +6269,7 @@ impl FunctionCodeGenerator for X64FunctionCode { Location::GPR(table_base), ); a.emit_cmp(Size::S32, func_index, Location::GPR(table_count)); - a.emit_conditional_trap(Condition::BelowEqual); + Self::mark_range_with_exception_code(a, self.exception_table.as_mut().unwrap(), ExceptionCode::Memory, |a| a.emit_conditional_trap(Condition::BelowEqual)); a.emit_mov(Size::S64, func_index, Location::GPR(table_count)); a.emit_imul_imm32_gpr64(vm::Anyfunc::size() as u32, table_count); a.emit_add( @@ -6236,7 +6295,7 @@ impl FunctionCodeGenerator for X64FunctionCode { Location::GPR(sigidx), Location::Memory(table_count, (vm::Anyfunc::offset_sig_id() as usize) as i32), ); - a.emit_conditional_trap(Condition::NotEqual); + Self::mark_range_with_exception_code(a, self.exception_table.as_mut().unwrap(), ExceptionCode::Memory, |a| a.emit_conditional_trap(Condition::NotEqual)); self.machine.release_temp_gpr(sigidx); self.machine.release_temp_gpr(table_count); @@ -6587,6 +6646,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, false, @@ -6619,6 +6679,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, false, @@ -6651,6 +6712,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, false, @@ -6684,6 +6746,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, false, @@ -6717,6 +6780,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, false, @@ -6750,6 +6814,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, false, @@ -6779,6 +6844,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target_addr, memarg, false, @@ -6807,6 +6873,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target_addr, memarg, false, @@ -6835,6 +6902,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target_addr, memarg, false, @@ -6863,6 +6931,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target_addr, memarg, false, @@ -6895,6 +6964,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, false, @@ -6927,6 +6997,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, false, @@ -6959,6 +7030,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, false, @@ -6992,6 +7064,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, false, @@ -7025,6 +7098,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, false, @@ -7058,6 +7132,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, false, @@ -7091,6 +7166,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, false, @@ -7138,6 +7214,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, false, @@ -7167,6 +7244,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target_addr, memarg, false, @@ -7195,6 +7273,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target_addr, memarg, false, @@ -7223,6 +7302,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target_addr, memarg, false, @@ -7251,6 +7331,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target_addr, memarg, false, @@ -7279,6 +7360,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target_addr, memarg, false, @@ -7298,6 +7380,7 @@ impl FunctionCodeGenerator for X64FunctionCode { } Operator::Unreachable => { Self::mark_trappable(a, &self.machine, &mut self.fsm, &mut self.control_stack); + self.exception_table.as_mut().unwrap().offset_to_code.insert(a.get_offset().0, ExceptionCode::Unreachable); a.emit_ud2(); self.unreachable_depth = 1; } @@ -7526,6 +7609,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -7558,6 +7642,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -7591,6 +7676,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -7620,6 +7706,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target_addr, memarg, true, @@ -7648,6 +7735,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target_addr, memarg, true, @@ -7676,6 +7764,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target_addr, memarg, true, @@ -7708,6 +7797,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -7740,6 +7830,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -7773,6 +7864,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -7806,6 +7898,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -7849,6 +7942,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target_addr, memarg, true, @@ -7877,6 +7971,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target_addr, memarg, true, @@ -7905,6 +8000,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target_addr, memarg, true, @@ -7933,6 +8029,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target_addr, memarg, true, @@ -7969,6 +8066,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -8004,6 +8102,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -8039,6 +8138,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -8070,6 +8170,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -8105,6 +8206,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -8136,6 +8238,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -8171,6 +8274,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -8207,6 +8311,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -8243,6 +8348,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -8279,6 +8385,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -8311,6 +8418,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -8347,6 +8455,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -8379,6 +8488,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -8415,6 +8525,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -8448,6 +8559,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), loc, target, ret, @@ -8477,6 +8589,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), loc, target, ret, @@ -8506,6 +8619,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), loc, target, ret, @@ -8535,6 +8649,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), loc, target, ret, @@ -8564,6 +8679,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), loc, target, ret, @@ -8593,6 +8709,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), loc, target, ret, @@ -8622,6 +8739,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), loc, target, ret, @@ -8651,6 +8769,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), loc, target, ret, @@ -8680,6 +8799,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), loc, target, ret, @@ -8709,6 +8829,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), loc, target, ret, @@ -8738,6 +8859,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), loc, target, ret, @@ -8767,6 +8889,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), loc, target, ret, @@ -8796,6 +8919,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), loc, target, ret, @@ -8825,6 +8949,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), loc, target, ret, @@ -8854,6 +8979,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), loc, target, ret, @@ -8883,6 +9009,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), loc, target, ret, @@ -8912,6 +9039,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), loc, target, ret, @@ -8941,6 +9069,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), loc, target, ret, @@ -8970,6 +9099,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), loc, target, ret, @@ -8999,6 +9129,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), loc, target, ret, @@ -9028,6 +9159,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), loc, target, ret, @@ -9059,6 +9191,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -9090,6 +9223,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -9121,6 +9255,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -9152,6 +9287,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -9183,6 +9319,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -9214,6 +9351,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -9245,6 +9383,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -9290,6 +9429,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -9340,6 +9480,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -9390,6 +9531,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -9440,6 +9582,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -9490,6 +9633,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -9540,6 +9684,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, @@ -9590,6 +9735,7 @@ impl FunctionCodeGenerator for X64FunctionCode { &self.config, a, &mut self.machine, + self.exception_table.as_mut().unwrap(), target, memarg, true, From 9e2080def1328f3b08e770a0d13fd8fa2a2f03c0 Mon Sep 17 00:00:00 2001 From: losfair Date: Fri, 10 Jan 2020 02:54:50 +0800 Subject: [PATCH 06/12] Run cargo fmt. --- lib/runtime-core/src/error.rs | 2 +- lib/singlepass-backend/src/codegen_x64.rs | 121 ++++++++++++++-------- src/bin/wasmer.rs | 25 ++--- 3 files changed, 93 insertions(+), 55 deletions(-) diff --git a/lib/runtime-core/src/error.rs b/lib/runtime-core/src/error.rs index fad87600549..94abce06d5a 100644 --- a/lib/runtime-core/src/error.rs +++ b/lib/runtime-core/src/error.rs @@ -1,7 +1,7 @@ //! The error module contains the data structures and helper functions used to implement errors that //! are produced and returned from the wasmer runtime core. -use crate::types::{FuncSig, GlobalDescriptor, MemoryDescriptor, TableDescriptor, Type}; use crate::backend::ExceptionCode; +use crate::types::{FuncSig, GlobalDescriptor, MemoryDescriptor, TableDescriptor, Type}; use core::borrow::Borrow; use std::any::Any; diff --git a/lib/singlepass-backend/src/codegen_x64.rs b/lib/singlepass-backend/src/codegen_x64.rs index c39fab5a5ea..bcf2acb25cd 100644 --- a/lib/singlepass-backend/src/codegen_x64.rs +++ b/lib/singlepass-backend/src/codegen_x64.rs @@ -23,9 +23,8 @@ use std::{ use wasmer_runtime_core::{ backend::{ sys::{Memory, Protect}, - Architecture, Backend, CacheGen, CompilerConfig, InlineBreakpoint, InlineBreakpointType, - MemoryBoundCheckMode, RunnableModule, Token, - ExceptionTable, ExceptionCode, + Architecture, Backend, CacheGen, CompilerConfig, ExceptionCode, ExceptionTable, + InlineBreakpoint, InlineBreakpointType, MemoryBoundCheckMode, RunnableModule, Token, }, cache::{Artifact, Error as CacheError}, codegen::*, @@ -673,20 +672,21 @@ impl ModuleCodeGenerator &mut self, _module_info: Arc>, ) -> Result<&mut X64FunctionCode, CodegenError> { - let (mut assembler, mut function_labels, breakpoints, exception_table) = match self.functions.last_mut() { - Some(x) => ( - x.assembler.take().unwrap(), - x.function_labels.take().unwrap(), - x.breakpoints.take().unwrap(), - x.exception_table.take().unwrap(), - ), - None => ( - self.assembler.take().unwrap(), - self.function_labels.take().unwrap(), - HashMap::new(), - ExceptionTable::new(), - ), - }; + let (mut assembler, mut function_labels, breakpoints, exception_table) = + match self.functions.last_mut() { + Some(x) => ( + x.assembler.take().unwrap(), + x.function_labels.take().unwrap(), + x.breakpoints.take().unwrap(), + x.exception_table.take().unwrap(), + ), + None => ( + self.assembler.take().unwrap(), + self.function_labels.take().unwrap(), + HashMap::new(), + ExceptionTable::new(), + ), + }; let begin_offset = assembler.offset(); let begin_label_info = function_labels @@ -730,20 +730,21 @@ impl ModuleCodeGenerator mut self, _: &ModuleInfo, ) -> Result<(X64ExecutionContext, Box), CodegenError> { - let (assembler, function_labels, breakpoints, exception_table) = match self.functions.last_mut() { - Some(x) => ( - x.assembler.take().unwrap(), - x.function_labels.take().unwrap(), - x.breakpoints.take().unwrap(), - x.exception_table.take().unwrap(), - ), - None => ( - self.assembler.take().unwrap(), - self.function_labels.take().unwrap(), - HashMap::new(), - ExceptionTable::new(), - ), - }; + let (assembler, function_labels, breakpoints, exception_table) = + match self.functions.last_mut() { + Some(x) => ( + x.assembler.take().unwrap(), + x.function_labels.take().unwrap(), + x.breakpoints.take().unwrap(), + x.exception_table.take().unwrap(), + ), + None => ( + self.assembler.take().unwrap(), + self.function_labels.take().unwrap(), + HashMap::new(), + ExceptionTable::new(), + ), + }; let total_size = assembler.get_offset().0; let _output = assembler.finalize().unwrap(); @@ -967,7 +968,12 @@ impl X64FunctionCode { } /// Marks each address in the code range emitted by `f` with the exception code `code`. - fn mark_range_with_exception_code R, R>(a: &mut Assembler, etable: &mut ExceptionTable, code: ExceptionCode, f: F) -> R { + fn mark_range_with_exception_code R, R>( + a: &mut Assembler, + etable: &mut ExceptionTable, + code: ExceptionCode, + f: F, + ) -> R { let begin = a.get_offset().0; let ret = f(a); let end = a.get_offset().0; @@ -993,12 +999,16 @@ impl X64FunctionCode { Location::Imm64(_) | Location::Imm32(_) => { a.emit_mov(sz, loc, Location::GPR(GPR::RCX)); // must not be used during div (rax, rdx) Self::mark_trappable(a, m, fsm, control_stack); - etable.offset_to_code.insert(a.get_offset().0, ExceptionCode::Arithmetic); + etable + .offset_to_code + .insert(a.get_offset().0, ExceptionCode::Arithmetic); op(a, sz, Location::GPR(GPR::RCX)); } _ => { Self::mark_trappable(a, m, fsm, control_stack); - etable.offset_to_code.insert(a.get_offset().0, ExceptionCode::Arithmetic); + etable + .offset_to_code + .insert(a.get_offset().0, ExceptionCode::Arithmetic); op(a, sz, loc); } } @@ -1984,7 +1994,9 @@ impl X64FunctionCode { a.emit_add(Size::S64, Location::GPR(tmp_base), Location::GPR(tmp_addr)); a.emit_cmp(Size::S64, Location::GPR(tmp_bound), Location::GPR(tmp_addr)); - Self::mark_range_with_exception_code(a, etable, ExceptionCode::Memory, |a| a.emit_conditional_trap(Condition::Above)); + Self::mark_range_with_exception_code(a, etable, ExceptionCode::Memory, |a| { + a.emit_conditional_trap(Condition::Above) + }); m.release_temp_gpr(tmp_bound); } @@ -2024,7 +2036,9 @@ impl X64FunctionCode { Location::Imm32(align - 1), Location::GPR(tmp_aligncheck), ); - Self::mark_range_with_exception_code(a, etable, ExceptionCode::Memory, |a| a.emit_conditional_trap(Condition::NotEqual)); + Self::mark_range_with_exception_code(a, etable, ExceptionCode::Memory, |a| { + a.emit_conditional_trap(Condition::NotEqual) + }); m.release_temp_gpr(tmp_aligncheck); } @@ -2157,7 +2171,9 @@ impl X64FunctionCode { Self::emit_f32_int_conv_check(a, m, reg, lower_bound, upper_bound, trap, trap, trap, end); a.emit_label(trap); - etable.offset_to_code.insert(a.get_offset().0, ExceptionCode::Arithmetic); + etable + .offset_to_code + .insert(a.get_offset().0, ExceptionCode::Arithmetic); a.emit_ud2(); a.emit_label(end); } @@ -2283,7 +2299,9 @@ impl X64FunctionCode { Self::emit_f64_int_conv_check(a, m, reg, lower_bound, upper_bound, trap, trap, trap, end); a.emit_label(trap); - etable.offset_to_code.insert(a.get_offset().0, ExceptionCode::Arithmetic); + etable + .offset_to_code + .insert(a.get_offset().0, ExceptionCode::Arithmetic); a.emit_ud2(); a.emit_label(end); } @@ -2408,7 +2426,12 @@ impl FunctionCodeGenerator for X64FunctionCode { ), Location::GPR(GPR::RSP), ); - Self::mark_range_with_exception_code(a, self.exception_table.as_mut().unwrap(), ExceptionCode::Memory, |a| a.emit_conditional_trap(Condition::Below)); + Self::mark_range_with_exception_code( + a, + self.exception_table.as_mut().unwrap(), + ExceptionCode::Memory, + |a| a.emit_conditional_trap(Condition::Below), + ); } self.locals = self @@ -6269,7 +6292,12 @@ impl FunctionCodeGenerator for X64FunctionCode { Location::GPR(table_base), ); a.emit_cmp(Size::S32, func_index, Location::GPR(table_count)); - Self::mark_range_with_exception_code(a, self.exception_table.as_mut().unwrap(), ExceptionCode::Memory, |a| a.emit_conditional_trap(Condition::BelowEqual)); + Self::mark_range_with_exception_code( + a, + self.exception_table.as_mut().unwrap(), + ExceptionCode::Memory, + |a| a.emit_conditional_trap(Condition::BelowEqual), + ); a.emit_mov(Size::S64, func_index, Location::GPR(table_count)); a.emit_imul_imm32_gpr64(vm::Anyfunc::size() as u32, table_count); a.emit_add( @@ -6295,7 +6323,12 @@ impl FunctionCodeGenerator for X64FunctionCode { Location::GPR(sigidx), Location::Memory(table_count, (vm::Anyfunc::offset_sig_id() as usize) as i32), ); - Self::mark_range_with_exception_code(a, self.exception_table.as_mut().unwrap(), ExceptionCode::Memory, |a| a.emit_conditional_trap(Condition::NotEqual)); + Self::mark_range_with_exception_code( + a, + self.exception_table.as_mut().unwrap(), + ExceptionCode::Memory, + |a| a.emit_conditional_trap(Condition::NotEqual), + ); self.machine.release_temp_gpr(sigidx); self.machine.release_temp_gpr(table_count); @@ -7380,7 +7413,11 @@ impl FunctionCodeGenerator for X64FunctionCode { } Operator::Unreachable => { Self::mark_trappable(a, &self.machine, &mut self.fsm, &mut self.control_stack); - self.exception_table.as_mut().unwrap().offset_to_code.insert(a.get_offset().0, ExceptionCode::Unreachable); + self.exception_table + .as_mut() + .unwrap() + .offset_to_code + .insert(a.get_offset().0, ExceptionCode::Unreachable); a.emit_ud2(); self.unreachable_depth = 1; } diff --git a/src/bin/wasmer.rs b/src/bin/wasmer.rs index cf33d2e5bab..1f62182adaf 100644 --- a/src/bin/wasmer.rs +++ b/src/bin/wasmer.rs @@ -849,18 +849,19 @@ fn execute_wasm(options: &Run) -> Result<(), String> { let args = options.parse_args(&module, invoke_fn)?; #[cfg(unix)] - let cv_pushed = if let Some(msm) = instance.module.runnable_module.get_module_state_map() { - push_code_version(CodeVersion { - baseline: true, - msm: msm, - base: instance.module.runnable_module.get_code().unwrap().as_ptr() as usize, - backend: options.backend, - runnable_module: instance.module.runnable_module.clone(), - }); - true - } else { - false - }; + let cv_pushed = + if let Some(msm) = instance.module.runnable_module.get_module_state_map() { + push_code_version(CodeVersion { + baseline: true, + msm: msm, + base: instance.module.runnable_module.get_code().unwrap().as_ptr() as usize, + backend: options.backend, + runnable_module: instance.module.runnable_module.clone(), + }); + true + } else { + false + }; let result = instance .dyn_func(&invoke_fn) From f4fb1077c95310feaf991c37dc9dbf4d2e7672f2 Mon Sep 17 00:00:00 2001 From: losfair Date: Mon, 13 Jan 2020 22:39:04 +0800 Subject: [PATCH 07/12] Fix type of `backend` passed to `push_code_version`. --- src/bin/wasmer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/wasmer.rs b/src/bin/wasmer.rs index 5c7f1669706..b4a58ee054c 100644 --- a/src/bin/wasmer.rs +++ b/src/bin/wasmer.rs @@ -862,7 +862,7 @@ fn execute_wasm(options: &Run) -> Result<(), String> { baseline: true, msm: msm, base: instance.module.runnable_module.get_code().unwrap().as_ptr() as usize, - backend: options.backend, + backend: options.backend.to_string().to_owned(), runnable_module: instance.module.runnable_module.clone(), }); true From 6dfd5916c27e2a869946ab02bdc0340cde894824 Mon Sep 17 00:00:00 2001 From: losfair Date: Tue, 14 Jan 2020 20:56:34 +0800 Subject: [PATCH 08/12] Improve error message on exception. --- lib/runtime-core/src/error.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/runtime-core/src/error.rs b/lib/runtime-core/src/error.rs index 94abce06d5a..266bd444e27 100644 --- a/lib/runtime-core/src/error.rs +++ b/lib/runtime-core/src/error.rs @@ -210,7 +210,7 @@ impl std::fmt::Display for RuntimeError { } else if let Some(s) = data.downcast_ref::<&str>() { write!(f, "\"{}\"", s) } else if let Some(exc_code) = data.downcast_ref::() { - write!(f, "\"{:?}\"", exc_code) + write!(f, "Caught exception of type \"{:?}\".", exc_code) } else { write!(f, "unknown error") } From 35870b33e5f4dcbfe17866bdf8927ed3f3e4ab49 Mon Sep 17 00:00:00 2001 From: losfair Date: Thu, 16 Jan 2020 02:59:27 +0800 Subject: [PATCH 09/12] Update spectests to test singlepass traps. --- lib/runtime/src/lib.rs | 8 +- lib/spectests/tests/excludes.txt | 467 ------------------------------- lib/spectests/tests/spectest.rs | 75 ++++- 3 files changed, 67 insertions(+), 483 deletions(-) diff --git a/lib/runtime/src/lib.rs b/lib/runtime/src/lib.rs index a4913896d4b..b26dc50e9b1 100644 --- a/lib/runtime/src/lib.rs +++ b/lib/runtime/src/lib.rs @@ -94,7 +94,7 @@ #[macro_use] extern crate serde_derive; -pub use wasmer_runtime_core::backend::Features; +pub use wasmer_runtime_core::backend::{ExceptionCode, Features}; pub use wasmer_runtime_core::codegen::{MiddlewareChain, StreamingCompiler}; pub use wasmer_runtime_core::export::Export; pub use wasmer_runtime_core::global::Global; @@ -111,6 +111,12 @@ pub use wasmer_runtime_core::Func; pub use wasmer_runtime_core::{compile_with, validate}; pub use wasmer_runtime_core::{func, imports}; +#[cfg(unix)] +pub use wasmer_runtime_core::{ + fault::{pop_code_version, push_code_version}, + state::CodeVersion, +}; + pub mod memory { //! The memory module contains the implementation data structures and helper functions used to //! manipulate and access wasm memory. diff --git a/lib/spectests/tests/excludes.txt b/lib/spectests/tests/excludes.txt index 4919f9338b3..b1c6e5dc8d7 100644 --- a/lib/spectests/tests/excludes.txt +++ b/lib/spectests/tests/excludes.txt @@ -312,7 +312,6 @@ singlepass:skip:simd_binaryen.wast:* # SIMD not implemented singlepass:skip:atomic.wast:*:*:aarch64 # Threads not yet supported on singlepass -singlepass:fail:address.wast:192 # AssertTrap - expected trap, got Runtime:Error unknown error singlepass:fail:address.wast:194 # AssertTrap - expected trap, got [] singlepass:fail:address.wast:195 # AssertTrap - expected trap, got [] singlepass:fail:address.wast:196 # AssertTrap - expected trap, got [] @@ -323,7 +322,6 @@ singlepass:fail:address.wast:201 # AssertTrap - expected trap, got [] singlepass:fail:address.wast:202 # AssertTrap - expected trap, got [] singlepass:fail:address.wast:203 # AssertTrap - expected trap, got [] singlepass:fail:address.wast:204 # AssertTrap - expected trap, got [] -singlepass:fail:address.wast:479 # AssertTrap - expected trap, got Runtime:Error unknown error singlepass:fail:address.wast:481 # AssertTrap - expected trap, got [] singlepass:fail:address.wast:482 # AssertTrap - expected trap, got [] singlepass:fail:address.wast:483 # AssertTrap - expected trap, got [] @@ -338,486 +336,21 @@ singlepass:fail:address.wast:492 # AssertTrap - expected trap, got [] singlepass:fail:address.wast:493 # AssertTrap - expected trap, got [] singlepass:fail:address.wast:494 # AssertTrap - expected trap, got [] singlepass:fail:address.wast:495 # AssertTrap - expected trap, got [] -singlepass:fail:address.wast:539 # AssertTrap - expected trap, got Runtime:Error unknown error singlepass:fail:address.wast:541 # AssertTrap - expected trap, got [] singlepass:fail:address.wast:542 # AssertTrap - expected trap, got [] -singlepass:fail:address.wast:586 # AssertTrap - expected trap, got Runtime:Error unknown error singlepass:fail:address.wast:588 # AssertTrap - expected trap, got [] singlepass:fail:address.wast:589 # AssertTrap - expected trap, got [] -singlepass:fail:align.wast:864 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:380 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:381 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:382 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:383 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:384 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:385 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:386 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:387 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:388 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:389 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:390 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:391 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:392 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:393 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:394 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:395 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:396 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:397 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:398 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:399 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:400 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:401 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:402 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:403 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:404 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:405 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:406 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:407 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:408 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:409 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:410 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:411 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:412 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:413 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:414 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:415 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:416 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:417 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:418 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:419 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:420 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:421 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:422 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:423 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:atomic.wast:424 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:call.wast:289 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:call_indirect.wast:469 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:call_indirect.wast:470 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:call_indirect.wast:471 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:call_indirect.wast:472 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:call_indirect.wast:473 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:call_indirect.wast:479 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:call_indirect.wast:480 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:call_indirect.wast:486 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:call_indirect.wast:487 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:call_indirect.wast:493 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:call_indirect.wast:494 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:call_indirect.wast:500 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:call_indirect.wast:501 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:83 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:84 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:85 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:86 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:87 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:88 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:89 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:90 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:105 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:106 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:107 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:108 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:109 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:110 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:111 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:112 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:128 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:129 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:130 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:131 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:132 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:133 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:134 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:135 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:151 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:152 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:153 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:154 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:155 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:156 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:157 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:158 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:159 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:160 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:161 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:179 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:180 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:181 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:182 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:183 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:184 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:185 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:186 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:199 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:200 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:201 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:202 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:203 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:204 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:205 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:206 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:224 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:225 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:226 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:227 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:228 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:229 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:230 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:231 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:248 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:249 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:250 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:251 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:252 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:253 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:254 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:conversions.wast:255 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:elem.wast:353 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:func_ptrs.wast:78 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:func_ptrs.wast:79 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:func_ptrs.wast:80 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:func_ptrs.wast:89 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:func_ptrs.wast:90 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:func_ptrs.wast:91 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:globals.wast:221 # AssertTrap - expected trap, got Runtime:Error unknown error singlepass:fail:globals.wast:243 # AssertInvalid - Should be invalid -singlepass:fail:i32.wast:62 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:i32.wast:63 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:i32.wast:64 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:i32.wast:82 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:i32.wast:83 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:i32.wast:99 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:i32.wast:100 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:i32.wast:120 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:i32.wast:121 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:i64.wast:62 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:i64.wast:63 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:i64.wast:64 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:i64.wast:82 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:i64.wast:83 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:i64.wast:99 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:i64.wast:100 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:i64.wast:120 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:i64.wast:121 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:if.wast:440 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:imports.wast:283 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:imports.wast:286 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:imports.wast:287 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:imports.wast:302 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:imports.wast:305 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:imports.wast:306 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:imports.wast:391 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:imports.wast:402 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:int_exprs.wast:113 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:int_exprs.wast:114 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:int_exprs.wast:115 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:int_exprs.wast:116 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:int_exprs.wast:132 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:int_exprs.wast:133 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:int_exprs.wast:134 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:int_exprs.wast:135 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:int_exprs.wast:196 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:int_exprs.wast:197 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:int_exprs.wast:198 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:int_exprs.wast:199 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:int_exprs.wast:349 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:int_exprs.wast:350 # AssertTrap - expected trap, got Runtime:Error unknown error singlepass:fail:linking.wast:134 # AssertReturn - Call failed RuntimeError: unknown error -singlepass:fail:linking.wast:136 # AssertTrap - expected trap, got Runtime:Error unknown error singlepass:fail:linking.wast:137 # AssertTrap - expected trap, got Runtime:Error unknown error singlepass:fail:linking.wast:139 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:linking.wast:141 # AssertTrap - expected trap, got Runtime:Error unknown error singlepass:fail:linking.wast:142 # AssertTrap - expected trap, got Runtime:Error unknown error singlepass:fail:linking.wast:144 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:linking.wast:146 # AssertTrap - expected trap, got Runtime:Error unknown error singlepass:fail:linking.wast:147 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:linking.wast:148 # AssertTrap - expected trap, got Runtime:Error unknown error singlepass:fail:linking.wast:149 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:linking.wast:152 # AssertTrap - expected trap, got Runtime:Error unknown error singlepass:fail:linking.wast:169 # AssertReturn - Call failed RuntimeError: unknown error singlepass:fail:linking.wast:175 # AssertReturn - Call failed RuntimeError: unknown error singlepass:fail:linking.wast:181 # AssertReturn - Call failed RuntimeError: unknown error -singlepass:fail:linking.wast:184 # AssertTrap - expected trap, got Runtime:Error unknown error singlepass:fail:linking.wast:185 # AssertTrap - expected trap, got Runtime:Error unknown error singlepass:fail:linking.wast:187 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:linking.wast:188 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:linking.wast:190 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:linking.wast:225 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:linking.wast:236 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:linking.wast:248 # AssertTrap - expected trap, got Runtime:Error unknown error singlepass:fail:linking.wast:388 # AssertReturn - Call failed RuntimeError: unknown error -singlepass:fail:memory_grow.wast:15 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_grow.wast:16 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_grow.wast:17 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_grow.wast:18 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_grow.wast:24 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_grow.wast:25 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_grow.wast:286 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:23 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:24 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:25 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:26 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:27 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:28 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:29 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:30 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:31 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:32 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:111 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:112 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:113 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:114 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:115 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:116 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:117 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:118 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:119 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:120 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:121 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:122 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:123 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:124 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:125 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:126 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:127 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:128 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:129 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:130 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:131 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:132 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:133 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:134 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:135 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:136 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:137 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:138 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:139 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:140 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:141 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:142 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:143 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:144 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:145 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:146 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:147 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:148 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:149 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:150 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:151 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:152 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:153 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:154 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:155 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:156 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:157 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:158 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:159 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:160 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:161 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:162 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:163 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:164 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:165 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:166 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:167 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:168 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:169 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:170 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:171 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:172 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:173 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:174 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:175 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:176 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:177 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:178 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:179 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:180 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:181 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:182 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:183 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:184 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:185 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:186 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:187 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:188 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:189 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:190 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:191 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:192 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:193 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:194 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:195 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:196 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:197 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:198 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:199 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:200 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:201 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:202 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:203 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:204 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:205 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:206 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:207 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:208 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:209 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:210 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:211 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:212 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:213 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:214 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:215 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:216 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:217 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:218 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:219 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:220 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:221 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:222 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:223 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:224 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:225 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:226 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:227 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:228 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:229 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:230 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:231 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:232 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:233 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:234 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:235 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:236 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:237 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:238 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:239 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:240 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:241 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:242 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:243 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:244 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:245 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:246 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:247 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:248 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:249 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:250 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:251 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:252 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:253 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:254 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:255 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:256 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:257 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:258 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:259 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:260 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:261 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:262 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:263 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:264 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:265 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:memory_trap.wast:266 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:select.wast:208 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:select.wast:209 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:select.wast:210 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:select.wast:211 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:select.wast:248 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:select.wast:249 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:16 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:17 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:18 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:19 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:20 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:21 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:34 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:35 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:36 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:37 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:50 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:51 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:52 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:53 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:54 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:55 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:56 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:57 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:78 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:79 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:80 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:81 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:82 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:83 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:84 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:85 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:86 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:87 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:88 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:89 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:90 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:traps.wast:91 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:218 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:219 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:220 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:221 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:223 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:224 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:225 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:226 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:228 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:229 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:230 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:231 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:234 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:235 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:236 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:239 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:241 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:242 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:243 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:245 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:246 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:247 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:248 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:249 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:251 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:253 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:254 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:256 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:259 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:260 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:261 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:262 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:263 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:265 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:266 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:267 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:269 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:270 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:271 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:272 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:274 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:275 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:276 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:278 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:279 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:281 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:282 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:283 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:284 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:286 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:288 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:289 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:291 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:293 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:294 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:296 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unreachable.wast:298 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unwind.wast:212 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unwind.wast:221 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unwind.wast:230 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unwind.wast:239 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unwind.wast:245 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unwind.wast:251 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unwind.wast:257 # AssertTrap - expected trap, got Runtime:Error unknown error -singlepass:fail:unwind.wast:263 # AssertTrap - expected trap, got Runtime:Error unknown error diff --git a/lib/spectests/tests/spectest.rs b/lib/spectests/tests/spectest.rs index 518e545d6bc..9c255740e12 100644 --- a/lib/spectests/tests/spectest.rs +++ b/lib/spectests/tests/spectest.rs @@ -616,9 +616,47 @@ mod tests { } => { let maybe_call_result = with_instance(instance.clone(), &named_modules, &module, |instance| { + #[cfg(unix)] + use wasmer_runtime::{ + pop_code_version, push_code_version, CodeVersion, + }; + + // Manually push code version before calling WebAssembly function, as a hack. + // + // This should eventually be fixed by doing push/pop code version in the function invocation + // logic itself. + + #[cfg(unix)] + let cv_pushed = if let Some(msm) = + instance.module.runnable_module.get_module_state_map() + { + push_code_version(CodeVersion { + baseline: true, + msm: msm, + base: instance + .module + .runnable_module + .get_code() + .unwrap() + .as_ptr() + as usize, + backend: backend.into(), + runnable_module: instance.module.runnable_module.clone(), + }); + true + } else { + false + }; let params: Vec = args.iter().cloned().map(convert_value).collect(); - instance.call(&field, ¶ms[..]) + let ret = instance.call(&field, ¶ms[..]); + #[cfg(unix)] + { + if cv_pushed { + pop_code_version().unwrap(); + } + } + ret }); if maybe_call_result.is_none() { test_report.add_failure( @@ -657,21 +695,28 @@ mod tests { // TODO assert message? test_report.count_passed() } - RuntimeError::Error { .. } => { - test_report.add_failure( - SpecFailure { - file: filename.to_string(), + RuntimeError::Error { ref data } => { + use wasmer_runtime::ExceptionCode; + if let Some(_) = + data.downcast_ref::() + { + test_report.count_passed(); + } else { + test_report.add_failure( + SpecFailure { + file: filename.to_string(), + line, + kind: format!("{}", "AssertTrap"), + message: format!( + "expected trap, got Runtime:Error {:?}", + r + ), + }, + &test_key, + excludes, line, - kind: format!("{}", "AssertTrap"), - message: format!( - "expected trap, got Runtime:Error {:?}", - r - ), - }, - &test_key, - excludes, - line, - ); + ); + } } } } From 16dee04d225ffe986f1d313e1c3b07f6ea9ad67c Mon Sep 17 00:00:00 2001 From: losfair Date: Tue, 21 Jan 2020 01:10:14 +0800 Subject: [PATCH 10/12] Add aarch64-specific failure excludes. --- lib/spectests/tests/excludes.txt | 119 +++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/lib/spectests/tests/excludes.txt b/lib/spectests/tests/excludes.txt index b1c6e5dc8d7..b6690cc99d2 100644 --- a/lib/spectests/tests/excludes.txt +++ b/lib/spectests/tests/excludes.txt @@ -354,3 +354,122 @@ singlepass:fail:linking.wast:181 # AssertReturn - Call failed RuntimeError: unkn singlepass:fail:linking.wast:185 # AssertTrap - expected trap, got Runtime:Error unknown error singlepass:fail:linking.wast:187 # AssertTrap - expected trap, got Runtime:Error unknown error singlepass:fail:linking.wast:388 # AssertReturn - Call failed RuntimeError: unknown error + +# These failures only happen on AArch64 and not on x86-64. +singlepass:fail:conversions.wast:83:*:aarch64 # AssertTrap - expected trap, got [I32(2147483647)] +singlepass:fail:conversions.wast:84:*:aarch64 # AssertTrap - expected trap, got [I32(-2147483648)] +singlepass:fail:conversions.wast:85:*:aarch64 # AssertTrap - expected trap, got [I32(2147483647)] +singlepass:fail:conversions.wast:86:*:aarch64 # AssertTrap - expected trap, got [I32(-2147483648)] +singlepass:fail:conversions.wast:87:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:conversions.wast:88:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:conversions.wast:89:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:conversions.wast:90:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:conversions.wast:105:*:aarch64 # AssertTrap - expected trap, got [I32(-1)] +singlepass:fail:conversions.wast:106:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:conversions.wast:107:*:aarch64 # AssertTrap - expected trap, got [I32(-1)] +singlepass:fail:conversions.wast:108:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:conversions.wast:109:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:conversions.wast:110:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:conversions.wast:111:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:conversions.wast:112:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:conversions.wast:128:*:aarch64 # AssertTrap - expected trap, got [I32(2147483647)] +singlepass:fail:conversions.wast:129:*:aarch64 # AssertTrap - expected trap, got [I32(-2147483648)] +singlepass:fail:conversions.wast:130:*:aarch64 # AssertTrap - expected trap, got [I32(2147483647)] +singlepass:fail:conversions.wast:131:*:aarch64 # AssertTrap - expected trap, got [I32(-2147483648)] +singlepass:fail:conversions.wast:132:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:conversions.wast:133:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:conversions.wast:134:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:conversions.wast:135:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:conversions.wast:151:*:aarch64 # AssertTrap - expected trap, got [I32(-1)] +singlepass:fail:conversions.wast:152:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:conversions.wast:153:*:aarch64 # AssertTrap - expected trap, got [I32(-1)] +singlepass:fail:conversions.wast:154:*:aarch64 # AssertTrap - expected trap, got [I32(-1)] +singlepass:fail:conversions.wast:155:*:aarch64 # AssertTrap - expected trap, got [I32(-1)] +singlepass:fail:conversions.wast:156:*:aarch64 # AssertTrap - expected trap, got [I32(-1)] +singlepass:fail:conversions.wast:157:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:conversions.wast:158:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:conversions.wast:159:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:conversions.wast:160:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:conversions.wast:161:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:conversions.wast:179:*:aarch64 # AssertTrap - expected trap, got [I64(9223372036854775807)] +singlepass:fail:conversions.wast:180:*:aarch64 # AssertTrap - expected trap, got [I64(-9223372036854775808)] +singlepass:fail:conversions.wast:181:*:aarch64 # AssertTrap - expected trap, got [I64(9223372036854775807)] +singlepass:fail:conversions.wast:182:*:aarch64 # AssertTrap - expected trap, got [I64(-9223372036854775808)] +singlepass:fail:conversions.wast:183:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:conversions.wast:184:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:conversions.wast:185:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:conversions.wast:186:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:conversions.wast:199:*:aarch64 # AssertTrap - expected trap, got [I64(-1)] +singlepass:fail:conversions.wast:200:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:conversions.wast:201:*:aarch64 # AssertTrap - expected trap, got [I64(-1)] +singlepass:fail:conversions.wast:202:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:conversions.wast:203:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:conversions.wast:204:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:conversions.wast:205:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:conversions.wast:206:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:conversions.wast:224:*:aarch64 # AssertTrap - expected trap, got [I64(9223372036854775807)] +singlepass:fail:conversions.wast:225:*:aarch64 # AssertTrap - expected trap, got [I64(-9223372036854775808)] +singlepass:fail:conversions.wast:226:*:aarch64 # AssertTrap - expected trap, got [I64(9223372036854775807)] +singlepass:fail:conversions.wast:227:*:aarch64 # AssertTrap - expected trap, got [I64(-9223372036854775808)] +singlepass:fail:conversions.wast:228:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:conversions.wast:229:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:conversions.wast:230:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:conversions.wast:231:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:conversions.wast:248:*:aarch64 # AssertTrap - expected trap, got [I64(-1)] +singlepass:fail:conversions.wast:249:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:conversions.wast:250:*:aarch64 # AssertTrap - expected trap, got [I64(-1)] +singlepass:fail:conversions.wast:251:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:conversions.wast:252:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:conversions.wast:253:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:conversions.wast:254:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:conversions.wast:255:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:i32.wast:62:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:i32.wast:63:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:i32.wast:64:*:aarch64 # AssertTrap - expected trap, got [I32(-2147483648)] +singlepass:fail:i32.wast:82:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:i32.wast:83:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:i32.wast:99:*:aarch64 # AssertTrap - expected trap, got [I32(1)] +singlepass:fail:i32.wast:100:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:i32.wast:120:*:aarch64 # AssertTrap - expected trap, got [I32(1)] +singlepass:fail:i32.wast:121:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:i64.wast:62:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:i64.wast:63:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:i64.wast:64:*:aarch64 # AssertTrap - expected trap, got [I64(-9223372036854775808)] +singlepass:fail:i64.wast:82:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:i64.wast:83:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:i64.wast:99:*:aarch64 # AssertTrap - expected trap, got [I64(1)] +singlepass:fail:i64.wast:100:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:i64.wast:120:*:aarch64 # AssertTrap - expected trap, got [I64(1)] +singlepass:fail:i64.wast:121:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:int_exprs.wast:113:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:int_exprs.wast:114:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:int_exprs.wast:115:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:int_exprs.wast:116:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:int_exprs.wast:132:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:int_exprs.wast:133:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:int_exprs.wast:134:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:int_exprs.wast:135:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:int_exprs.wast:196:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:int_exprs.wast:197:*:aarch64 # AssertTrap - expected trap, got [I32(0)] +singlepass:fail:int_exprs.wast:198:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:int_exprs.wast:199:*:aarch64 # AssertTrap - expected trap, got [I64(0)] +singlepass:fail:int_exprs.wast:349:*:aarch64 # AssertTrap - expected trap, got [I32(-2147483648)] +singlepass:fail:int_exprs.wast:350:*:aarch64 # AssertTrap - expected trap, got [I64(-9223372036854775808)] +singlepass:fail:traps.wast:16:*:aarch64 # AssertTrap - expected trap, got [] +singlepass:fail:traps.wast:17:*:aarch64 # AssertTrap - expected trap, got [] +singlepass:fail:traps.wast:18:*:aarch64 # AssertTrap - expected trap, got [] +singlepass:fail:traps.wast:19:*:aarch64 # AssertTrap - expected trap, got [] +singlepass:fail:traps.wast:20:*:aarch64 # AssertTrap - expected trap, got [] +singlepass:fail:traps.wast:21:*:aarch64 # AssertTrap - expected trap, got [] +singlepass:fail:traps.wast:34:*:aarch64 # AssertTrap - expected trap, got [] +singlepass:fail:traps.wast:35:*:aarch64 # AssertTrap - expected trap, got [] +singlepass:fail:traps.wast:36:*:aarch64 # AssertTrap - expected trap, got [] +singlepass:fail:traps.wast:37:*:aarch64 # AssertTrap - expected trap, got [] +singlepass:fail:traps.wast:50:*:aarch64 # AssertTrap - expected trap, got [] +singlepass:fail:traps.wast:51:*:aarch64 # AssertTrap - expected trap, got [] +singlepass:fail:traps.wast:52:*:aarch64 # AssertTrap - expected trap, got [] +singlepass:fail:traps.wast:53:*:aarch64 # AssertTrap - expected trap, got [] +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 [] \ No newline at end of file From dc216364bee4dcb897a69c6596aebc1d01179d73 Mon Sep 17 00:00:00 2001 From: losfair Date: Tue, 21 Jan 2020 02:07:32 +0800 Subject: [PATCH 11/12] Fix backend string type. --- src/bin/wasmer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bin/wasmer.rs b/src/bin/wasmer.rs index a84f3d8f7b6..9d37e033832 100644 --- a/src/bin/wasmer.rs +++ b/src/bin/wasmer.rs @@ -868,7 +868,7 @@ fn execute_wasm(options: &Run) -> Result<(), String> { baseline: true, msm: msm, base: instance.module.runnable_module.get_code().unwrap().as_ptr() as usize, - backend: options.backend.to_string().to_owned(), + backend: options.backend.to_string(), runnable_module: instance.module.runnable_module.clone(), }); true From 1b5d9f2a21988ddbc497f3d45badadfe54c1c7d1 Mon Sep 17 00:00:00 2001 From: losfair Date: Tue, 21 Jan 2020 02:21:55 +0800 Subject: [PATCH 12/12] Update changelog. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a848cb6871a..42e104d7af5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## **[Unreleased]** +- [#1129](https://github.com/wasmerio/wasmer/pull/1129) Standard exception types for singlepass backend. + ## 0.13.1 - 2020-01-16 - Fix bug in wapm related to the `package.wasmer_extra_flags` entry in the manifest