From 4d3e8ee1172cf12d34b89244900952ad64849f86 Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Thu, 5 Mar 2020 14:17:04 +0100 Subject: [PATCH 01/27] test(runtime-core) Test polymorphic host functions with more types. --- lib/runtime-core-tests/tests/imports.rs | 197 +++++++++++++++++++----- 1 file changed, 162 insertions(+), 35 deletions(-) diff --git a/lib/runtime-core-tests/tests/imports.rs b/lib/runtime-core-tests/tests/imports.rs index 1af995368..bb0339459 100644 --- a/lib/runtime-core-tests/tests/imports.rs +++ b/lib/runtime-core-tests/tests/imports.rs @@ -1,4 +1,4 @@ -use std::sync::Arc; +use std::{convert::TryInto, sync::Arc}; use wasmer_runtime_core::{ compile_with, error::RuntimeError, @@ -12,10 +12,11 @@ use wasmer_runtime_core::{ use wasmer_runtime_core_tests::{get_compiler, wat2wasm}; macro_rules! call_and_assert { - ($instance:ident, $function:ident, $expected_value:expr) => { - let $function: Func = $instance.func(stringify!($function)).unwrap(); + ($instance:ident, $function:ident( $( $inputs:ty ),* ) -> $output:ty, ( $( $arguments:expr ),* ) == $expected_value:expr) => { + #[allow(unused_parens)] + let $function: Func<( $( $inputs ),* ), $output> = $instance.func(stringify!($function)).expect(concat!("Failed to get the `", stringify!($function), "` export function.")); - let result = $function.call(1); + let result = $function.call( $( $arguments ),* ); match (result, $expected_value) { (Ok(value), expected_value) => assert_eq!( @@ -75,7 +76,12 @@ fn imported_functions_forms(test: &dyn Fn(&Instance)) { (import "env" "memory" (memory 1 1)) (import "env" "callback_fn" (func $callback_fn (type $type))) (import "env" "callback_closure" (func $callback_closure (type $type))) - (import "env" "callback_closure_dynamic" (func $callback_closure_dynamic (type $type))) + (import "env" "callback_fn_dynamic" (func $callback_fn_dynamic (type $type))) + (import "env" "callback_closure_dynamic_0" (func $callback_closure_dynamic_0)) + (import "env" "callback_closure_dynamic_1" (func $callback_closure_dynamic_1 (param i32) (result i32))) + (import "env" "callback_closure_dynamic_2" (func $callback_closure_dynamic_2 (param i32 i64) (result i64))) + (import "env" "callback_closure_dynamic_3" (func $callback_closure_dynamic_3 (param i32 i64 f32) (result f32))) + (import "env" "callback_closure_dynamic_4" (func $callback_closure_dynamic_4 (param i32 i64 f32 f64) (result f64))) (import "env" "callback_closure_with_env" (func $callback_closure_with_env (type $type))) (import "env" "callback_fn_with_vmctx" (func $callback_fn_with_vmctx (type $type))) (import "env" "callback_closure_with_vmctx" (func $callback_closure_with_vmctx (type $type))) @@ -94,9 +100,34 @@ fn imported_functions_forms(test: &dyn Fn(&Instance)) { get_local 0 call $callback_closure) - (func (export "function_closure_dynamic") (type $type) + (func (export "function_fn_dynamic") (type $type) get_local 0 - call $callback_closure_dynamic) + call $callback_fn_dynamic) + + (func (export "function_closure_dynamic_0") + call $callback_closure_dynamic_0) + + (func (export "function_closure_dynamic_1") (param i32) (result i32) + get_local 0 + call $callback_closure_dynamic_1) + + (func (export "function_closure_dynamic_2") (param i32 i64) (result i64) + get_local 0 + get_local 1 + call $callback_closure_dynamic_2) + + (func (export "function_closure_dynamic_3") (param i32 i64 f32) (result f32) + get_local 0 + get_local 1 + get_local 2 + call $callback_closure_dynamic_3) + + (func (export "function_closure_dynamic_4") (param i32 i64 f32 f64) (result f64) + get_local 0 + get_local 1 + get_local 2 + get_local 3 + call $callback_closure_dynamic_4) (func (export "function_closure_with_env") (type $type) get_local 0 @@ -154,13 +185,77 @@ fn imported_functions_forms(test: &dyn Fn(&Instance)) { Ok(n + 1) }), - "callback_closure_dynamic" => DynamicFunc::new( + // Regular polymorphic function. + "callback_fn_dynamic" => DynamicFunc::new( Arc::new(FuncSig::new(vec![Type::I32], vec![Type::I32])), - |_, params| -> Vec { - match params[0] { - Value::I32(x) => vec![Value::I32(x + 1)], - _ => unreachable!() - } + callback_fn_dynamic, + ), + + // Polymorphic closure “closures”. + "callback_closure_dynamic_0" => DynamicFunc::new( + Arc::new(FuncSig::new(vec![], vec![])), + |_, inputs: &[Value]| -> Vec { + assert!(inputs.is_empty()); + + vec![] + } + ), + "callback_closure_dynamic_1" => DynamicFunc::new( + Arc::new(FuncSig::new(vec![Type::I32], vec![Type::I32])), + move |vmctx: &mut vm::Ctx, inputs: &[Value]| -> Vec { + assert_eq!(inputs.len(), 1); + + let memory = vmctx.memory(0); + let shift_ = shift + memory.view::()[0].get(); + let n: i32 = (&inputs[0]).try_into().unwrap(); + + vec![Value::I32(shift_ + n)] + } + ), + "callback_closure_dynamic_2" => DynamicFunc::new( + Arc::new(FuncSig::new(vec![Type::I32, Type::I64], vec![Type::I64])), + move |vmctx: &mut vm::Ctx, inputs: &[Value]| -> Vec { + assert_eq!(inputs.len(), 2); + + let memory = vmctx.memory(0); + let shift_ = shift + memory.view::()[0].get(); + let i: i32 = (&inputs[0]).try_into().unwrap(); + let j: i64 = (&inputs[1]).try_into().unwrap(); + + vec![Value::I64(shift_ as i64 + i as i64 + j)] + } + ), + "callback_closure_dynamic_3" => DynamicFunc::new( + Arc::new(FuncSig::new(vec![Type::I32, Type::I64, Type::F32], vec![Type::F32])), + move |vmctx: &mut vm::Ctx, inputs: &[Value]| -> Vec { + assert_eq!(inputs.len(), 3); + + let memory = vmctx.memory(0); + let shift_ = shift + memory.view::()[0].get(); + let i: i32 = (&inputs[0]).try_into().unwrap(); + let j: i64 = (&inputs[1]).try_into().unwrap(); + let k: f32 = (&inputs[2]).try_into().unwrap(); + + dbg!(i); + dbg!(j); + dbg!(k); + + vec![Value::F32(shift_ as f32 + i as f32 + j as f32 + k)] + } + ), + "callback_closure_dynamic_4" => DynamicFunc::new( + Arc::new(FuncSig::new(vec![Type::I32, Type::I64, Type::F32, Type::F64], vec![Type::F64])), + move |vmctx: &mut vm::Ctx, inputs: &[Value]| -> Vec { + assert_eq!(inputs.len(), 4); + + let memory = vmctx.memory(0); + let shift_ = shift + memory.view::()[0].get(); + let i: i32 = (&inputs[0]).try_into().unwrap(); + let j: i64 = (&inputs[1]).try_into().unwrap(); + let k: f32 = (&inputs[2]).try_into().unwrap(); + let l: f64 = (&inputs[3]).try_into().unwrap(); + + vec![Value::F64(shift_ as f64 + i as f64 + j as f64 + k as f64 + l)] } ), @@ -227,6 +322,13 @@ fn callback_fn(n: i32) -> Result { Ok(n + 1) } +fn callback_fn_dynamic(_: &mut vm::Ctx, inputs: &[Value]) -> Vec { + match inputs[0] { + Value::I32(x) => vec![Value::I32(x + 1)], + _ => unreachable!(), + } +} + fn callback_fn_with_vmctx(vmctx: &mut vm::Ctx, n: i32) -> Result { let memory = vmctx.memory(0); let shift_: i32 = memory.view()[0].get(); @@ -246,57 +348,82 @@ fn callback_fn_trap_with_vmctx(vmctx: &mut vm::Ctx, n: i32) -> Result { + ($test_name:ident, $function:ident( $( $inputs:ty ),* ) -> $output:ty, ( $( $arguments:expr ),* ) == $expected_value:expr) => { #[test] fn $test_name() { imported_functions_forms(&|instance| { - call_and_assert!(instance, $function, $expected_value); + call_and_assert!(instance, $function( $( $inputs ),* ) -> $output, ( $( $arguments ),* ) == $expected_value); }); } }; } -test!(test_fn, function_fn, Ok(2)); -test!(test_closure, function_closure, Ok(2)); -test!(test_closure_dynamic, function_closure_dynamic, Ok(2)); +test!(test_fn, function_fn(i32) -> i32, (1) == Ok(2)); +test!(test_closure, function_closure(i32) -> i32, (1) == Ok(2)); +test!(test_fn_dynamic, function_fn_dynamic(i32) -> i32, (1) == Ok(2)); +test!( + test_closure_dynamic_0, + function_closure_dynamic_0(()) -> (), + () == Ok(()) +); +test!( + test_closure_dynamic_1, + function_closure_dynamic_1(i32) -> i32, + (1) == Ok(1 + shift + SHIFT) +); +test!( + test_closure_dynamic_2, + function_closure_dynamic_2(i32, i64) -> i64, + (1, 2) == Ok(1 + 2 + shift as i64 + SHIFT as i64) +); +test!( + test_closure_dynamic_3, + function_closure_dynamic_3(i32, i64, f32) -> f32, + (1, 2, 3.) == Ok(1. + 2. + 3. + shift as f32 + SHIFT as f32) +); +test!( + test_closure_dynamic_4, + function_closure_dynamic_4(i32, i64, f32, f64) -> f64, + (1, 2, 3., 4.) == Ok(1. + 2. + 3. + 4. + shift as f64 + SHIFT as f64) +); test!( test_closure_with_env, - function_closure_with_env, - Ok(2 + shift + SHIFT) + function_closure_with_env(i32) -> i32, + (1) == Ok(2 + shift + SHIFT) ); -test!(test_fn_with_vmctx, function_fn_with_vmctx, Ok(2 + SHIFT)); +test!(test_fn_with_vmctx, function_fn_with_vmctx(i32) -> i32, (1) == Ok(2 + SHIFT)); test!( test_closure_with_vmctx, - function_closure_with_vmctx, - Ok(2 + SHIFT) + function_closure_with_vmctx(i32) -> i32, + (1) == Ok(2 + SHIFT) ); test!( test_closure_with_vmctx_and_env, - function_closure_with_vmctx_and_env, - Ok(2 + shift + SHIFT) + function_closure_with_vmctx_and_env(i32) -> i32, + (1) == Ok(2 + shift + SHIFT) ); test!( test_fn_trap, - function_fn_trap, - Err(RuntimeError(Box::new(format!("foo {}", 2)))) + function_fn_trap(i32) -> i32, + (1) == Err(RuntimeError(Box::new(format!("foo {}", 2)))) ); test!( test_closure_trap, - function_closure_trap, - Err(RuntimeError(Box::new(format!("bar {}", 2)))) + function_closure_trap(i32) -> i32, + (1) == Err(RuntimeError(Box::new(format!("bar {}", 2)))) ); test!( test_fn_trap_with_vmctx, - function_fn_trap_with_vmctx, - Err(RuntimeError(Box::new(format!("baz {}", 2 + SHIFT)))) + function_fn_trap_with_vmctx(i32) -> i32, + (1) == Err(RuntimeError(Box::new(format!("baz {}", 2 + SHIFT)))) ); test!( test_closure_trap_with_vmctx, - function_closure_trap_with_vmctx, - Err(RuntimeError(Box::new(format!("qux {}", 2 + SHIFT)))) + function_closure_trap_with_vmctx(i32) -> i32, + (1) == Err(RuntimeError(Box::new(format!("qux {}", 2 + SHIFT)))) ); test!( test_closure_trap_with_vmctx_and_env, - function_closure_trap_with_vmctx_and_env, - Err(RuntimeError(Box::new(format!("! {}", 2 + shift + SHIFT)))) + function_closure_trap_with_vmctx_and_env(i32) -> i32, + (1) == Err(RuntimeError(Box::new(format!("! {}", 2 + shift + SHIFT)))) ); From a5de17fb1897afb4619d078dfa10d72b0fb96748 Mon Sep 17 00:00:00 2001 From: losfair Date: Thu, 5 Mar 2020 22:49:58 +0800 Subject: [PATCH 02/27] runtime-core: Correctly allocate floating point registers for trampolines. --- lib/runtime-core/src/state.rs | 29 +++++ lib/runtime-core/src/trampoline_x64.rs | 140 +++++++++++++++++++++---- lib/runtime-core/src/typed_func.rs | 6 +- 3 files changed, 152 insertions(+), 23 deletions(-) diff --git a/lib/runtime-core/src/state.rs b/lib/runtime-core/src/state.rs index 1dfcae813..11cdc4ccf 100644 --- a/lib/runtime-core/src/state.rs +++ b/lib/runtime-core/src/state.rs @@ -610,6 +610,35 @@ pub mod x64_decl { _ => return None, }) } + + /// Returns the instruction prefix for `movq %this_reg, ?(%rsp)`. + /// + /// To build a instruction, append the memory location as a 32-bit + /// offset to the stack pointer to this prefix. + pub fn prefix_mov_to_stack(&self) -> Option<&'static [u8]> { + Some(match *self { + X64Register::GPR(gpr) => match gpr { + GPR::RDI => &[0x48, 0x89, 0xbc, 0x24], + GPR::RSI => &[0x48, 0x89, 0xb4, 0x24], + GPR::RDX => &[0x48, 0x89, 0x94, 0x24], + GPR::RCX => &[0x48, 0x89, 0x8c, 0x24], + GPR::R8 => &[0x4c, 0x89, 0x84, 0x24], + GPR::R9 => &[0x4c, 0x89, 0x8c, 0x24], + _ => return None, + }, + X64Register::XMM(xmm) => match xmm { + XMM::XMM0 => &[0x66, 0x0f, 0xd6, 0x84, 0x24], + XMM::XMM1 => &[0x66, 0x0f, 0xd6, 0x8c, 0x24], + XMM::XMM2 => &[0x66, 0x0f, 0xd6, 0x94, 0x24], + XMM::XMM3 => &[0x66, 0x0f, 0xd6, 0x9c, 0x24], + XMM::XMM4 => &[0x66, 0x0f, 0xd6, 0xa4, 0x24], + XMM::XMM5 => &[0x66, 0x0f, 0xd6, 0xac, 0x24], + XMM::XMM6 => &[0x66, 0x0f, 0xd6, 0xb4, 0x24], + XMM::XMM7 => &[0x66, 0x0f, 0xd6, 0xbc, 0x24], + _ => return None, + }, + }) + } } } diff --git a/lib/runtime-core/src/trampoline_x64.rs b/lib/runtime-core/src/trampoline_x64.rs index 048098321..6ace06076 100644 --- a/lib/runtime-core/src/trampoline_x64.rs +++ b/lib/runtime-core/src/trampoline_x64.rs @@ -7,6 +7,8 @@ //! Variadic functions are not supported because `rax` is used by the trampoline code. use crate::loader::CodeMemory; +use crate::state::x64_decl::{X64Register, GPR, XMM}; +use crate::types::Type; use crate::vm::Ctx; use std::collections::BTreeMap; use std::fmt; @@ -145,6 +147,53 @@ pub struct TrampolineBuffer { offsets: Vec, } +#[derive(Default)] +struct ArgumentRegisterAllocator { + n_gprs: usize, + n_xmms: usize, +} + +impl ArgumentRegisterAllocator { + fn next(&mut self, ty: Type) -> Option { + static GPR_SEQ: &'static [GPR] = + &[GPR::RDI, GPR::RSI, GPR::RDX, GPR::RCX, GPR::R8, GPR::R9]; + static XMM_SEQ: &'static [XMM] = &[ + XMM::XMM0, + XMM::XMM1, + XMM::XMM2, + XMM::XMM3, + XMM::XMM4, + XMM::XMM5, + XMM::XMM6, + XMM::XMM7, + ]; + match ty { + Type::I32 | Type::I64 => { + if self.n_gprs < GPR_SEQ.len() { + let gpr = GPR_SEQ[self.n_gprs]; + self.n_gprs += 1; + Some(X64Register::GPR(gpr)) + } else { + None + } + } + Type::F32 | Type::F64 => { + if self.n_xmms < XMM_SEQ.len() { + let xmm = XMM_SEQ[self.n_xmms]; + self.n_xmms += 1; + Some(X64Register::XMM(xmm)) + } else { + None + } + } + _ => todo!( + "ArgumentRegisterAllocator::next: Unsupported type: {:?}", + ty + ), + } + } +} + fn value_to_bytes(ptr: &T) -> &[u8] { unsafe { slice::from_raw_parts(ptr as *const T as *const u8, mem::size_of::()) } } @@ -246,44 +295,49 @@ impl TrampolineBufferBuilder { &mut self, target: unsafe extern "C" fn(*const CallContext, *const u64) -> u64, context: *const CallContext, - num_params: u32, + params: &[Type], ) -> usize { let idx = self.offsets.len(); self.offsets.push(self.code.len()); - let mut stack_offset: u32 = num_params.checked_mul(8).unwrap(); + let mut stack_offset: u32 = params.len().checked_mul(8).unwrap() as u32; if stack_offset % 16 == 0 { stack_offset += 8; } self.code.extend_from_slice(&[0x48, 0x81, 0xec]); // sub ?, %rsp self.code.extend_from_slice(value_to_bytes(&stack_offset)); - for i in 0..num_params { - match i { - 0..=5 => { - // mov %?, ?(%rsp) - let prefix: &[u8] = match i { - 0 => &[0x48, 0x89, 0xbc, 0x24], // rdi - 1 => &[0x48, 0x89, 0xb4, 0x24], // rsi - 2 => &[0x48, 0x89, 0x94, 0x24], // rdx - 3 => &[0x48, 0x89, 0x8c, 0x24], // rcx - 4 => &[0x4c, 0x89, 0x84, 0x24], // r8 - 5 => &[0x4c, 0x89, 0x8c, 0x24], // r9 - _ => unreachable!(), - }; + + let mut allocator = ArgumentRegisterAllocator::default(); + + let mut source_stack_count: u32 = 0; // # of allocated slots in the source stack. + + for (i, ty) in params.iter().enumerate() { + match allocator.next(*ty) { + Some(reg) => { + // This argument is allocated to a register. + + let prefix = reg + .prefix_mov_to_stack() + .expect("cannot get instruction prefix for argument register"); self.code.extend_from_slice(prefix); - self.code.extend_from_slice(value_to_bytes(&(i * 8u32))); + self.code + .extend_from_slice(value_to_bytes(&((i as u32) * 8u32))); } - _ => { + None => { + // This argument is allocated to the stack. + self.code.extend_from_slice(&[ 0x48, 0x8b, 0x84, 0x24, // mov ?(%rsp), %rax ]); self.code.extend_from_slice(value_to_bytes( - &((i - 6) * 8u32 + stack_offset + 8/* ret addr */), + &(source_stack_count * 8u32 + stack_offset + 8/* ret addr */), )); // mov %rax, ?(%rsp) self.code.extend_from_slice(&[0x48, 0x89, 0x84, 0x24]); - self.code.extend_from_slice(value_to_bytes(&(i * 8u32))); + self.code + .extend_from_slice(value_to_bytes(&((i as u32) * 8u32))); + source_stack_count += 1; } } } @@ -395,8 +449,12 @@ mod tests { } let mut builder = TrampolineBufferBuilder::new(); let ctx = TestContext { value: 100 }; - let idx = - builder.add_callinfo_trampoline(do_add, &ctx as *const TestContext as *const _, 8); + let param_types: Vec = (0..8).map(|_| Type::I32).collect(); + let idx = builder.add_callinfo_trampoline( + do_add, + &ctx as *const TestContext as *const _, + ¶m_types, + ); let buf = builder.build(); let t = buf.get_trampoline(idx); let ret = unsafe { @@ -407,6 +465,43 @@ mod tests { assert_eq!(ret, 136); } + #[test] + fn test_trampolines_with_floating_point() { + unsafe extern "C" fn inner(n: *const CallContext, args: *const u64) -> u64 { + let n = n as usize; + let mut result: u64 = 0; + for i in 0..n { + result += *args.offset(i as _); + } + result + } + let buffer = TrampBuffer::new(4096); + let mut builder = TrampolineBufferBuilder::new(); + builder.add_callinfo_trampoline( + inner, + 8 as _, + &[ + Type::I32, + Type::I32, + Type::I32, + Type::F32, + Type::I32, + Type::I32, + Type::I32, + Type::I32, + ], + ); + let ptr = buffer.insert(builder.code()).unwrap(); + let ret = unsafe { + let f = std::mem::transmute::< + _, + extern "C" fn(i32, i32, i32, f32, i32, i32, i32, i32) -> i32, + >(ptr); + f(1, 2, 3, f32::from_bits(4), 5, 6, 7, 8) + }; + assert_eq!(ret, 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8); + } + #[test] fn test_many_global_trampolines() { unsafe extern "C" fn inner(n: *const CallContext, args: *const u64) -> u64 { @@ -427,7 +522,8 @@ mod tests { for i in 0..5000usize { let mut builder = TrampolineBufferBuilder::new(); let n = i % 8; - builder.add_callinfo_trampoline(inner, n as _, n as _); + let param_types: Vec<_> = (0..n).map(|_| Type::I32).collect(); + builder.add_callinfo_trampoline(inner, n as _, ¶m_types); let ptr = buffer .insert(builder.code()) .expect("cannot insert new code into global buffer"); diff --git a/lib/runtime-core/src/typed_func.rs b/lib/runtime-core/src/typed_func.rs index 0b29d54ea..4dc192b0b 100644 --- a/lib/runtime-core/src/typed_func.rs +++ b/lib/runtime-core/src/typed_func.rs @@ -360,10 +360,14 @@ impl<'a> DynamicFunc<'a> { func: Box::new(func), }); let ctx = Box::into_raw(ctx); + + let mut native_param_types = vec![Type::I32]; // vm::Ctx is the first parameter. + native_param_types.extend_from_slice(signature.params()); + builder.add_callinfo_trampoline( enter_host_polymorphic, ctx as *const _, - (signature.params().len() + 1) as u32, // +vmctx + &native_param_types, ); let ptr = builder .insert_global() From e62095da5d966681eccfd07676a04dc0b4b677f6 Mon Sep 17 00:00:00 2001 From: losfair Date: Fri, 6 Mar 2020 00:37:48 +0800 Subject: [PATCH 03/27] runtime-core: Move ArgumentRegisterAllocator into `state`. --- lib/runtime-core/src/state.rs | 53 +++++++++++++++++++++++++- lib/runtime-core/src/trampoline_x64.rs | 49 +----------------------- 2 files changed, 53 insertions(+), 49 deletions(-) diff --git a/lib/runtime-core/src/state.rs b/lib/runtime-core/src/state.rs index 11cdc4ccf..fb19476b1 100644 --- a/lib/runtime-core/src/state.rs +++ b/lib/runtime-core/src/state.rs @@ -480,10 +480,11 @@ impl InstanceImage { } } -/// Declarations for x86-64 registers. +/// X64-specific structures and methods that do not depend on an x64 machine to run. #[cfg(unix)] pub mod x64_decl { use super::*; + use crate::types::Type; /// General-purpose registers. #[repr(u8)] @@ -640,8 +641,58 @@ pub mod x64_decl { }) } } + + /// An allocator that allocates registers for function arguments according to the System V ABI. + #[derive(Default)] + pub struct ArgumentRegisterAllocator { + n_gprs: usize, + n_xmms: usize, + } + + impl ArgumentRegisterAllocator { + /// Allocates a register for argument type `ty`. Returns `None` if no register is available for this type.. + pub fn next(&mut self, ty: Type) -> Option { + static GPR_SEQ: &'static [GPR] = + &[GPR::RDI, GPR::RSI, GPR::RDX, GPR::RCX, GPR::R8, GPR::R9]; + static XMM_SEQ: &'static [XMM] = &[ + XMM::XMM0, + XMM::XMM1, + XMM::XMM2, + XMM::XMM3, + XMM::XMM4, + XMM::XMM5, + XMM::XMM6, + XMM::XMM7, + ]; + match ty { + Type::I32 | Type::I64 => { + if self.n_gprs < GPR_SEQ.len() { + let gpr = GPR_SEQ[self.n_gprs]; + self.n_gprs += 1; + Some(X64Register::GPR(gpr)) + } else { + None + } + } + Type::F32 | Type::F64 => { + if self.n_xmms < XMM_SEQ.len() { + let xmm = XMM_SEQ[self.n_xmms]; + self.n_xmms += 1; + Some(X64Register::XMM(xmm)) + } else { + None + } + } + _ => todo!( + "ArgumentRegisterAllocator::next: Unsupported type: {:?}", + ty + ), + } + } + } } +/// X64-specific structures and methods that only work on an x64 machine. #[cfg(unix)] pub mod x64 { //! The x64 state module contains functions to generate state and code for x64 targets. diff --git a/lib/runtime-core/src/trampoline_x64.rs b/lib/runtime-core/src/trampoline_x64.rs index 6ace06076..24fc4f385 100644 --- a/lib/runtime-core/src/trampoline_x64.rs +++ b/lib/runtime-core/src/trampoline_x64.rs @@ -7,7 +7,7 @@ //! Variadic functions are not supported because `rax` is used by the trampoline code. use crate::loader::CodeMemory; -use crate::state::x64_decl::{X64Register, GPR, XMM}; +use crate::state::x64_decl::ArgumentRegisterAllocator; use crate::types::Type; use crate::vm::Ctx; use std::collections::BTreeMap; @@ -147,53 +147,6 @@ pub struct TrampolineBuffer { offsets: Vec, } -#[derive(Default)] -struct ArgumentRegisterAllocator { - n_gprs: usize, - n_xmms: usize, -} - -impl ArgumentRegisterAllocator { - fn next(&mut self, ty: Type) -> Option { - static GPR_SEQ: &'static [GPR] = - &[GPR::RDI, GPR::RSI, GPR::RDX, GPR::RCX, GPR::R8, GPR::R9]; - static XMM_SEQ: &'static [XMM] = &[ - XMM::XMM0, - XMM::XMM1, - XMM::XMM2, - XMM::XMM3, - XMM::XMM4, - XMM::XMM5, - XMM::XMM6, - XMM::XMM7, - ]; - match ty { - Type::I32 | Type::I64 => { - if self.n_gprs < GPR_SEQ.len() { - let gpr = GPR_SEQ[self.n_gprs]; - self.n_gprs += 1; - Some(X64Register::GPR(gpr)) - } else { - None - } - } - Type::F32 | Type::F64 => { - if self.n_xmms < XMM_SEQ.len() { - let xmm = XMM_SEQ[self.n_xmms]; - self.n_xmms += 1; - Some(X64Register::XMM(xmm)) - } else { - None - } - } - _ => todo!( - "ArgumentRegisterAllocator::next: Unsupported type: {:?}", - ty - ), - } - } -} - fn value_to_bytes(ptr: &T) -> &[u8] { unsafe { slice::from_raw_parts(ptr as *const T as *const u8, mem::size_of::()) } } From 4b99a41e17236e2a51ffce5dfbd541dc04869818 Mon Sep 17 00:00:00 2001 From: Syrus Date: Thu, 5 Mar 2020 17:22:16 -0800 Subject: [PATCH 04/27] Added support for wapm wax --- src/installer/wasmer.iss | 3 +++ src/installer/wax.cmd | 2 ++ 2 files changed, 5 insertions(+) create mode 100644 src/installer/wax.cmd diff --git a/src/installer/wasmer.iss b/src/installer/wasmer.iss index 408a92e39..390f90a46 100644 --- a/src/installer/wasmer.iss +++ b/src/installer/wasmer.iss @@ -23,6 +23,9 @@ Root: HKCU; Subkey: "Environment"; ValueType:string; ValueName: "WASMER_CACHE_DI [Files] Source: "..\..\target\release\wasmer.exe"; DestDir: "{app}\bin" Source: "..\..\wapm-cli\target\release\wapm.exe"; DestDir: "{app}\bin" +{ The cmd shortcut for wax } +Source: "wax.cmd"; DestDir: "{app}\bin" +{ Other ways of doing it: https://superuser.com/questions/193000/running-programs-by-typing-some-alias-in-windows } [Dirs] Name: "{%USERPROFILE}\.wasmer" diff --git a/src/installer/wax.cmd b/src/installer/wax.cmd new file mode 100644 index 000000000..efe9eaffb --- /dev/null +++ b/src/installer/wax.cmd @@ -0,0 +1,2 @@ +@echo off +wapm.exe execute %* From d1f79ae1e860e31c3818b86f9862a8d091f14179 Mon Sep 17 00:00:00 2001 From: Syrus Date: Thu, 5 Mar 2020 18:05:51 -0800 Subject: [PATCH 05/27] Fixed comments --- src/installer/wasmer.iss | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/installer/wasmer.iss b/src/installer/wasmer.iss index 390f90a46..299d638a4 100644 --- a/src/installer/wasmer.iss +++ b/src/installer/wasmer.iss @@ -23,9 +23,7 @@ Root: HKCU; Subkey: "Environment"; ValueType:string; ValueName: "WASMER_CACHE_DI [Files] Source: "..\..\target\release\wasmer.exe"; DestDir: "{app}\bin" Source: "..\..\wapm-cli\target\release\wapm.exe"; DestDir: "{app}\bin" -{ The cmd shortcut for wax } Source: "wax.cmd"; DestDir: "{app}\bin" -{ Other ways of doing it: https://superuser.com/questions/193000/running-programs-by-typing-some-alias-in-windows } [Dirs] Name: "{%USERPROFILE}\.wasmer" From bd9aae1ed53a407449ff022f144f9ca1825975dd Mon Sep 17 00:00:00 2001 From: Syrus Date: Fri, 6 Mar 2020 12:17:01 -0800 Subject: [PATCH 06/27] Updated Wasmer icons --- src/installer/media/wizard_logo.ico | Bin 30138 -> 22142 bytes src/installer/media/wizard_logo_2.bmp | Bin 980726 -> 1305578 bytes src/installer/media/wizard_logo_small.bmp | Bin 4158 -> 12238 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/src/installer/media/wizard_logo.ico b/src/installer/media/wizard_logo.ico index 664b0d7a16bf2c6388add01b22ff370850e25aa5..80d69b0558df39ca5b7ab62c121b31fb0333a1ee 100644 GIT binary patch literal 22142 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 A_y7O^ literal 30138 zcmeHQ2UrwW*S-rHYc%Cg6q8?!rhLh76csB7ND)L(I!X}`qzH<=M!}X(V`52+eyJug z5mB*3V{9?lMT*jqDA{OY@)^r6AfmyY|2?}q>+G_-?82^Mp3L(c4>LRWob%qfbMLw5 zo;xxoVlCNIPciUrEWQO}L5#7^ofYTH+c0(n*Sd96oNvK>!#gl$W1~EOg|VAm85=lI zasF~2#@4$s_Aki5t&pg=4#pVd97kCqT}S1Fx$NG)OeP7K_^QM=Zlq-NgccxOx2vw# zto@wb_`l&y8l3dB#5Xov;xpkq%54Uo)#hJt}-U2iL<-WxIHngX3q|U#!1>0IsWfIy`yXL9D=TA4e^(OIFz53 z`D`Dyb&z}4tpnYoce?m>!M%e(H~BI`{-@V?F3&!Yqq0P2+(K8R*}9HTvvJB#>+4*a z;WWC3{_@dkypQsBP^{ka1D2l{(*R8~*tUzumrCq+(UxEz6ADob+q_aC84|1~_nQ&j;8w%IPB zGx_?$GyCiG5WoAU2K#b{`j6zc^>MCW-Y2#P+FO()FwyEn4+oax5;|L1zUH)B=*r!L zJjFZuxT?wt@Moj`UX+GT5h;lsf5nN)&w*a)*`a|S9}Ae!Ym2RG$v3?nsQi6Av!B!Y z3=@OW(+3Q<-#sGOLf9C8>}1PwJt95MItF_dxQ=UeAS|H^%9qOP+s5e(o_DVd$5F4L z{j>)$To)E+MNux@2+Hh;pW1_3*Ske^f%+30ki?R)8f(U6AnIq( zRmrbY|0O@rXEoH%C~kc4Z*|IQ#&H~zhD^4S_$R!1%RQXl%?CF$;V)@WB9o4p)EaXA z(asJ*Zi-|?guL%*f>%D`koaam3+b_q=s}#Bc`*;xVa+O z+YNo4)?hX$$S<2_{if}&e&8{#==r>mcH7-|eQMa&MC`2P|C~E#!q5={@!*3mu@pm)o!%3AL`FHLvAVF<=OBPUo1c$1NqKp z)#cyKatX=*!OrLQ@j;{IpC9`BbQd^z7(H}u7?S78j5j+@4EM?}_> zf7UMGNY?migSQU$DB5P@%%$~q(kUC`?rn^p<3H{E2D?3Pr5aHuTTi}Sz_lFbkfc-d zmvu=W=$^m1m)vi7Am7G`-dP#w9^T=c^nt?@wmW!t1lQVUE9A$zpr8C1b@UZ{BgbN& z_?9PTEwY0DS-{r;arh=VJ6!w{VegtP{aj|F59(H)wnKC{I$5i1x`?`G`N2uA=eUJ? z<$6Z7`{Bu+>`dxA?8K~8P5HmWhj4j^S->YrXa&Eg#ZI>XopSjf%BC)6Ad!;GFRRH{ z)XyFCm0zPDej3CVZ8RtO$7iHi!QL#?@d@w<*!#?MNc`<+R-@(e1+$jC%Z^W9*a7wH zhi7M9^T&0TnKXz0StsXC!w2Zdu{w~XgCi5Sc4Vn+D5wwUC6GujwZQM~L3MJnWOb3F z*?n;e%zp}5+CcNV_LJSL5r`4rx*E^wS(%5}fp;ByeIR>iH;i-B#-5eL}7J^T$kL=l$b5ob!o& z?b4#PZ7wZ&->B-jX7Lh}M$c*sUw0_k zf4!15*q?)+dRm+#Sz&InFPF?t^$ey0{E=^lnMy%r~Jo4tkGZEWXQ+ z$4dR3HT54FH<5uvO5***m!Xg1EZTg3UHZ9e-Z9d1!^ZvsomISEo@>*;3uDAiSO2GX zxd(de^$G6;;`O^jx4yd8Y6JODy8IlWemArL%$?h8AL`|VILT+}1Kdtx?)&n$BgdLk z|LKaQA9TtXGv0ECvu{7>d>{UUn8s$z;S2Y8h4e6+ezZUM2BpWwCU~Uvb56jxR|dWE z`N2cc4Nw-AG*K9Qd{3FDZ&P9Zl1e#9?N{2n=TTE1)8uN7`#+|R?qxpPB< zRPkG(KFz;Pp#KJ9D5HuJ7rvN1Y;10}U4UBbRa2kvoMNjd2m5f_8{htGF!rv!6Fawk zaqPVRh5kID{D%HMhI!iFe(oIN9cu4A{|@SD|1_qT!KYh*vF-Vbkuzyb@2XS3T|nK* zA-?jtKG{T=zeh}YE9P;$E^SN=D?sa>kwe5Dg`456$ z-RWR>LcR4P9YxhHb9HzVB%n;iiiC{SaBqlv^4ab8K4}I2;5Ez}BVl{r$H9Ji3%hsE0&BB9Fwdsg#Xis}kYjVV zANFFMY|_)HbL29_?t#76LFAK`fts!TmGEIItdIwC{HCM_pj|LD)=dtD5yKY&&|} z|JBXA+09eA7I|LdpUm@)8ICyB(z4`5j^dRcspUyD1q;@8s2{hejGfm(5|A)N;up6B zHlG3UaZ*itHP7qSKlM{|6h_Wyhc$0|%s*COeo=tDA!%vS!q8tQ@ZHL~$@$qd$+h400Cq$7XcY|Bs2Y8P;gop{U6%v5wajYlQD$UYCye^qayQ zDW&~U;0D=d$bBmN9U5nU$;QpBV8g~IFxPzn>%DQ9V{gZN_vY3?9w+zujC)f!$8Jvc z*WJ5Eb8w4Y?m7*Lts-?bbz{{gDg zW;1^%c2~smF(CPWIC}*ahSd>RSKShUFpJFN2R-djoS`vXfuCBY)_+cQkhiYiYEO zCfrM)&0fuG56OPAy-XTEe`?v-#kt zl0&Yq{k&~K$dn}b^mnMPY43(1ZCsn({584#1I*n2_{V>Ze0Qra*L@{|{Rw10uiq5> zp!vpMitiL4eli+Ryc{0j#qH>;eNDfK{sY;bk9buWV&Uy*o=`d| z)g<;)p7D`^-tt`REjreNHElP-e#=_{?A`>M{g9XVeD(4T7PUuCv6_!ItLFIz)_)yh zJcslB68aZ?vgx%Qu6~DU9d9>s_9?&Hi1qAxa~Hw{`;TG%*i$(F#aapF*;!$4VfV_U zg`%pNZ?mdNDQb4}CkE7iHR^uqhj?ZsU!+-MKKQ-Pb#MdxeU0aE1NOg*_=%O!e%>}i zc!T!a1^gHLQ%0R#_c1HpXfpe2FsCd)F8z{iL%q5;Wer%5{WTa9@^V~57hagY?73{L z!y0Wr<(aGJCe$EqQixpnwTPoQmVJ}auH=h!L#kQlJzDIi80>k(WLF?J)$YoMuiMc3 zPV2}<*nbmoseOA!g?)&1?gMCV611B_#H&6+9Kz+;l((MCTeZO?YXb`VlWF{=+|B~D z^;J3U5za+XvpU}S<#*B5uXf6@8)5&S$cb3EFL35*p=Dv{lo-Tg4`V;WXsn%d_-Vm=Ey|`ZQxj#N{Wp=rvFiIV6FO4{ zM)uol*ts)E@gDp4jCbzt{gr*OpXkYw&(-~@W@WU%nDc8t zW!$+35zlRUwgHF130BZasF>jRveM8;Bx|E1)dievtP z>+<9*IY)w)oLdv8JS}`ugwd1b^R!%h*U!_U%I68U{;duk7jbhP*xzP{`IWD^*l~#^TC&$5hvs^@$12lJvPjbJ(bUi$Heo;78~|&4imIL z9*>YecG#+>FSBg`6OZq)!FGGahVBMpYBaWA)_ji9vGGS^`V!=JdFyzmcpTce!OyKQ zV)}5*(U)Pbr$ghB(O7Tz*p1kqn~~2-h_OLz7iRt2mN0?JK^(9(X_9RSHs#o>*{2Kb zHso)e*u<+ov&MIG7W0@0m$|W3FI@FT6P}YMUai=2-N%J$VlpSTnsr}w(lYjH+G^~% z8n%4wy#oeS`{VHlxvASEV(KFr(N7qHv-sBP&pb;eE{JIe6OYf7*i6{|v|^?2=9}?#WOzQ|2i2FNW zLoCQ%h>37L?%1#|@>T5BTLT>O=fq>;`Q!TB5O++}h3Rp`mK&B_h#cs*V7uy_;&Eu> zkJEGe0l5^~FzCAW4>t3RbH02V(hseSsXsC zkZdl-dqkKB>ra?}8k@_k3-=?yR$RUGgI8$|i0_@mlU;;`zIBvi-?%*IW`iwY;#7Wa z%VX1JTT`z;Kb-J=l-?5qaYD-8A95NauTy z6Rc^gvF8S2ldn%#&0dcGHAVMf1h(?h$%~@S%w3vC_R{yT2`3SKGpwmO&U_s-fK84G z-?=epZOA}u<%QwXJgA0{zZAgR@tv)Q)^C3Ezc+^K!$$FP-A}3hF9u>$C5Q^KHOBS^ z%24c8Eg4f7SFUfp{ws!H!}k?biCJdER)M^4l^)(|Gh-{in7ZZ-UY8lLRcz_!ycT)C zDjmEo;%35DPHTl&uU3uoq|1cZDE7Jz-zs+@xw;M$W23d)W#zM1^wp-%NNg3zyI!2X z?o+Qb3zvri3*nJt(p<06ri-qb2%8)ez7^x9OAlQ)0$T;X-KQpt&auBFPM>_u-%Nn5 z{M@Jsftqr)og0X)UVo=emLb=gf(?1;cE5g_{;VN-=pF;Htus_!L-#cWTSKxne>Vgh z{x6DEn&ldM-psI792}Q8sKfraki^2yG(KYA!D;6f5OnQx2gCZCN}I(ZPQeHjVTXoIOH1|HY&KxTET0T zT%zQeN{(-<(*1SJT1LE=P$q@7EpY?Zk=oaAL=P-uv}D?AQ-WVYtI^2N3~91QEoAuno(=$CYJ-42jp1${YDhmsmp*yp(>Z`20{3;-- zyYtI0^ZVsL|NqIVud@F4F*~RJ>k-N0Q?391rS<>q|8T?+|M!17;)s7Z;vbJ_JsolG z-s3>e?Rvp|Ih#Rk2g;J!~go9|MS0If8mAy?SEZ( z;s1H}SHJq7|G)q8@_+h&&-&c|Sk=K1|HtZIl1@Ab5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjycnBTG`Y`f;#1`8NE0RjXF3_@V};7r(c z``5yzBaaT7{^`g;Y(k#|2oNC9K!KH&m9YOOkA<;QPH)$jq{gT-4GaWBCP09|00d_L z@^YAX-=%M=FY3$ypmj-r0D*=HEbiJJc6{>FYt|QareVQgxC96gh$yhKun_is>%lN` z>PNTFHRmxr0t5&U=uu#0c{xn~_|Y)B@wD96Fso}& zkDIp|0RjXF)L3BlPk#q% z1Zpg>GQSY^-2XrrIp+ANH72Pw9s~#wAkb`qgTMS$7(eHo(d&!rnP$h8(Gws*V18^o zY`f~}fz=mvMvM_4K%kidO9u{wsV{yxY91WjG6#}W(u_DDgWq^FnaQ- zh13_qYv1Zf+2sBGzapzRne&bC;sW0kGvtrF? z2@q(O!1DZj*mK|g1DU7XsUO`wH%s1V2@oJqe}Mzf{348>{f?nt!>q1B^%pln0t5&& zLtuV%G;F={s?yY#POWK%zEKh&K%l+?OZ)eSsoTC#*gWM<{pj|&zVb#!fB=Dd3#=?H zg?&H#w=jCrDW$uHSzUwbeH4t2009E^6gc#Um%^5JUsUS)(y2A|JOV~VfB=Dd3M}r} z5w_p(@k-Peb*7#%XjB9U)Kg%2ZZ7P;=iV@K^l_D{F-fiQAV7csfpQBRcVK`QD>SH$3{wkK=}lgXJ^CiyY3Dn8;-4YjY(>a2LS>E2ox)D;Ac;U zu`|x9eSL8~Q*2z>8UX?X=Kl6-*n0T~8&hA@88J_Q0D)ozmiFxnJ8!-vYCKrsR{FZ?cSKL5f-*B5oBm{_wF z0tA{Ru&`}gn7sBn^`$k>Or2>~>>Dis0)rJu<|*&GY!!fVt*G`^o`txAr^-h2Q zf%*&VfBcCsc6xK>Dd(-5^^X7}BtU?`UM_*9GcJj{4H6H4P4%o`*g^()y0OEC0D2Z#{QnMFIpWA+Rv9 zHEg@)TJ@!e`l8O{5Amhx{bB01FTCkH?(+9y4FUwJAh3MsP}p_**TSZw%v0{vi(a3r zaJ+}TkL~Zcd-#W8^rW|b$K9~^&Grcph%2zNvJ&?H1FGl@2hjCpWpbrf0jjaBPxC5$#>jszv1JV z@s{3;r3466L11yup0MMSpUynrv+}9sYuBDC#6Xez*#3^YyYKD#JMN0yH`^jWAg(}r zp7OUI3?s*%sK!Kkjcl!28~3PHySD>RJsrl*JUdssReQwto2~WKWpAF;Zo;T3* zeRb~ibNAOYb&R{Yzqalj@%|4K5^r_%GbRF65||&~9JYSwszT0pwWa&ovf8Rj@szc% z?R!Tg-*H#q^PrQ#VOH1I z;vyvOmKG)^!nUi2{~dR6N2NCc1lAH*oSF*TZ@fu;saSpK)S9)9X_^1lzIVh|%kv#~ zWwx?!1gb8uGT)k~eBb?HIX@e)fYvl>`=dw&p3{@bSu>@14Bqx%=15602c9+V_t5(pM_`n(VOs zY@a}t1eWLL!|r?THBY(b*Dr_H;bFz-8~2W=_G_}k^0Qq6RTDVy)YD=7?02|^X;_UJ z*7eNnAO94#y!U;zh_|Yp>-LvG(E{_Mqhafn?x%eCzww*&dyz5MeoeM!_l_vi&$b9u zNnmOJ{;>0w+ba8-c$4bDpvPK7+$OKd*7e>IMflkUfhq~CEG>n7-~T}vJ?WHMyk;@z z9NdKd2OYoddq>pxHQ7P?>7PKA1P=Y-rLg7Q7pX4|d=DnAUJfdToAR3Mp#1bpph^OZ zJ9dQ0>u*qB)R#45Aa*P#ugNy)-Vw3=^hcmd0?TuAVfS5khmoU?TQk3;{TtV^e4jz7 zvRAB_Zoej*+&iLSugS*p(+`2F2^{#@lVSYKbJQ2tFqttBBes+Kku~)-*%*HMAW$WN zxlJQs>lIgK=9Vh|``f<9z1E5m-^(+H8XI#l{PaPf3Ia>h(_!b$x0t8w`XzV1j}hPM zObkVR5GbcW@|yVGhrSm^Pu!S0zql@ldtFdf&lr)d&csmE2Z8bl9D4D^u=#@bs4uQz z`ig-Vk*&_eP}B#3@(3(UZV!{!Ue{M{sp`MI?RWfZuo#i8&csmE2Z7-WEYHq{U3c6W zMm8L)#<+%w76UONTb+ras1E|e71;my6JhL(v!dk|*9Gyf3#w`wBeK<*7>fEJFdTuo zS6>ZVFaMzW;`(J^F%ToN)tMNI`XErOz|y{bVaI1~4x8R~)WGsfRsa2MzvEtu#fWTm zCWfLu2oxjGo~Qiacf;rjC#x^6VG4BbdtG>8?8A=Sqh-`HxhN3&zJ1JZ-V(N5z4lzE`i{C>BO7Lpv28Uj#@V3G#89kXAIk@4!mh7= zEo?gS=r>)%tj;_28+AEHwA$Ry@_x}V5aX;+XJRPUr;nADl`#G2V`1!+)7Pypoj9-0 zsLMT)j<;tuW*9LLGny8NT)czaf7h7kiX&JcAb zhGMn*SlqQM?D)i|x~?ysSg-b|tF!kVZ_nz?Fk&FanWE0bP^@MjEAtCs&o>_kBgdYQ zyT&B(?oo`uFmj7+s%f1Vh!N%LObo^9^>Of*zY62$ytAkJ5;Oj)Cs+I)cf38z{lkcX z7!j||#89kGAM<15VcS(#_f=myv0j}~S9?!8-k#N&VZ=a;vqznYp;-PtmJS>UQ(ydY z*!1=dQEE&Q?;gbn3?sMLrkd7?ff!M)&cskGZyzhm%VGLQkA%^aPmNYzV#Z&2<;t^X z9dFNa|1e@8#+jhb#850}ABSH0W7zVZi=)?gVknlY zkHsB3!}c3*8d!bl#Co|#UEjUwczaf7h7kiX&Mb8%hGIGTSe~B`d+xhGj2v_Pz-vqr z?;gbn3?sMLrkd7?ff!M)&csk0ejf*(`9&B%>m7yEmzeQ4e7W-PLC4#(+&_#Mh;fFf zGcgp0*T?+GNZ5MiKNnhGIyQ8#PL9dFO-%rIgg#@VLM#8520kEQATVd}QeN1dmf zH-?KJbu+h^_qb@U9>t7-7-yY26GO4MK30~N!oD9o97a#tIFxIc)$v>0sGGf|)#iRy zLyC@p7-ye46GO3>J`TP3`>^H0i-ulbI&ogisBNX=?OBZ(MhwI_1J#)rii7QAVRCzz z{OHF@Q(rokfBL+Hg*w3>%(~sU@*Ik~S4ZH8UCyZ=3wsbWniFc1; z1cs4YY*S6^#6XNFS7%}<#_!|6lTU@QGtVw%eTf-=@#X5*W5?UG+&_#Mh;c@#Gcgq7 z^)dJAt6}TqA1rl!>BM@xQR^v9pyTaXof$?9q{U{p%hZ`}r3Tw>Y2UuE^K-X`O>aA@ z5;Z1?caLHOhLKxrQ%&o{K#V9?XJRP!-bXS|dGABt3!^8TT$%b3GyZy)YtEV-Z_jf7 zFk&FanWoOfQ0%Rbnde^!o6o%EQIT6qOJ-k#N&VZ=b*cwMW#IVgKV#gt61ktVMl^8Gq?=mL>unZ_jf7Fk&Fa zS*Xs$P+Y%{xxfB3OuYXCwagXkkJ^%$0>j8HwyCCdVjxB=t1~ea-`dCGo;_j5r$1ZE z`Vuq#-YVxWhYNJPJ#l6dzhMqn7Z z#WvNnP7K6|a&;z#;%j}({PwqD^E=P4eSL`;fARF|+f&Eev)n(77>IFZsWbg6E=){> zZC790nEKL*_5S7b(2YRH+p{_|j2P%9Mzh+eGg(6E%a>>8!lt9@F;6*f45!Oj8cQJW zanW8qiWvhj;#i&OPmy1Le%8(wh?z6=r3U4Vf$Rv)ZXr)*8>O}2m!@M`41v6PL3_0% zW(>rLVR^DYMSlJHSvy-GX3o%;8k9E%vLiIRg*=&Ul-7b@nvP{L1oGwu?bVW)F%Tn$ z<;ngO`Ss^#?QDUVIYVD+P~I5Gj?nBD@?^GAS_^(@I+n!{$eS0mS4(2XK#UlcC;L<6 z*PoxYvjt-241K9Vd1D|uLbF@Qli5aTE%>GBSQbMdZ(h(|Er}TeF=AMr>`#$je}2}^ z7KoWM^rZ&nje+b4&2Ax2W*eoo;FqRjSqy=^c|m)%BxVf6h+%oMKSh51`B^(#AZE_c zml~8e2C^eGyM;WNZIsr6Uz(0(F$D7F1?|<6m@yC|hULlr6#4b%XYFi(m^njVYEa%7 z$d1tL7V>1aQCbUrX*!n05XhSsv{y@F#z2f1mM8mD);wIpT?#E4;evOh(B{rOotTOel6(3cvNHwLmJG`od7nQfHTf?t}B zWibTu<^}E5l9(|NBZlS4{uKH3=V$F~ftWc%Uusa^7|4#$>=yE5wozIOerY7?vmdQ{>m5pS80EV&)8esX=*TAUi^{Tga2yMrkehrRi7}Lm+Qn&|WQx z83Qq5Sf1=pkzap)*3K4)nKSgI2IY-`>`=$^I1i z_2*~pY=M|LLtko8-WbS^(CilSWVTUS3w~)jmcO}2m!@M`41v6PL3_0%W(>rLVR^DYMSlJHSvy-GX3o%;8k9E% zvLiIRg*=&Ul-7b@nvP{L1oGwu?bVW)F%Tn$<;ngO`Ss^#?QDUVIYVD+P~I5Gj?nBD z@?^GAS_^(@I+n!{$eS0mS4(2XK#UlcC;L<6*PoxYvjt-241K9Vd1D|uLbF@Qli5aT zE%>GBSQbMdZ(h(|Er}TeF=AMr>`#$je}2}^7KoWM^rZ&nje+b4&2Ax2W*eoo;FqRj zSqy=^c|m)%BxVf6h+%oMKSh51`B^(#AZE_cml~8e2C^eGyM;WNZIsr6Uz(0(F$D7F z1?|<6m@yC|hULlr6#4b%XYFi(m^njVYEa%7$d1tL7V>1aQCbUrX*!n05XhSsv{y@F z#z2f1mM8mD);wIpT?#E4;evOh(B z{rOotTOel6(3cvNHwLmJG`od7nQfHTf?t}BWibTu<^}E5l9(|NBZlS4{uKH3=V$F~ zftWc%Uusa^7|4#$>=yE5wozIOerY7?vmdQ{>m5pS80EV&)8e zsX=*TAUi^{Tga2yMrkehrRi7}Lm+Qn&|WQx83Qq5Sf1=pkzap)*3K4)nKSgI2IY-` z>`=$^I1i_2*~pY=M|LLtko8-WbS^(CilSWVTUS z3w~)jmcO}2m!@M`41v6P zL3_0%W(>rLVR^DYMSlJHSvy-GX3o%;8k9E%vLiIRg*=&Ul-7b@nvP{L1oGwu?bVW4 zF)(`4#uyFMkM?V^P|*#%Nc6MiW; z7DW;0Iyd~2Jj$y77}$Enm0|AHO;KXE(}_IUk?8H2UvF;K>Rv$Z>_2xh%r+c9^PF(t z>7REWm^oU?lR2=~Xv%L56n}~;AV+5BNJhOIjU0Vk*nQ8vVR>#YYTT~wOrBh=k^g6Y z`OU16Pe2asJ%_SOx7&Wh$HT(*?fC+-ht~3B4`{1a;kOFIj{^~qE7Nl&pZq>sF1#ol zdhz!IiPyC{l_%Fy>Hcs0y0_A@HvxGxe;#GFw%O>38^gYbe;8JlmU;`u9@mm5dxZP@ zYW({1vv#(CoVj++fLXjG+!~@>;FcUY%J> z#ouBI)Ztt+hT>{td!F*W_l4!z*_dJ2b6<-)cZP{eKcLR^EEwFkrw==;b|)Z57nh@} zZe7$o|l7r)%t`qGJ|ZmhD}xSq)pvblTVi0y^OO&d;ic*QVe%u_sV}SQOXrv!Zq>{0>P#ukB)R)fry4tJPpVgUO<*e7OKqp>3H@nW1 zX`XWO8rjSXzY8PBpQOg5)R^R)jqy-tVkqh(O+bBVc6}MyaBSFJqIt^6eK)sUe5v}9 zQC~XeZQ8lr?J{+yTPf{&73jpP=jPR$Qq5DIoeMi}`-1w?Wqs+Kuf3l4tJhO!R%`fq z5CWZe_1v5~Q@VM|Py94&YRx?mgZX1HMov&?Vkqh(O~ARG|J+{7Y~=V8!;a6~9QHr{ zL~H)-NLbvxJ1p*;3bQZ29QJXud`p1!@CS9K2Q;hX5@^D?7=4Vbd!9`H=#gB`s~azD+ZM)7 zJ7b{vwmnbz=g+L(?9hIGeV+0O<|)UH#TW-wor$5Sk2HbUabNfTMo&I99QwmcX{22( zoBQiu2U2I+_fx*--qPGpd12B#P$a+*6l_hMyxlXkFnFwidtimW3wUE#pbp3GloN;pq>n|aFlk7Lfy z{;zfJbQ@=B?bMkx9m`?}tQEWd_V?FeTKPQ2d;V$1X>re6F=F|PXl^F&wUi}*m>*v^Rn9aQ!dp!tUUaf0f1(BR15T z7>fEx6R6TTRn)%D{Pwvtvgph9J^aHr)tT4kDZdzfJH2$cvb-GjyPxu#j!#i>*v)o& zIi`oNqs|;I;`i7B-NbT}+Dv}r`q;#o{T+Df>2@A#&r@#QYjb63DRZ4cH)!8a**xXa z)|bvX86ytVnHY-tNE7J9tLGy_@?J=C@3EpEhkpNuFxC2wuOeToOB-XdALc1n z$FbXG>P)v%+Vv`+zPyo7cHebRuZ*==FZu3*J?1Hw{u*ZWIU6JJ)R`EH`bZO49kWgT zd358crMdTH+VL91viALy%~P&aed(O5G2%g;iJ_>EG=WaMHvM_`z4xUt)pl8OU(hY@ zy`+*kw&^jOj6cRhor$5Sk2C@2YU_2g4abC~y?fJ`YPYOCPx;o{)Rz){7N(bTF-Bmj zGcgqPktWbfY}aj_ou9oqji^@3+Vhkj|7n!_MAt12syLn)!Ku!~P}E17Ko!re*!w&` zI+{jQi)HP3%CGz_jGc9kYnX~(!>o?~7{RH|#8A{nn!xIqZQ{>cF1k34rxwdzo2Pue z`ck9%(m7XS1gJU_Ls1`T0-bnm>hqra?oZ>X^fL35-)}2)bJW6iS5yir-kW9ABz%3>P!?youmkKn~&?* zZv5s3&P1cs(K-TktRLNuY3fT~Sx2RMe_o!Q z3p>qIuJ!fXwhvzu=EpZj4^DL^I;jp16X-T4*RkD!C!ab@qk6x#=P5t-xOvJoeSIuB z@5awPFC6^!vjYoGb!K3+I{v#r9qUK8W11fyuWTG7@4?Kz@=8d)E2rD>YFDk-)JBdy zA?*FugJET1VW4rU&J2`S=PiMz=AMybjxWXi_j?IK_fxJ`z3Al}+wsXyhs9mHdkK%+ z>!>ri$*ho5pqF!?4(m)@a#>EP;WvM6p7H~Y{kK6K;x20pTQ0sd%>MZ=g$A2CQz&;M zHW%HD4TVp%(l#^p!^h2E~TD*DNt7{#}8dp`mYv#3i%I~Xf ze$6^gwO>AfdCGaSm^zbJO#8e7wLg#7nTNFZq3`9TDzyD;^OV1!zN~Zn>JYbsnx~vM zP}P~dV%p~wsKfc%%NX`Q{zP7?LfXG}KjkOPQ?7A+8T35myn(u~ZL+cdp2=&aeQyH2 zhR-7LA`7>estamiJzI5_lmX+mk1UlYzf8PAA z3&PBApNoUmXD_eKQ+7Y)I>+2F=P9ojp2@w*w_b6j`m*Z!W<4u^k1J5;b3GZ`XzMd4 zd%ycoNUj~q@Gwug=GQREJms%`E$aQ0`;FVB{rkhtTW$-R-gcB4v#Q1<`N5+Yf!fxY z);YEF=3Bzj-o3>@W^Bbg<(k)*R?aHRJmpR(t}HEuec$_j7(L-+_2sbo(#d-rE6;-! z=y=!ZdE&Cm!(8hglVy0Ar(FN~Qnq=@N!-u8@Vl`2{0r5Wb?Qqe-<2UpG+`e)-gS5$ zJN>M1;Ac;k;;^;nDZgT#avkDoy)l$=p7O%>?P2oz8`PJK`qDY3rAQVH*olsJrJpw( z6L#NqcUYdCEyWRA+BY4xUHcK|dY9*V6=UzU`ze=bp7PvW*!}gp!=~1`P({yS?QlR+OV{l6yAOMV#2I>|icTR$I`_U$Xxp&N=tkFQIW zX1Y|KFNBKl{19zwSsqF3@4oXc z^OOht`e<2>cis1+Y&mKB$Nx1X@2ywmQ8vG_?$5sO{~-DyP38skI|rjZPx;S(iN0_B zbh!Vg<|!8y$Nd~9>vk_t)bY&P&X#vy6b}92rS5mUBrUVXW%-d|Z|gHfgL>?J@Vh-- z(x%5v=Mz8`7FponFoC!G?e|LsSmnWvoh zco$(*jJ|k8MvdleabKytm^MpA3sTr)o<)XuqoUpWL&o z=+8avfBcEpb60Y&&Dj#oQ%>GLO70OlcG{V*?_<@DX`T1Cwuz}^0~=HfC7)}U{o|iX zHrn{RGbq2R_M3cmvgpUmv%hK01^D|s<>lp~H^1)o%u_D^`$Fp;JPV=<#Lj2Q+@I-3 ze-e`KD{jIgwqKR|+xnrahH}W0d#f%VEYtmzr^C+A-fW(71>UO}O29U7qtWtOYo7A1 zuiRd$^Sy|}8O^T(=Va{f3X%?99kFoSEleh<;zsI>bfU$B^$RYu&3rKXFjT&n5Kg(Cd2r z_|<9MvVE6vug5d*dhL12*Iws6{x1JbTDF+ad%U&pO`wwUOSvEG`qk*)d}(7m`0Hm&d0b-b zRC}Is>z+2F$DiaHrl#>6BTn>@EwEM&nf#ZJgoTNT?3J}>bpA>1TUW<>)+J$Wo^ts= z%fD9c%KJAdtQdjS$7S<7&kr-tJzva*YqFKqeogy%@}nQC$x(b`7z^7b!=!o2jrsS} z8%N$xgA_<|$cAIzIFbECpu_@Mv0T^X?lY! zdo!=iQ~r*5$_>4KNzOgX%?Hd=Zt(R&*In5SH#q-Ix2Cs5?M z*zdMRH=Y)zAN@&KSza!USvHj`3NThQ3br+C1e~OBa)Nh(Or{%3f!-efXL%KfbwaY_IQ6+5PO_ z8}|^4Wzn9e{PfRXj{!drAdoH)>)eao&-l6Lg@eC-Hht$yur&6#8{1#&v$d10?{nMR z`d;dp7k(G!HjRY2S6&GR|NYk?`R>!?HPd0+wC5?`b&vZgm*Bj!3)K=B_PKlb_D7C8 zG3;&4*;-jxs08HU`|tOB*AJs7oE-Mt|IM(pcVFu9UY?l=yIY?{N#?N+!}zs%%9E-4 zXdwXtYYPnHoLz65$-VIxckNz#M@#zG^~U1w+4W}o$8HQu2M**qvh!QE6nbsbo~K;G z?<&fLrZIsb3zQ)rPF(W-F#Gb$Lzd`m^JVa>;y&!T@BWb7lc$$Q@|s#Qk9d&dHcz>i zBV!!`YYPnWT+Qlx?9?;D{>Pu_Ip3^3qGJD=HAc(dd|i{g?sf1NzwG-U9eVNigQ+v_ zr`-3k(E)+O1%{Fbk2)soy5r7}yyjl@$58w#I*&McFMsaUP0t6?Qs3)(#q32rDo~L}b`za6P!042~ zDuF@gz$C})edv2(WpQ!UR_pWQp#7@efAW6JAn!%DzxCZdy%@Qla(&K0BPqW?FXw1i z>m=`|-h4~za}j&XkI=^+c4bk~_fukwE%}_~ARmi6r*hR9^OOg9H1thiZGjlM=6^NM^$4);h z9QfIj#SUP|TZ`#er@kgGyP~k1zVmapu3u-8>*`x>3rqXb?>8{yFtT|9wHAny+gkT5 z-hJ2IjlAzu6u+9it~Pq|sUdkitEfkEKbp0U!`90`Xr6LW2f=m-qzJ5ae&+exLZU;Q`#Q*`7?!v!@lo7{H8k7o~QiO(}nJXjS(QQzCf?JZ}a&Vw(qOEe$UNV z(yL!x*V}sKKNo)B4?Ou)yUw)dDYvd|mS<-R-v=8cKwy1=y!kGwG`0_fy|w+qGZK-h)|d+*4or z%A0J8`lU?Y<6YF4ZHGXW1lGzIhyTs@)2@F+54URS@5yy;8NXM1{Uc`y0Rlw{q~*o- z`>6%Lr(4vxV{IqRuSv^x-F`x|dT`iUOv5+FbzTcF8xCb>WN%F0SM zk`@FA5FpUAK$Gjt)NP;d+0BXs2oNC9oj{Z8%>E~S+8vTs1PBly(6d03>&*PfNY8Fo zBtU=wf$jtvTW4C|ZRb0XyNeO62oNC9k3duF%$E1QuOBw+5+Fc;K$ikdtus46dvljU znh_vCfIvS2O|3J#@ACP~e&WWu1PBo5R-mbMX76_&>Xt}50t5&U=tH2Xb!Puh9_vHR zsssoSAkeKqQ|rvZU;TTxMA{J`K!89W0!^(m?rYXZ&{&lK0RlM$npS5fF1akszWg6K zgft~UfB=Dh1e#K3#!fpU?0@_T_s#4lSgcEc0D&F^YF}rLIwtJ8r=ui(jRv|!u z0D*o5>Re|gue~lTOl<9!$od2b5FpTpKppGM=678XW}bV#4;8BtAV7dXEP*=JnbG4< z3VR>=URYUNjK!lL0t5&U=u@B;b>?kHg`J&(PuSA@A& z{uY}>e*_2+AP`BQs&!`U^s~Z&C!dO>pc?`N2oM;QK-KEZ$cAIX?z`>@%d@kCBGE4a z0t5&|6sS_2nf&O-!ouWa#L?@D009C71}#v9IbB2^rRnJ+2yBA@0RjXDC{VUKv-OHA z!`!Qz1~_6}6CglAvsWaneo)Zo{^NS*fZd(Kh5Fk*1z_9Dg$kE4zJ@?%omgnXQ z7_ChZAV7dX(E`J)Guv;xDJ<^TQS^{)j{pGz1PT-wMxEL6p7(}Be|V|DQQ8y%0t5&Q zOQ6U)GkVe~Vfsgpn5R6fgKfJ62oM;8Kp}M|nWy~4FNdZ5`-d<>nohJ(NS)euK!(*y_*AW#N@*mY*)nB&8qZ$1!~ z=jY2XJo`X^009C+7KmAAc6{PfVR33|$Ro0O0t5&UD3d^pI+6E6d9z8I9c_K!5;&vI+E5XO28N?E320!t%j`WgCwDAwYlt zfszU2tuxy`d`*}i-(0d$*c}1{2oNZ%K(}>f{M_@x%(K5K>oDvW0RjXFlvE(A&Ws#) zV%YoOcf!iTLP5U7H{>N+!a>KS4G<4=T@m6a;&x_u--fB=CC2(;_WQOAVccYZxA&&*U{ zkL@A>0t5(DNnr9{J`xrtCaSc{_LTqu0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U zAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C7 z2oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N z0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+ z009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBly zK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF z5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZ zfB*pk1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&U yAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs0Rlr8`2PWz45niM literal 980726 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 z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV= z5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHaf zKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_ z009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz z00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U< z00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa z0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z g1Rwwb2tWV=5P$##AOHafKmY;|fB*y_kSYTIAA~+r82|tP diff --git a/src/installer/media/wizard_logo_small.bmp b/src/installer/media/wizard_logo_small.bmp index 9ca204fcabda77087321ab8256b6d1887220c6ec..03d6e4dec76dbb1a860092dac344b0f7a451ff94 100644 GIT binary patch literal 12238 zcmeI2U2GIp6vvlfO!U?GYIrclHxqgA#Ro!+2&EQkYmGvR8ds4B1!6)_Oa&{76rL1o z)F5gUqYr{2CRz{+n#f0NG!)J5cG+dw?S7Q*NB4V=^Iv+VGqXE0ciNp@x7m|!&wSiD z=ltfLduR9DS>Ar}K1W&hN&jD!J`c=%7CDwU7E9X?&77Au6+#Zj%|9HYM1jUYay^rU%Es-=SCG%v$N#_ z0lMD5yDC$&vK3P)ihlGlx!T$dxtb{_OQjOUPyR^bJx`i4S?#x+{~D#vU#Q^>AZ{xC z*WcvZv{{%*l&zRdQRIUU$+fDTVn;p`52yw$^Pvd}4(zqeWX4u17HR6l59H~7LbhEm zwqhnj(IcOdyM2x9o8z^jtKHt|(NXek+*Dz=9&Cx>Q#Ah6`U>Axn7FNyEf)+@aL<6Q zT|3z_SFVu1Z@aEZtMOWC&wl62mXF0~V({+mx<$J+eVt(+M(I6RW^6m<1IG6c{6U^K}|C;G9uM!jq3^EZZuo)&9^A=^Dz0hY@O`~Y0V~bXo!l*BqI@+ zvYv7BZg_UK-OT!jUjH?c4RvysoK)LEjDc5n5!Tw2Qi#Xt`s;gynV7XvZ2p(F5Z0lT zqOEb4@_CAVdDJpfquGpVFUY^tALq%{v3AZ};Jb0`xP0sCIhPcs;<8`f029_IFfa1G zpNqcw-1C&WaFNZHb-maEJ9eu4Vh8I~p?&-3#pHRcn{Ir2OqJ`nU(@++N{FdrUc>!xq*glfV70GK*(?{HNja+MD)zk$sghogLUgtrj&~GZA6K zI4Wf;`2b0>Bb_+?i_vM-IT1F@F?v#%oGd@@_2Lyhj&W0K5n-GB z`kM;37`xHKpUkVDm^-xp0AcN^)?&owUEfQIGry`_BL5Oneb~LaW8PetkFZ8)msDfJ zx-sU@Vm4dh*87b3cV$m!clnv2U5CaRF4l7G7A+gbRz4EZb<25Vrm_Bwu?WF4746a2 zSaUC?)4KL+d4k#eoBJqzdCb(b857QX)^<@o9F}cijt%X7oARNMe5@WD`0a^j62_5; zh_E4_n^8pA@O`@(#f%MON?C(wCPpJRyu*ig`I=R#vEf}yymQ&?qGZE6v3NIDTbpQB Z#xk2!2g5tec$ax03Enl=*1_t@_aE%9msJ1& literal 4158 zcmeI#c~n$Y90%}cw%BHyG}>yGWviwnGE9IYfwGDsn}Qpnfk+ApRN#^zR4l1!3JCbl z5s5HkF)J5NS(1PW0v*vnITal^!Z2*ZY~SuM%$xg$H{kR~e|gXO&HLSZ-)DaB-M5?> zsfYc;%wU^+C&Nr5naxm)VaDkv$mhB7`e4S84v8bv9gsiW5&1KvD3~!9g)^i$I!lUU zGo5hM+6e_V&M35VMWMtEMGl@QndOW!YZnsp@vZd&oSyBDGbGO1c;Lr5UijJ88|Q5o zp+dYEzmmA13wvKwNqkT(S%MmSKOB>K>Pv^GWVP38dNWfM2&AaY6By2IcO6uFONb!*|xf_ z#6Kk3-B+Q*GX$L^WL|3^TNnzNPZ+xV)}zZm0$o8HQ63(H^7XN}ydoO)A+cx(i^uN~ zTk%s=0_3Y>AP@nsMGxs$CZ?k@ zDFan0yKymfAFgf7K+WDPTu;kJXL>ezcJ4uM%6{~wX5vQ1A=DknLtQ3|hMau-nN@(k zJ$dNcdl>yWg}8F02v@%<#1hm{J&)F3E})~l0?P99P@bzqTXhY(s%p`7u@1@$HBeR7qWw}GX8K|Vn4%G>cj zt^q69@-}Y~9OniZE~Ar#1>$JBKRg$5NsGi{%Uybi9buNbtcbUD%2F5SqF0u=9SaT0 z68CYCQPD1U0X2x~-aF)o+tjpW%z*AhkWDk+ZyxY3KL=Cx&z)6Ieb4iPb zsX>>${zaWKj*UT0Gp&Bo5qD`B_6-c;!OOPvgg@Al}|h!Iv|@he6~o!@~KQ~rZH z9QF(|*>d;6^W^1dvD@WLl*R5dzk3FmW%Y8_-mh1d)tmmDL0RU8e(nrnOV;JKVb9TX>=w4Iw z`B^7w2l$Hbym#tfZj^I%W5!xpJ*4~7!EeTT^WWDiy57u#z6>*dET0Va49-6C zkbzOhxt%3Wuo>KLPEqyVWX-wz*6R0XC}ynZZ^qrVByDJaAvbAxhOnEP$W;+=o+-Ln z`uv^^a3|+FC5BThJIqPr^|O?l`Z>!^efr&8ikZ4MHsuY?8r@{V*ll}hWm4~*)d#s* zqkE4VqY~b6?x!X=H!hPJ Date: Tue, 10 Mar 2020 02:45:31 +0800 Subject: [PATCH 07/27] Prettier format panic message in spectest. --- lib/spectests/tests/spectest.rs | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/spectests/tests/spectest.rs b/lib/spectests/tests/spectest.rs index 514403d70..a0bab9ca1 100644 --- a/lib/spectests/tests/spectest.rs +++ b/lib/spectests/tests/spectest.rs @@ -256,6 +256,16 @@ mod tests { Memory, Table, }; + fn format_panic(e: &dyn std::any::Any) -> String { + if let Some(s) = e.downcast_ref::<&str>() { + format!("{}", s) + } else if let Some(s) = e.downcast_ref::() { + format!("{}", s) + } else { + "(unknown)".into() + } + } + fn parse_and_run( path: &PathBuf, file_excludes: &HashSet, @@ -342,7 +352,7 @@ mod tests { file: filename.to_string(), line: line, kind: format!("{}", "Module"), - message: format!("caught panic {:?}", e), + message: format!("caught panic {:?}", format_panic(&e)), }, &test_key, excludes, @@ -798,7 +808,7 @@ mod tests { file: filename.to_string(), line: line, kind: format!("{}", "AssertInvalid"), - message: format!("caught panic {:?}", p), + message: format!("caught panic {:?}", format_panic(&p)), }, &test_key, excludes, @@ -851,7 +861,7 @@ mod tests { file: filename.to_string(), line: line, kind: format!("{}", "AssertMalformed"), - message: format!("caught panic {:?}", p), + message: format!("caught panic {:?}", format_panic(&p)), }, &test_key, excludes, @@ -975,7 +985,7 @@ mod tests { file: filename.to_string(), line: line, kind: format!("{}", "AssertUnlinkable"), - message: format!("caught panic {:?}", e), + message: format!("caught panic {:?}", format_panic(&e)), }, &test_key, excludes, From 65962f01860668688635cd9f82f94ea2aa7e5e80 Mon Sep 17 00:00:00 2001 From: losfair Date: Tue, 10 Mar 2020 02:46:13 +0800 Subject: [PATCH 08/27] Add a translation layer before import call in singlepass. --- lib/clif-backend/src/code.rs | 2 +- lib/llvm-backend/src/code.rs | 2 +- lib/runtime-core/src/codegen.rs | 2 +- lib/runtime-core/src/parse.rs | 65 +++++++++------- lib/singlepass-backend/src/codegen_x64.rs | 93 ++++++++++++++++++++++- 5 files changed, 129 insertions(+), 35 deletions(-) diff --git a/lib/clif-backend/src/code.rs b/lib/clif-backend/src/code.rs index 67506f931..ada71d0a3 100644 --- a/lib/clif-backend/src/code.rs +++ b/lib/clif-backend/src/code.rs @@ -209,7 +209,7 @@ impl ModuleCodeGenerator Ok(()) } - fn feed_import_function(&mut self) -> Result<(), CodegenError> { + fn feed_import_function(&mut self, _sigindex: SigIndex) -> Result<(), CodegenError> { Ok(()) } diff --git a/lib/llvm-backend/src/code.rs b/lib/llvm-backend/src/code.rs index 954e0c405..cebde5dae 100644 --- a/lib/llvm-backend/src/code.rs +++ b/lib/llvm-backend/src/code.rs @@ -8984,7 +8984,7 @@ impl<'ctx> ModuleCodeGenerator, LLVMBackend, Cod Ok(()) } - fn feed_import_function(&mut self) -> Result<(), CodegenError> { + fn feed_import_function(&mut self, _sigindex: SigIndex) -> Result<(), CodegenError> { self.func_import_count += 1; Ok(()) } diff --git a/lib/runtime-core/src/codegen.rs b/lib/runtime-core/src/codegen.rs index b65234cf4..d3ae27583 100644 --- a/lib/runtime-core/src/codegen.rs +++ b/lib/runtime-core/src/codegen.rs @@ -143,7 +143,7 @@ pub trait ModuleCodeGenerator, RM: RunnableModule, Ok(()) } /// Adds an import function. - fn feed_import_function(&mut self) -> Result<(), E>; + fn feed_import_function(&mut self, _sigindex: SigIndex) -> Result<(), E>; /// Sets the signatures. fn feed_signatures(&mut self, signatures: Map) -> Result<(), E>; /// Sets function signatures. diff --git a/lib/runtime-core/src/parse.rs b/lib/runtime-core/src/parse.rs index d2b88f07a..e65dfae8d 100644 --- a/lib/runtime-core/src/parse.rs +++ b/lib/runtime-core/src/parse.rs @@ -110,11 +110,46 @@ pub fn read_module< let mut namespace_builder = Some(StringTableBuilder::new()); let mut name_builder = Some(StringTableBuilder::new()); let mut func_count: usize = 0; + let mut mcg_signatures_fed = false; let mut mcg_info_fed = false; loop { use wasmparser::ParserState; let state = parser.read(); + + // Feed signature and namespace information as early as possible. + match *state { + ParserState::BeginFunctionBody { .. } + | ParserState::ImportSectionEntry { .. } + | ParserState::EndWasm => { + if !mcg_signatures_fed { + mcg_signatures_fed = true; + let info_read = info.read().unwrap(); + mcg.feed_signatures(info_read.signatures.clone()) + .map_err(|x| LoadError::Codegen(format!("{:?}", x)))?; + } + } + _ => {} + } + match *state { + ParserState::BeginFunctionBody { .. } | ParserState::EndWasm => { + if !mcg_info_fed { + mcg_info_fed = true; + { + let mut info_write = info.write().unwrap(); + info_write.namespace_table = namespace_builder.take().unwrap().finish(); + info_write.name_table = name_builder.take().unwrap().finish(); + } + let info_read = info.read().unwrap(); + mcg.feed_function_signatures(info_read.func_assoc.clone()) + .map_err(|x| LoadError::Codegen(format!("{:?}", x)))?; + mcg.check_precondition(&info_read) + .map_err(|x| LoadError::Codegen(format!("{:?}", x)))?; + } + } + _ => {} + } + match *state { ParserState::Error(ref err) => return Err(err.clone().into()), ParserState::TypeSectionEntry(ref ty) => { @@ -136,7 +171,7 @@ pub fn read_module< let sigindex = SigIndex::new(sigindex as usize); info.write().unwrap().imported_functions.push(import_name); info.write().unwrap().func_assoc.push(sigindex); - mcg.feed_import_function() + mcg.feed_import_function(sigindex) .map_err(|x| LoadError::Codegen(format!("{:?}", x)))?; } ImportSectionEntryType::Table(table_ty) => { @@ -218,22 +253,6 @@ pub fn read_module< } ParserState::BeginFunctionBody { range } => { let id = func_count; - if !mcg_info_fed { - mcg_info_fed = true; - { - let mut info_write = info.write().unwrap(); - info_write.namespace_table = namespace_builder.take().unwrap().finish(); - info_write.name_table = name_builder.take().unwrap().finish(); - } - let info_read = info.read().unwrap(); - mcg.feed_signatures(info_read.signatures.clone()) - .map_err(|x| LoadError::Codegen(format!("{:?}", x)))?; - mcg.feed_function_signatures(info_read.func_assoc.clone()) - .map_err(|x| LoadError::Codegen(format!("{:?}", x)))?; - mcg.check_precondition(&info_read) - .map_err(|x| LoadError::Codegen(format!("{:?}", x)))?; - } - let fcg = mcg .next_function( Arc::clone(&info), @@ -432,18 +451,6 @@ pub fn read_module< info.write().unwrap().globals.push(global_init); } ParserState::EndWasm => { - // TODO Consolidate with BeginFunction body if possible - if !mcg_info_fed { - info.write().unwrap().namespace_table = - namespace_builder.take().unwrap().finish(); - info.write().unwrap().name_table = name_builder.take().unwrap().finish(); - mcg.feed_signatures(info.read().unwrap().signatures.clone()) - .map_err(|x| LoadError::Codegen(format!("{:?}", x)))?; - mcg.feed_function_signatures(info.read().unwrap().func_assoc.clone()) - .map_err(|x| LoadError::Codegen(format!("{:?}", x)))?; - mcg.check_precondition(&info.read().unwrap()) - .map_err(|x| LoadError::Codegen(format!("{:?}", x)))?; - } break; } _ => {} diff --git a/lib/singlepass-backend/src/codegen_x64.rs b/lib/singlepass-backend/src/codegen_x64.rs index 78bc0af9a..32290341f 100644 --- a/lib/singlepass-backend/src/codegen_x64.rs +++ b/lib/singlepass-backend/src/codegen_x64.rs @@ -32,8 +32,9 @@ use wasmer_runtime_core::{ memory::MemoryType, module::{ModuleInfo, ModuleInner}, state::{ - x64::new_machine_state, x64::X64Register, FunctionStateMap, MachineState, MachineValue, - ModuleStateMap, OffsetInfo, SuspendOffset, WasmAbstractValue, + x64::new_machine_state, x64::X64Register, x64_decl::ArgumentRegisterAllocator, + FunctionStateMap, MachineState, MachineValue, ModuleStateMap, OffsetInfo, SuspendOffset, + WasmAbstractValue, }, structures::{Map, TypedIndex}, typed_func::{Trampoline, Wasm}, @@ -869,7 +870,7 @@ impl ModuleCodeGenerator Ok(()) } - fn feed_import_function(&mut self) -> Result<(), CodegenError> { + fn feed_import_function(&mut self, sigindex: SigIndex) -> Result<(), CodegenError> { let labels = self.function_labels.as_mut().unwrap(); let id = labels.len(); @@ -880,6 +881,92 @@ impl ModuleCodeGenerator a.emit_label(label); labels.insert(id, (label, Some(offset))); + // Singlepass internally treats all arguments as integers, but the standard System V calling convention requires + // floating point arguments to be passed in XMM registers. + // + // FIXME: This is only a workaround. We should fix singlepass to use the standard CC. + let sig = self + .signatures + .as_ref() + .expect("signatures itself") + .get(sigindex) + .expect("signatures"); + // Translation is expensive, so only do it if needed. + if sig + .params() + .iter() + .find(|&&x| x == Type::F32 || x == Type::F64) + .is_some() + { + let mut param_locations: Vec = vec![]; + + // Allocate stack space for arguments. + let stack_offset: i32 = if sig.params().len() > 5 { + 5 * 8 + } else { + (sig.params().len() as i32) * 8 + }; + if stack_offset > 0 { + a.emit_sub( + Size::S64, + Location::Imm32(stack_offset as u32), + Location::GPR(GPR::RSP), + ); + } + + // Store all arguments to the stack to prevent overwrite. + for i in 0..sig.params().len() { + let loc = match i { + 0..=4 => { + static PARAM_REGS: &'static [GPR] = + &[GPR::RSI, GPR::RDX, GPR::RCX, GPR::R8, GPR::R9]; + let loc = Location::Memory(GPR::RSP, (i * 8) as i32); + a.emit_mov(Size::S64, Location::GPR(PARAM_REGS[i]), loc); + loc + } + _ => Location::Memory(GPR::RSP, stack_offset + 8 + ((i - 5) * 8) as i32), + }; + param_locations.push(loc); + } + + // Copy arguments. + let mut argalloc = ArgumentRegisterAllocator::default(); + argalloc.next(Type::I32).unwrap(); // skip vm::Ctx + let mut caller_stack_offset: i32 = 0; + for (i, ty) in sig.params().iter().enumerate() { + let prev_loc = param_locations[i]; + let target = match argalloc.next(*ty) { + Some(X64Register::GPR(gpr)) => Location::GPR(gpr), + Some(X64Register::XMM(xmm)) => Location::XMM(xmm), + None => { + // No register can be allocated. Put this argument on the stack. + // + // Since here we never use fewer registers than by the original call, on the caller's frame + // we always have enough space to store the rearranged arguments, and the copy "backward" between different + // slots in the caller argument region will always work. + a.emit_mov(Size::S64, prev_loc, Location::GPR(GPR::RAX)); + a.emit_mov( + Size::S64, + Location::GPR(GPR::RAX), + Location::Memory(GPR::RSP, stack_offset + 8 + caller_stack_offset), + ); + caller_stack_offset += 8; + continue; + } + }; + a.emit_mov(Size::S64, prev_loc, target); + } + + // Restore stack pointer. + if stack_offset > 0 { + a.emit_add( + Size::S64, + Location::Imm32(stack_offset as u32), + Location::GPR(GPR::RSP), + ); + } + } + // Emits a tail call trampoline that loads the address of the target import function // from Ctx and jumps to it. From 7e2ede3960ee54c86db57bb587f3f071796a682c Mon Sep 17 00:00:00 2001 From: losfair Date: Tue, 10 Mar 2020 03:16:22 +0800 Subject: [PATCH 09/27] Fix floating point return values. --- lib/runtime-core/src/typed_func.rs | 62 ++++++++++++++++++----- lib/singlepass-backend/src/codegen_x64.rs | 46 +++++++++++++++-- 2 files changed, 92 insertions(+), 16 deletions(-) diff --git a/lib/runtime-core/src/typed_func.rs b/lib/runtime-core/src/typed_func.rs index 4dc192b0b..e49202e3a 100644 --- a/lib/runtime-core/src/typed_func.rs +++ b/lib/runtime-core/src/typed_func.rs @@ -306,16 +306,15 @@ impl<'a> DynamicFunc<'a> { { use crate::trampoline_x64::{CallContext, TrampolineBufferBuilder}; use crate::types::Value; - use std::convert::TryFrom; struct PolymorphicContext { arg_types: Vec, func: Box Vec>, } - unsafe extern "C" fn enter_host_polymorphic( + unsafe fn do_enter_host_polymorphic( ctx: *const CallContext, args: *const u64, - ) -> u64 { + ) -> Vec { let ctx = &*(ctx as *const PolymorphicContext); let vmctx = &mut *(*args.offset(0) as *mut vm::Ctx); let args: Vec = ctx @@ -335,13 +334,40 @@ impl<'a> DynamicFunc<'a> { } }) .collect(); - let rets = (ctx.func)(vmctx, &args); + (ctx.func)(vmctx, &args) + } + unsafe extern "C" fn enter_host_polymorphic_i( + ctx: *const CallContext, + args: *const u64, + ) -> u64 { + let rets = do_enter_host_polymorphic(ctx, args); if rets.len() == 0 { 0 } else if rets.len() == 1 { - u64::try_from(rets[0].to_u128()).expect( - "128-bit return value from polymorphic host functions is not yet supported", - ) + match rets[0] { + Value::I32(x) => x as u64, + Value::I64(x) => x as u64, + _ => panic!("enter_host_polymorphic_i: invalid return type"), + } + } else { + panic!( + "multiple return values from polymorphic host functions is not yet supported" + ); + } + } + unsafe extern "C" fn enter_host_polymorphic_f( + ctx: *const CallContext, + args: *const u64, + ) -> f64 { + let rets = do_enter_host_polymorphic(ctx, args); + if rets.len() == 0 { + 0.0 + } else if rets.len() == 1 { + match rets[0] { + Value::F32(x) => f64::from_bits(x.to_bits() as u64), + Value::F64(x) => x, + _ => panic!("enter_host_polymorphic_f: invalid return type"), + } } else { panic!( "multiple return values from polymorphic host functions is not yet supported" @@ -364,11 +390,23 @@ impl<'a> DynamicFunc<'a> { let mut native_param_types = vec![Type::I32]; // vm::Ctx is the first parameter. native_param_types.extend_from_slice(signature.params()); - builder.add_callinfo_trampoline( - enter_host_polymorphic, - ctx as *const _, - &native_param_types, - ); + match signature.returns() { + [x] if *x == Type::F32 || *x == Type::F64 => { + builder.add_callinfo_trampoline( + unsafe { std::mem::transmute(enter_host_polymorphic_f as usize) }, + ctx as *const _, + &native_param_types, + ); + } + _ => { + builder.add_callinfo_trampoline( + enter_host_polymorphic_i, + ctx as *const _, + &native_param_types, + ); + } + } + let ptr = builder .insert_global() .expect("cannot bump-allocate global trampoline memory"); diff --git a/lib/singlepass-backend/src/codegen_x64.rs b/lib/singlepass-backend/src/codegen_x64.rs index 32290341f..5903508fc 100644 --- a/lib/singlepass-backend/src/codegen_x64.rs +++ b/lib/singlepass-backend/src/codegen_x64.rs @@ -205,6 +205,7 @@ pub struct X64FunctionCode { signatures: Arc>, function_signatures: Arc>, + signature: FuncSig, fsm: FunctionStateMap, offset: usize, @@ -713,11 +714,22 @@ impl ModuleCodeGenerator machine.track_state = self.config.as_ref().unwrap().track_state; assembler.emit_label(begin_label); + + let signatures = self.signatures.as_ref().unwrap(); + let function_signatures = self.function_signatures.as_ref().unwrap(); + let sig_index = function_signatures + .get(FuncIndex::new( + self.functions.len() + self.func_import_count, + )) + .unwrap() + .clone(); + let sig = signatures.get(sig_index).unwrap().clone(); let code = X64FunctionCode { local_function_id: self.functions.len(), - signatures: self.signatures.as_ref().unwrap().clone(), - function_signatures: self.function_signatures.as_ref().unwrap().clone(), + signatures: signatures.clone(), + function_signatures: function_signatures.clone(), + signature: sig, fsm: FunctionStateMap::new(new_machine_state(), self.functions.len(), 32, vec![]), // only a placeholder; this is initialized later in `begin_body` offset: begin_offset.0, @@ -6347,7 +6359,14 @@ impl FunctionCodeGenerator for X64FunctionCode { false, )[0]; self.value_stack.push(ret); - a.emit_mov(Size::S64, Location::GPR(GPR::RAX), ret); + match return_types[0] { + WpType::F32 | WpType::F64 => { + a.emit_mov(Size::S64, Location::XMM(XMM::XMM0), ret); + } + _ => { + a.emit_mov(Size::S64, Location::GPR(GPR::RAX), ret); + } + } } } Operator::CallIndirect { index, table_index } => { @@ -6486,7 +6505,14 @@ impl FunctionCodeGenerator for X64FunctionCode { false, )[0]; self.value_stack.push(ret); - a.emit_mov(Size::S64, Location::GPR(GPR::RAX), ret); + match return_types[0] { + WpType::F32 | WpType::F64 => { + a.emit_mov(Size::S64, Location::XMM(XMM::XMM0), ret); + } + _ => { + a.emit_mov(Size::S64, Location::GPR(GPR::RAX), ret); + } + } } } Operator::If { ty } => { @@ -7701,6 +7727,18 @@ impl FunctionCodeGenerator for X64FunctionCode { self.machine.finalize_locals(a, &self.locals); a.emit_mov(Size::S64, Location::GPR(GPR::RBP), Location::GPR(GPR::RSP)); a.emit_pop(Size::S64, Location::GPR(GPR::RBP)); + + // Make a copy of the return value in XMM0, as required by the SysV CC. + match self.signature.returns() { + [x] if *x == Type::F32 || *x == Type::F64 => { + a.emit_mov( + Size::S64, + Location::GPR(GPR::RAX), + Location::XMM(XMM::XMM0), + ); + } + _ => {} + } a.emit_ret(); } else { let released = &self.value_stack[frame.value_stack_depth..]; From 7d2d89b606ceb0241607532621f9ace9d443c998 Mon Sep 17 00:00:00 2001 From: losfair Date: Tue, 10 Mar 2020 12:28:54 +0800 Subject: [PATCH 10/27] Resolve review comments. --- lib/runtime-core-tests/tests/imports.rs | 4 ---- lib/runtime-core/src/trampoline_x64.rs | 11 ++++++++--- lib/runtime-core/src/typed_func.rs | 4 +++- lib/spectests/tests/spectest.rs | 8 ++++---- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/lib/runtime-core-tests/tests/imports.rs b/lib/runtime-core-tests/tests/imports.rs index bb0339459..e44d5159f 100644 --- a/lib/runtime-core-tests/tests/imports.rs +++ b/lib/runtime-core-tests/tests/imports.rs @@ -236,10 +236,6 @@ fn imported_functions_forms(test: &dyn Fn(&Instance)) { let j: i64 = (&inputs[1]).try_into().unwrap(); let k: f32 = (&inputs[2]).try_into().unwrap(); - dbg!(i); - dbg!(j); - dbg!(k); - vec![Value::F32(shift_ as f32 + i as f32 + j as f32 + k)] } ), diff --git a/lib/runtime-core/src/trampoline_x64.rs b/lib/runtime-core/src/trampoline_x64.rs index 24fc4f385..e85d2d910 100644 --- a/lib/runtime-core/src/trampoline_x64.rs +++ b/lib/runtime-core/src/trampoline_x64.rs @@ -249,6 +249,7 @@ impl TrampolineBufferBuilder { target: unsafe extern "C" fn(*const CallContext, *const u64) -> u64, context: *const CallContext, params: &[Type], + _returns: &[Type], ) -> usize { let idx = self.offsets.len(); self.offsets.push(self.code.len()); @@ -402,11 +403,12 @@ mod tests { } let mut builder = TrampolineBufferBuilder::new(); let ctx = TestContext { value: 100 }; - let param_types: Vec = (0..8).map(|_| Type::I32).collect(); + let param_types: Vec = vec![Type::I32; 8]; let idx = builder.add_callinfo_trampoline( do_add, &ctx as *const TestContext as *const _, ¶m_types, + &[Type::I32], ); let buf = builder.build(); let t = buf.get_trampoline(idx); @@ -421,6 +423,7 @@ mod tests { #[test] fn test_trampolines_with_floating_point() { unsafe extern "C" fn inner(n: *const CallContext, args: *const u64) -> u64 { + // `n` is not really a pointer. It is the length of the argument list, casted into the pointer type. let n = n as usize; let mut result: u64 = 0; for i in 0..n { @@ -443,6 +446,7 @@ mod tests { Type::I32, Type::I32, ], + &[Type::I32], ); let ptr = buffer.insert(builder.code()).unwrap(); let ret = unsafe { @@ -458,6 +462,7 @@ mod tests { #[test] fn test_many_global_trampolines() { unsafe extern "C" fn inner(n: *const CallContext, args: *const u64) -> u64 { + // `n` is not really a pointer. It is the length of the argument list, casted into the pointer type. let n = n as usize; let mut result: u64 = 0; for i in 0..n { @@ -475,8 +480,8 @@ mod tests { for i in 0..5000usize { let mut builder = TrampolineBufferBuilder::new(); let n = i % 8; - let param_types: Vec<_> = (0..n).map(|_| Type::I32).collect(); - builder.add_callinfo_trampoline(inner, n as _, ¶m_types); + let param_types: Vec<_> = (0..n).map(|_| Type::I64).collect(); + builder.add_callinfo_trampoline(inner, n as _, ¶m_types, &[Type::I64]); let ptr = buffer .insert(builder.code()) .expect("cannot insert new code into global buffer"); diff --git a/lib/runtime-core/src/typed_func.rs b/lib/runtime-core/src/typed_func.rs index e49202e3a..3280e9e89 100644 --- a/lib/runtime-core/src/typed_func.rs +++ b/lib/runtime-core/src/typed_func.rs @@ -387,7 +387,7 @@ impl<'a> DynamicFunc<'a> { }); let ctx = Box::into_raw(ctx); - let mut native_param_types = vec![Type::I32]; // vm::Ctx is the first parameter. + let mut native_param_types = vec![Type::I64]; // vm::Ctx is the first parameter. native_param_types.extend_from_slice(signature.params()); match signature.returns() { @@ -396,6 +396,7 @@ impl<'a> DynamicFunc<'a> { unsafe { std::mem::transmute(enter_host_polymorphic_f as usize) }, ctx as *const _, &native_param_types, + signature.returns(), ); } _ => { @@ -403,6 +404,7 @@ impl<'a> DynamicFunc<'a> { enter_host_polymorphic_i, ctx as *const _, &native_param_types, + signature.returns(), ); } } diff --git a/lib/spectests/tests/spectest.rs b/lib/spectests/tests/spectest.rs index a0bab9ca1..409a9d908 100644 --- a/lib/spectests/tests/spectest.rs +++ b/lib/spectests/tests/spectest.rs @@ -352,7 +352,7 @@ mod tests { file: filename.to_string(), line: line, kind: format!("{}", "Module"), - message: format!("caught panic {:?}", format_panic(&e)), + message: format!("caught panic {}", format_panic(&e)), }, &test_key, excludes, @@ -808,7 +808,7 @@ mod tests { file: filename.to_string(), line: line, kind: format!("{}", "AssertInvalid"), - message: format!("caught panic {:?}", format_panic(&p)), + message: format!("caught panic {}", format_panic(&p)), }, &test_key, excludes, @@ -861,7 +861,7 @@ mod tests { file: filename.to_string(), line: line, kind: format!("{}", "AssertMalformed"), - message: format!("caught panic {:?}", format_panic(&p)), + message: format!("caught panic {}", format_panic(&p)), }, &test_key, excludes, @@ -985,7 +985,7 @@ mod tests { file: filename.to_string(), line: line, kind: format!("{}", "AssertUnlinkable"), - message: format!("caught panic {:?}", format_panic(&e)), + message: format!("caught panic {}", format_panic(&e)), }, &test_key, excludes, From 3e63f1aaa9eb69e4f3f78ff29a164c59a7ef18c9 Mon Sep 17 00:00:00 2001 From: losfair Date: Tue, 10 Mar 2020 12:37:40 +0800 Subject: [PATCH 11/27] Deprecate wasmer_trampoline_buffer_builder_add_callinfo_trampoline. --- lib/runtime-c-api/src/trampoline.rs | 10 +++++++++- lib/runtime-c-api/wasmer.h | 2 ++ lib/runtime-c-api/wasmer.hh | 2 ++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/runtime-c-api/src/trampoline.rs b/lib/runtime-c-api/src/trampoline.rs index ed7b8971b..9555927ea 100644 --- a/lib/runtime-c-api/src/trampoline.rs +++ b/lib/runtime-c-api/src/trampoline.rs @@ -34,6 +34,8 @@ pub unsafe extern "C" fn wasmer_trampoline_buffer_builder_add_context_trampoline } /// Adds a callinfo trampoline to the builder. +/// +/// Deprecated. In a future version `DynamicFunc::new` will be exposed to the C API and should be used instead of this function. #[no_mangle] #[allow(clippy::cast_ptr_alignment)] pub unsafe extern "C" fn wasmer_trampoline_buffer_builder_add_callinfo_trampoline( @@ -42,8 +44,14 @@ pub unsafe extern "C" fn wasmer_trampoline_buffer_builder_add_callinfo_trampolin ctx: *const c_void, num_params: u32, ) -> usize { + use wasmer_runtime_core::types::Type; let builder = &mut *(builder as *mut TrampolineBufferBuilder); - builder.add_callinfo_trampoline(mem::transmute(func), ctx as *const CallContext, num_params) + builder.add_callinfo_trampoline( + mem::transmute(func), + ctx as *const CallContext, + &vec![Type::I64; num_params as usize], + &[Type::I64], + ) } /// Finalizes the trampoline builder into an executable buffer. diff --git a/lib/runtime-c-api/wasmer.h b/lib/runtime-c-api/wasmer.h index 94b2fbb34..7a872f65c 100644 --- a/lib/runtime-c-api/wasmer.h +++ b/lib/runtime-c-api/wasmer.h @@ -1386,6 +1386,8 @@ wasmer_result_t wasmer_table_new(wasmer_table_t **table, wasmer_limits_t limits) #if (!defined(_WIN32) && defined(ARCH_X86_64)) /** * Adds a callinfo trampoline to the builder. + * + * Deprecated. In a future version `DynamicFunc::new` will be exposed to the C API and should be used instead of this function. */ uintptr_t wasmer_trampoline_buffer_builder_add_callinfo_trampoline(wasmer_trampoline_buffer_builder_t *builder, const wasmer_trampoline_callable_t *func, diff --git a/lib/runtime-c-api/wasmer.hh b/lib/runtime-c-api/wasmer.hh index 047f8bebb..6bd66d40b 100644 --- a/lib/runtime-c-api/wasmer.hh +++ b/lib/runtime-c-api/wasmer.hh @@ -1146,6 +1146,8 @@ wasmer_result_t wasmer_table_new(wasmer_table_t **table, wasmer_limits_t limits) #if (!defined(_WIN32) && defined(ARCH_X86_64)) /// Adds a callinfo trampoline to the builder. +/// +/// Deprecated. In a future version `DynamicFunc::new` will be exposed to the C API and should be used instead of this function. uintptr_t wasmer_trampoline_buffer_builder_add_callinfo_trampoline(wasmer_trampoline_buffer_builder_t *builder, const wasmer_trampoline_callable_t *func, const void *ctx, From cfbcd886d02b7f6822312979d1a3854c919abc48 Mon Sep 17 00:00:00 2001 From: Heyang Zhou Date: Tue, 10 Mar 2020 12:38:39 +0800 Subject: [PATCH 12/27] Fix typo (1) Co-Authored-By: nlewycky --- lib/runtime-core/src/state.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/runtime-core/src/state.rs b/lib/runtime-core/src/state.rs index fb19476b1..b153e13e1 100644 --- a/lib/runtime-core/src/state.rs +++ b/lib/runtime-core/src/state.rs @@ -614,7 +614,7 @@ pub mod x64_decl { /// Returns the instruction prefix for `movq %this_reg, ?(%rsp)`. /// - /// To build a instruction, append the memory location as a 32-bit + /// To build an instruction, append the memory location as a 32-bit /// offset to the stack pointer to this prefix. pub fn prefix_mov_to_stack(&self) -> Option<&'static [u8]> { Some(match *self { From e521dfe8c15e0369aa3890a820af351fd9ca0ac7 Mon Sep 17 00:00:00 2001 From: Heyang Zhou Date: Tue, 10 Mar 2020 12:38:55 +0800 Subject: [PATCH 13/27] Fix typo (2) Co-Authored-By: nlewycky --- lib/runtime-core/src/state.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/runtime-core/src/state.rs b/lib/runtime-core/src/state.rs index b153e13e1..55809e965 100644 --- a/lib/runtime-core/src/state.rs +++ b/lib/runtime-core/src/state.rs @@ -650,7 +650,7 @@ pub mod x64_decl { } impl ArgumentRegisterAllocator { - /// Allocates a register for argument type `ty`. Returns `None` if no register is available for this type.. + /// Allocates a register for argument type `ty`. Returns `None` if no register is available for this type. pub fn next(&mut self, ty: Type) -> Option { static GPR_SEQ: &'static [GPR] = &[GPR::RDI, GPR::RSI, GPR::RDX, GPR::RCX, GPR::R8, GPR::R9]; From a1cdeede40fbc8879a99682c5f5f8a4f577fe6aa Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Tue, 10 Mar 2020 10:52:53 -0700 Subject: [PATCH 14/27] Update CHANGELOG.md --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 87e9c8b18..780754629 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## **[Unreleased]** +- [#1286](https://github.com/wasmerio/wasmer/pull/1286) Updated Windows Wasmer icons. Add wax + ## 0.15.0 - 2020-03-04 - [#1263](https://github.com/wasmerio/wasmer/pull/1263) Changed the behavior of some WASI syscalls to now handle preopened directories more properly. Changed default `--debug` logging to only show Wasmer-related messages. From f2c5f88b21b26618bb94ef94c90a9dde3623f733 Mon Sep 17 00:00:00 2001 From: Syrus Date: Tue, 10 Mar 2020 18:23:59 -0700 Subject: [PATCH 15/27] Added wax symlink --- Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index c8f755538..01cc7e05d 100644 --- a/Makefile +++ b/Makefile @@ -287,6 +287,8 @@ build-install-package: mkdir -p ./install/bin cp ./wapm-cli/target/release/wapm ./install/bin/ cp ./target/release/wasmer ./install/bin/ + # Create the wax binary as symlink to wapm + cd ./install/bin/ && ln -s wapm wax tar -C ./install -zcvf wasmer.tar.gz bin/wapm bin/wasmer UNAME_S := $(shell uname -s) @@ -315,7 +317,7 @@ endif cp lib/runtime-c-api/doc/index.md ./capi/README.md tar -C ./capi -zcvf wasmer-c-api.tar.gz lib include README.md LICENSE -WAPM_VERSION = 0.4.3 +WAPM_VERSION = 0.5.0 build-wapm: git clone --branch $(WAPM_VERSION) https://github.com/wasmerio/wapm-cli.git cargo build --release --manifest-path wapm-cli/Cargo.toml --features "telemetry update-notifications" From a4a90dfcd83902a8898f6698df978b6b5a471b25 Mon Sep 17 00:00:00 2001 From: Syrus Date: Tue, 10 Mar 2020 21:38:17 -0700 Subject: [PATCH 16/27] Fixed WAPM version --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 01cc7e05d..601421c91 100644 --- a/Makefile +++ b/Makefile @@ -317,7 +317,7 @@ endif cp lib/runtime-c-api/doc/index.md ./capi/README.md tar -C ./capi -zcvf wasmer-c-api.tar.gz lib include README.md LICENSE -WAPM_VERSION = 0.5.0 +WAPM_VERSION = v0.5.0 build-wapm: git clone --branch $(WAPM_VERSION) https://github.com/wasmerio/wapm-cli.git cargo build --release --manifest-path wapm-cli/Cargo.toml --features "telemetry update-notifications" From d7d5f5b8945a0871dc2862b6065e5f446527e3e2 Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Wed, 11 Mar 2020 11:15:07 -0700 Subject: [PATCH 17/27] Prepare for 0.16.0 release --- CHANGELOG.md | 2 ++ Cargo.lock | 38 ++++++++++----------- Cargo.toml | 2 +- lib/clif-backend/Cargo.toml | 6 ++-- lib/dev-utils/Cargo.toml | 2 +- lib/emscripten-tests/Cargo.toml | 14 ++++---- lib/emscripten/Cargo.toml | 4 +-- lib/interface-types/Cargo.toml | 2 +- lib/llvm-backend-tests/Cargo.toml | 6 ++-- lib/llvm-backend/Cargo.toml | 4 +-- lib/middleware-common-tests/Cargo.toml | 12 +++---- lib/middleware-common/Cargo.toml | 4 +-- lib/runtime-c-api/Cargo.toml | 10 +++--- lib/runtime-core-tests/Cargo.toml | 10 +++--- lib/runtime-core/Cargo.toml | 2 +- lib/runtime/Cargo.toml | 8 ++--- lib/singlepass-backend/Cargo.toml | 4 +-- lib/spectests/Cargo.toml | 10 +++--- lib/wasi-experimental-io-devices/Cargo.toml | 6 ++-- lib/wasi-tests/Cargo.toml | 14 ++++---- lib/wasi/Cargo.toml | 4 +-- lib/win-exception-handler/Cargo.toml | 4 +-- scripts/update_version_numbers.sh | 4 +-- src/installer/wasmer.iss | 2 +- 24 files changed, 88 insertions(+), 86 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4983253d7..c1d93420b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## **[Unreleased]** +## 0.16.0 - 2020-03-11 + - [#1286](https://github.com/wasmerio/wasmer/pull/1286) Updated Windows Wasmer icons. Add wax - [#1284](https://github.com/wasmerio/wasmer/pull/1284) Implement string and memory instructions in `wasmer-interface-types` - [#1272](https://github.com/wasmerio/wasmer/pull/1272) Fix off-by-one error bug when accessing memory with a `WasmPtr` that contains the last valid byte of memory. Also changes the behavior of `WasmPtr` with a length of 0 and `WasmPtr` where `std::mem::size_of::()` is 0 to always return `None` diff --git a/Cargo.lock b/Cargo.lock index ee781d901..57aba6cea 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1820,7 +1820,7 @@ dependencies = [ [[package]] name = "wasmer" -version = "0.15.0" +version = "0.16.0" dependencies = [ "atty", "byteorder", @@ -1851,7 +1851,7 @@ dependencies = [ [[package]] name = "wasmer-clif-backend" -version = "0.15.0" +version = "0.16.0" dependencies = [ "byteorder", "cranelift-codegen", @@ -1902,14 +1902,14 @@ dependencies = [ [[package]] name = "wasmer-dev-utils" -version = "0.15.0" +version = "0.16.0" dependencies = [ "libc", ] [[package]] name = "wasmer-emscripten" -version = "0.15.0" +version = "0.16.0" dependencies = [ "byteorder", "getrandom", @@ -1922,7 +1922,7 @@ dependencies = [ [[package]] name = "wasmer-emscripten-tests" -version = "0.15.0" +version = "0.16.0" dependencies = [ "glob 0.3.0", "wabt", @@ -1936,7 +1936,7 @@ dependencies = [ [[package]] name = "wasmer-interface-types" -version = "0.15.0" +version = "0.16.0" dependencies = [ "nom", "wast", @@ -1952,7 +1952,7 @@ dependencies = [ [[package]] name = "wasmer-llvm-backend" -version = "0.15.0" +version = "0.16.0" dependencies = [ "byteorder", "cc", @@ -1983,14 +1983,14 @@ dependencies = [ [[package]] name = "wasmer-middleware-common" -version = "0.15.0" +version = "0.16.0" dependencies = [ "wasmer-runtime-core", ] [[package]] name = "wasmer-middleware-common-tests" -version = "0.15.0" +version = "0.16.0" dependencies = [ "criterion", "wabt", @@ -2003,7 +2003,7 @@ dependencies = [ [[package]] name = "wasmer-runtime" -version = "0.15.0" +version = "0.16.0" dependencies = [ "criterion", "lazy_static", @@ -2020,7 +2020,7 @@ dependencies = [ [[package]] name = "wasmer-runtime-c-api" -version = "0.15.0" +version = "0.16.0" dependencies = [ "cbindgen", "libc", @@ -2032,7 +2032,7 @@ dependencies = [ [[package]] name = "wasmer-runtime-core" -version = "0.15.0" +version = "0.16.0" dependencies = [ "bincode", "blake3", @@ -2060,7 +2060,7 @@ dependencies = [ [[package]] name = "wasmer-runtime-core-tests" -version = "0.15.0" +version = "0.16.0" dependencies = [ "wabt", "wasmer-clif-backend", @@ -2071,7 +2071,7 @@ dependencies = [ [[package]] name = "wasmer-singlepass-backend" -version = "0.15.0" +version = "0.16.0" dependencies = [ "bincode", "byteorder", @@ -2088,7 +2088,7 @@ dependencies = [ [[package]] name = "wasmer-spectests" -version = "0.15.0" +version = "0.16.0" dependencies = [ "glob 0.3.0", "wabt", @@ -2100,7 +2100,7 @@ dependencies = [ [[package]] name = "wasmer-wasi" -version = "0.15.0" +version = "0.16.0" dependencies = [ "bincode", "byteorder", @@ -2117,7 +2117,7 @@ dependencies = [ [[package]] name = "wasmer-wasi-experimental-io-devices" -version = "0.15.0" +version = "0.16.0" dependencies = [ "log", "minifb", @@ -2130,7 +2130,7 @@ dependencies = [ [[package]] name = "wasmer-wasi-tests" -version = "0.15.0" +version = "0.16.0" dependencies = [ "glob 0.3.0", "wasmer-clif-backend", @@ -2143,7 +2143,7 @@ dependencies = [ [[package]] name = "wasmer-win-exception-handler" -version = "0.15.0" +version = "0.16.0" dependencies = [ "cmake", "libc", diff --git a/Cargo.toml b/Cargo.toml index b3f532d57..9a360270f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer" -version = "0.15.0" +version = "0.16.0" authors = ["The Wasmer Engineering Team "] edition = "2018" repository = "https://github.com/wasmerio/wasmer" diff --git a/lib/clif-backend/Cargo.toml b/lib/clif-backend/Cargo.toml index 282f4e2d1..9a2fc85ec 100644 --- a/lib/clif-backend/Cargo.toml +++ b/lib/clif-backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-clif-backend" -version = "0.15.0" +version = "0.16.0" description = "Wasmer runtime Cranelift compiler backend" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -11,7 +11,7 @@ edition = "2018" readme = "README.md" [dependencies] -wasmer-runtime-core = { path = "../runtime-core", version = "0.15.0" } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.0" } cranelift-native = "0.59.0" cranelift-codegen = "0.59.0" cranelift-entity = "0.59.0" @@ -38,7 +38,7 @@ version = "0.0.7" [target.'cfg(windows)'.dependencies] winapi = { version = "0.3", features = ["errhandlingapi", "minwindef", "minwinbase", "winnt"] } -wasmer-win-exception-handler = { path = "../win-exception-handler", version = "0.15.0" } +wasmer-win-exception-handler = { path = "../win-exception-handler", version = "0.16.0" } [features] generate-debug-information = ["wasm-debug"] diff --git a/lib/dev-utils/Cargo.toml b/lib/dev-utils/Cargo.toml index 1c06313ba..404efd77a 100644 --- a/lib/dev-utils/Cargo.toml +++ b/lib/dev-utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-dev-utils" -version = "0.15.0" +version = "0.16.0" description = "Wasmer runtime core library" license = "MIT" authors = ["The Wasmer Engineering Team "] diff --git a/lib/emscripten-tests/Cargo.toml b/lib/emscripten-tests/Cargo.toml index 2e6e68a6f..4df41605d 100644 --- a/lib/emscripten-tests/Cargo.toml +++ b/lib/emscripten-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-emscripten-tests" -version = "0.15.0" +version = "0.16.0" description = "Tests for our Emscripten implementation" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -9,15 +9,15 @@ publish = false build = "build/mod.rs" [dependencies] -wasmer-emscripten = { path = "../emscripten", version = "0.15.0" } -wasmer-runtime = { path = "../runtime", version = "0.15.0", default-features = false } -wasmer-clif-backend = { path = "../clif-backend", version = "0.15.0", optional = true} -wasmer-llvm-backend = { path = "../llvm-backend", version = "0.15.0", optional = true, features = ["test"] } -wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.15.0", optional = true } +wasmer-emscripten = { path = "../emscripten", version = "0.16.0" } +wasmer-runtime = { path = "../runtime", version = "0.16.0", default-features = false } +wasmer-clif-backend = { path = "../clif-backend", version = "0.16.0", optional = true} +wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.0", optional = true, features = ["test"] } +wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.0", optional = true } [dev-dependencies] wabt = "0.9.1" -wasmer-dev-utils = { path = "../dev-utils", version = "0.15.0"} +wasmer-dev-utils = { path = "../dev-utils", version = "0.16.0"} [build-dependencies] glob = "0.3" diff --git a/lib/emscripten/Cargo.toml b/lib/emscripten/Cargo.toml index 25091e89b..cb946a491 100644 --- a/lib/emscripten/Cargo.toml +++ b/lib/emscripten/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-emscripten" -version = "0.15.0" +version = "0.16.0" description = "Wasmer runtime emscripten implementation library" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -15,7 +15,7 @@ lazy_static = "1.4" libc = "0.2.60" log = "0.4" time = "0.1" -wasmer-runtime-core = { path = "../runtime-core", version = "0.15.0" } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.0" } [target.'cfg(windows)'.dependencies] getrandom = "0.1" diff --git a/lib/interface-types/Cargo.toml b/lib/interface-types/Cargo.toml index 44758c1fe..6915304af 100644 --- a/lib/interface-types/Cargo.toml +++ b/lib/interface-types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-interface-types" -version = "0.15.0" +version = "0.16.0" description = "WebAssembly Interface Types library for Wasmer" license = "MIT" authors = ["The Wasmer Engineering Team "] diff --git a/lib/llvm-backend-tests/Cargo.toml b/lib/llvm-backend-tests/Cargo.toml index 4a5e7e80c..6bb843be5 100644 --- a/lib/llvm-backend-tests/Cargo.toml +++ b/lib/llvm-backend-tests/Cargo.toml @@ -9,8 +9,8 @@ edition = "2018" [dependencies] wabt = "0.9.1" -wasmer-runtime-core = { path = "../runtime-core", version = "0.15.0" } -wasmer-runtime = { path = "../runtime", version = "0.15.0" } -wasmer-llvm-backend = { path = "../llvm-backend", version = "0.15.0", features = ["test"] } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.0" } +wasmer-runtime = { path = "../runtime", version = "0.16.0" } +wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.0", features = ["test"] } [features] diff --git a/lib/llvm-backend/Cargo.toml b/lib/llvm-backend/Cargo.toml index cfe2834a8..fa3d05b22 100644 --- a/lib/llvm-backend/Cargo.toml +++ b/lib/llvm-backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-llvm-backend" -version = "0.15.0" +version = "0.16.0" license = "MIT" authors = ["The Wasmer Engineering Team "] repository = "https://github.com/wasmerio/wasmer" @@ -10,7 +10,7 @@ edition = "2018" readme = "README.md" [dependencies] -wasmer-runtime-core = { path = "../runtime-core", version = "0.15.0", features = ["generate-debug-information-no-export-symbols"] } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.0", features = ["generate-debug-information-no-export-symbols"] } wasmparser = "0.51.3" smallvec = "0.6" goblin = "0.0.24" diff --git a/lib/middleware-common-tests/Cargo.toml b/lib/middleware-common-tests/Cargo.toml index f83da0256..943da23a0 100644 --- a/lib/middleware-common-tests/Cargo.toml +++ b/lib/middleware-common-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-middleware-common-tests" -version = "0.15.0" +version = "0.16.0" authors = ["The Wasmer Engineering Team "] edition = "2018" repository = "https://github.com/wasmerio/wasmer" @@ -8,11 +8,11 @@ license = "MIT" publish = false [dependencies] -wasmer-runtime-core = { path = "../runtime-core", version = "0.15.0" } -wasmer-middleware-common = { path = "../middleware-common", version = "0.15.0" } -wasmer-clif-backend = { path = "../clif-backend", version = "0.15.0", optional = true } -wasmer-llvm-backend = { path = "../llvm-backend", version = "0.15.0", features = ["test"], optional = true } -wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.15.0", optional = true } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.0" } +wasmer-middleware-common = { path = "../middleware-common", version = "0.16.0" } +wasmer-clif-backend = { path = "../clif-backend", version = "0.16.0", optional = true } +wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.0", features = ["test"], optional = true } +wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.0", optional = true } [features] clif = ["wasmer-clif-backend"] diff --git a/lib/middleware-common/Cargo.toml b/lib/middleware-common/Cargo.toml index c44fba176..ea39f5958 100644 --- a/lib/middleware-common/Cargo.toml +++ b/lib/middleware-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-middleware-common" -version = "0.15.0" +version = "0.16.0" repository = "https://github.com/wasmerio/wasmer" description = "Wasmer runtime common middlewares" license = "MIT" @@ -10,4 +10,4 @@ categories = ["wasm"] edition = "2018" [dependencies] -wasmer-runtime-core = { path = "../runtime-core", version = "0.15.0" } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.0" } diff --git a/lib/runtime-c-api/Cargo.toml b/lib/runtime-c-api/Cargo.toml index 38c099375..fb933aa2f 100644 --- a/lib/runtime-c-api/Cargo.toml +++ b/lib/runtime-c-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-runtime-c-api" -version = "0.15.0" +version = "0.16.0" description = "Wasmer C API library" documentation = "https://wasmerio.github.io/wasmer/c/runtime-c-api/" license = "MIT" @@ -20,22 +20,22 @@ libc = "0.2.60" [dependencies.wasmer-runtime] default-features = false path = "../runtime" -version = "0.15.0" +version = "0.16.0" [dependencies.wasmer-runtime-core] default-features = false path = "../runtime-core" -version = "0.15.0" +version = "0.16.0" [dependencies.wasmer-wasi] default-features = false path = "../wasi" -version = "0.15.0" +version = "0.16.0" optional = true [dependencies.wasmer-emscripten] path = "../emscripten" -version = "0.15.0" +version = "0.16.0" optional = true [features] diff --git a/lib/runtime-core-tests/Cargo.toml b/lib/runtime-core-tests/Cargo.toml index a97b44b08..1e5b58f27 100644 --- a/lib/runtime-core-tests/Cargo.toml +++ b/lib/runtime-core-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-runtime-core-tests" -version = "0.15.0" +version = "0.16.0" description = "Tests for the Wasmer runtime core crate" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -9,10 +9,10 @@ publish = false [dependencies] wabt = "0.9.1" -wasmer-runtime-core = { path = "../runtime-core", version = "0.15.0" } -wasmer-clif-backend = { path = "../clif-backend", version = "0.15.0", optional = true } -wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.15.0", optional = true } -wasmer-llvm-backend = { path = "../llvm-backend", version = "0.15.0", features = ["test"], optional = true } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.0" } +wasmer-clif-backend = { path = "../clif-backend", version = "0.16.0", optional = true } +wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.0", optional = true } +wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.0", features = ["test"], optional = true } [features] default = ["backend-cranelift"] diff --git a/lib/runtime-core/Cargo.toml b/lib/runtime-core/Cargo.toml index b309a552d..03904ed7c 100644 --- a/lib/runtime-core/Cargo.toml +++ b/lib/runtime-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-runtime-core" -version = "0.15.0" +version = "0.16.0" description = "Wasmer runtime core library" license = "MIT" authors = ["The Wasmer Engineering Team "] diff --git a/lib/runtime/Cargo.toml b/lib/runtime/Cargo.toml index f836c9693..bc9b1fe3a 100644 --- a/lib/runtime/Cargo.toml +++ b/lib/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-runtime" -version = "0.15.0" +version = "0.16.0" description = "Wasmer runtime library" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -11,17 +11,17 @@ edition = "2018" readme = "README.md" [dependencies] -wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.15.0", optional = true } +wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.0", optional = true } lazy_static = "1.4" memmap = "0.7" [dependencies.wasmer-runtime-core] path = "../runtime-core" -version = "0.15.0" +version = "0.16.0" [dependencies.wasmer-clif-backend] path = "../clif-backend" -version = "0.15.0" +version = "0.16.0" optional = true # Dependencies for caching. diff --git a/lib/singlepass-backend/Cargo.toml b/lib/singlepass-backend/Cargo.toml index b1964dc3d..2f3937f3b 100644 --- a/lib/singlepass-backend/Cargo.toml +++ b/lib/singlepass-backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-singlepass-backend" -version = "0.15.0" +version = "0.16.0" repository = "https://github.com/wasmerio/wasmer" description = "Wasmer runtime single pass compiler backend" license = "MIT" @@ -11,7 +11,7 @@ edition = "2018" readme = "README.md" [dependencies] -wasmer-runtime-core = { path = "../runtime-core", version = "0.15.0" } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.0" } dynasm = "0.5" dynasmrt = "0.5" lazy_static = "1.4" diff --git a/lib/spectests/Cargo.toml b/lib/spectests/Cargo.toml index c5497c476..aed07d65c 100644 --- a/lib/spectests/Cargo.toml +++ b/lib/spectests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-spectests" -version = "0.15.0" +version = "0.16.0" description = "Wasmer spectests library" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -9,10 +9,10 @@ edition = "2018" [dependencies] glob = "0.3" -wasmer-runtime = { path = "../runtime", version = "0.15.0", default-features = false} -wasmer-clif-backend = { path = "../clif-backend", version = "0.15.0", optional = true} -wasmer-llvm-backend = { path = "../llvm-backend", version = "0.15.0", features = ["test"], optional = true } -wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.15.0", optional = true } +wasmer-runtime = { path = "../runtime", version = "0.16.0", default-features = false} +wasmer-clif-backend = { path = "../clif-backend", version = "0.16.0", optional = true} +wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.0", features = ["test"], optional = true } +wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.0", optional = true } [build-dependencies] wabt = "0.9.1" diff --git a/lib/wasi-experimental-io-devices/Cargo.toml b/lib/wasi-experimental-io-devices/Cargo.toml index 32c8e266b..a64b3046a 100644 --- a/lib/wasi-experimental-io-devices/Cargo.toml +++ b/lib/wasi-experimental-io-devices/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-wasi-experimental-io-devices" -version = "0.15.0" +version = "0.16.0" authors = ["The Wasmer Engineering Team "] edition = "2018" repository = "https://github.com/wasmerio/wasmer" @@ -14,8 +14,8 @@ maintenance = { status = "experimental" } [dependencies] log = "0.4" minifb = "0.13" -wasmer-wasi = { version = "0.15.0", path = "../wasi" } -wasmer-runtime-core = { version = "0.15.0", path = "../runtime-core" } +wasmer-wasi = { version = "0.16.0", path = "../wasi" } +wasmer-runtime-core = { version = "0.16.0", path = "../runtime-core" } ref_thread_local = "0.0" serde = "1" typetag = "0.1" diff --git a/lib/wasi-tests/Cargo.toml b/lib/wasi-tests/Cargo.toml index c7208be5d..19b6c1e88 100644 --- a/lib/wasi-tests/Cargo.toml +++ b/lib/wasi-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-wasi-tests" -version = "0.15.0" +version = "0.16.0" description = "Tests for our WASI implementation" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -10,18 +10,18 @@ build = "build/mod.rs" [dependencies] # We set default features to false to be able to use the singlepass backend properly -wasmer-runtime = { path = "../runtime", version = "0.15.0", default-features = false } -wasmer-wasi = { path = "../wasi", version = "0.15.0" } +wasmer-runtime = { path = "../runtime", version = "0.16.0", default-features = false } +wasmer-wasi = { path = "../wasi", version = "0.16.0" } # hack to get tests to work -wasmer-clif-backend = { path = "../clif-backend", version = "0.15.0", optional = true} -wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.15.0", optional = true } -wasmer-llvm-backend = { path = "../llvm-backend", version = "0.15.0", features = ["test"], optional = true } +wasmer-clif-backend = { path = "../clif-backend", version = "0.16.0", optional = true} +wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.0", optional = true } +wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.0", features = ["test"], optional = true } [build-dependencies] glob = "0.3" [dev-dependencies] -wasmer-dev-utils = { path = "../dev-utils", version = "0.15.0"} +wasmer-dev-utils = { path = "../dev-utils", version = "0.16.0"} [features] clif = ["wasmer-clif-backend", "wasmer-runtime/default-backend-cranelift"] diff --git a/lib/wasi/Cargo.toml b/lib/wasi/Cargo.toml index 35886c948..13495fd12 100644 --- a/lib/wasi/Cargo.toml +++ b/lib/wasi/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-wasi" -version = "0.15.0" +version = "0.16.0" description = "Wasmer runtime WASI implementation library" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -19,7 +19,7 @@ getrandom = "0.1" time = "0.1" typetag = "0.1" serde = { version = "1", features = ["derive"] } -wasmer-runtime-core = { path = "../runtime-core", version = "0.15.0" } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.0" } [target.'cfg(windows)'.dependencies] winapi = "0.3" diff --git a/lib/win-exception-handler/Cargo.toml b/lib/win-exception-handler/Cargo.toml index 0a92ae94b..7c5faacac 100644 --- a/lib/win-exception-handler/Cargo.toml +++ b/lib/win-exception-handler/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-win-exception-handler" -version = "0.15.0" +version = "0.16.0" description = "Wasmer runtime exception handling for Windows" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -8,7 +8,7 @@ repository = "https://github.com/wasmerio/wasmer" edition = "2018" [target.'cfg(windows)'.dependencies] -wasmer-runtime-core = { path = "../runtime-core", version = "0.15.0" } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.0" } winapi = { version = "0.3.8", features = ["winbase", "errhandlingapi", "minwindef", "minwinbase", "winnt"] } libc = "0.2.60" diff --git a/scripts/update_version_numbers.sh b/scripts/update_version_numbers.sh index 77392a5a3..ed93c6bde 100755 --- a/scripts/update_version_numbers.sh +++ b/scripts/update_version_numbers.sh @@ -1,5 +1,5 @@ -PREVIOUS_VERSION='0.14.1' -NEXT_VERSION='0.15.0' +PREVIOUS_VERSION='0.15.0' +NEXT_VERSION='0.16.0' # quick hack fd Cargo.toml --exec sed -i '' "s/version = \"$PREVIOUS_VERSION\"/version = \"$NEXT_VERSION\"/" diff --git a/src/installer/wasmer.iss b/src/installer/wasmer.iss index 299d638a4..89826ab5e 100644 --- a/src/installer/wasmer.iss +++ b/src/installer/wasmer.iss @@ -1,6 +1,6 @@ [Setup] AppName=Wasmer -AppVersion=0.15.0 +AppVersion=0.16.0 DefaultDirName={pf}\Wasmer DefaultGroupName=Wasmer Compression=lzma2 From adabfa02b02348adf989549fb152efedf9b8bbd5 Mon Sep 17 00:00:00 2001 From: losfair Date: Thu, 12 Mar 2020 02:51:22 +0800 Subject: [PATCH 18/27] Move feed_* into closures. --- lib/runtime-core/src/parse.rs | 88 ++++++++++++++++++++--------------- 1 file changed, 51 insertions(+), 37 deletions(-) diff --git a/lib/runtime-core/src/parse.rs b/lib/runtime-core/src/parse.rs index e65dfae8d..fffb7e4a9 100644 --- a/lib/runtime-core/src/parse.rs +++ b/lib/runtime-core/src/parse.rs @@ -6,8 +6,8 @@ use crate::{ backend::{CompilerConfig, RunnableModule}, error::CompileError, module::{ - DataInitializer, ExportIndex, ImportName, ModuleInfo, StringTable, StringTableBuilder, - TableInitializer, + DataInitializer, ExportIndex, ImportName, ModuleInfo, NameIndex, NamespaceIndex, + StringTable, StringTableBuilder, TableInitializer, }, structures::{Map, TypedIndex}, types::{ @@ -110,46 +110,36 @@ pub fn read_module< let mut namespace_builder = Some(StringTableBuilder::new()); let mut name_builder = Some(StringTableBuilder::new()); let mut func_count: usize = 0; - let mut mcg_signatures_fed = false; - let mut mcg_info_fed = false; + + let mut feed_mcg_signatures: Option<_> = Some(|mcg: &mut MCG| -> Result<(), LoadError> { + let info_read = info.read().unwrap(); + mcg.feed_signatures(info_read.signatures.clone()) + .map_err(|x| LoadError::Codegen(format!("{:?}", x)))?; + Ok(()) + }); + let mut feed_mcg_info: Option<_> = Some( + |mcg: &mut MCG, + ns_builder: StringTableBuilder, + name_builder: StringTableBuilder| + -> Result<(), LoadError> { + { + let mut info_write = info.write().unwrap(); + info_write.namespace_table = ns_builder.finish(); + info_write.name_table = name_builder.finish(); + } + let info_read = info.read().unwrap(); + mcg.feed_function_signatures(info_read.func_assoc.clone()) + .map_err(|x| LoadError::Codegen(format!("{:?}", x)))?; + mcg.check_precondition(&info_read) + .map_err(|x| LoadError::Codegen(format!("{:?}", x)))?; + Ok(()) + }, + ); loop { use wasmparser::ParserState; let state = parser.read(); - // Feed signature and namespace information as early as possible. - match *state { - ParserState::BeginFunctionBody { .. } - | ParserState::ImportSectionEntry { .. } - | ParserState::EndWasm => { - if !mcg_signatures_fed { - mcg_signatures_fed = true; - let info_read = info.read().unwrap(); - mcg.feed_signatures(info_read.signatures.clone()) - .map_err(|x| LoadError::Codegen(format!("{:?}", x)))?; - } - } - _ => {} - } - match *state { - ParserState::BeginFunctionBody { .. } | ParserState::EndWasm => { - if !mcg_info_fed { - mcg_info_fed = true; - { - let mut info_write = info.write().unwrap(); - info_write.namespace_table = namespace_builder.take().unwrap().finish(); - info_write.name_table = name_builder.take().unwrap().finish(); - } - let info_read = info.read().unwrap(); - mcg.feed_function_signatures(info_read.func_assoc.clone()) - .map_err(|x| LoadError::Codegen(format!("{:?}", x)))?; - mcg.check_precondition(&info_read) - .map_err(|x| LoadError::Codegen(format!("{:?}", x)))?; - } - } - _ => {} - } - match *state { ParserState::Error(ref err) => return Err(err.clone().into()), ParserState::TypeSectionEntry(ref ty) => { @@ -159,6 +149,10 @@ pub fn read_module< .push(func_type_to_func_sig(ty)?); } ParserState::ImportSectionEntry { module, field, ty } => { + if let Some(f) = feed_mcg_signatures.take() { + f(mcg)?; + } + let namespace_index = namespace_builder.as_mut().unwrap().register(module); let name_index = name_builder.as_mut().unwrap().register(field); let import_name = ImportName { @@ -252,6 +246,16 @@ pub fn read_module< info.write().unwrap().start_func = Some(FuncIndex::new(start_index as usize)); } ParserState::BeginFunctionBody { range } => { + if let Some(f) = feed_mcg_signatures.take() { + f(mcg)?; + } + if let Some(f) = feed_mcg_info.take() { + f( + mcg, + namespace_builder.take().unwrap(), + name_builder.take().unwrap(), + )?; + } let id = func_count; let fcg = mcg .next_function( @@ -451,6 +455,16 @@ pub fn read_module< info.write().unwrap().globals.push(global_init); } ParserState::EndWasm => { + if let Some(f) = feed_mcg_signatures.take() { + f(mcg)?; + } + if let Some(f) = feed_mcg_info.take() { + f( + mcg, + namespace_builder.take().unwrap(), + name_builder.take().unwrap(), + )?; + } break; } _ => {} From f93561dafc62f9dadcd9f02c55fac7811114a0bb Mon Sep 17 00:00:00 2001 From: losfair Date: Thu, 12 Mar 2020 02:52:48 +0800 Subject: [PATCH 19/27] Add #1283 into changelog. --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c1d93420b..573b03523 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## **[Unreleased]** +- [#1283](https://github.com/wasmerio/wasmer/pull/1283) Workaround for floating point arguments and return values in `DynamicFunc`s. + ## 0.16.0 - 2020-03-11 - [#1286](https://github.com/wasmerio/wasmer/pull/1286) Updated Windows Wasmer icons. Add wax From 5edd1b5ab73868e60d8cdb28fbf6a133065733cb Mon Sep 17 00:00:00 2001 From: losfair Date: Thu, 12 Mar 2020 02:58:36 +0800 Subject: [PATCH 20/27] Enable `DynamicFunc` for closures with environment. --- lib/runtime-core/src/typed_func.rs | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/runtime-core/src/typed_func.rs b/lib/runtime-core/src/typed_func.rs index 0b29d54ea..b1d1399e9 100644 --- a/lib/runtime-core/src/typed_func.rs +++ b/lib/runtime-core/src/typed_func.rs @@ -349,11 +349,6 @@ impl<'a> DynamicFunc<'a> { } } - // Disable "fat" closures for possible future changes. - if mem::size_of::() != 0 { - unimplemented!("DynamicFunc with captured environment is not yet supported"); - } - let mut builder = TrampolineBufferBuilder::new(); let ctx: Box = Box::new(PolymorphicContext { arg_types: signature.params().to_vec(), From 6c7f49a223bc750eef91abf46eee5791785febe5 Mon Sep 17 00:00:00 2001 From: losfair Date: Thu, 12 Mar 2020 03:14:57 +0800 Subject: [PATCH 21/27] Put fat `DynamicFunc`s behind a feature flag. --- lib/runtime-core/Cargo.toml | 2 ++ lib/runtime-core/src/typed_func.rs | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/lib/runtime-core/Cargo.toml b/lib/runtime-core/Cargo.toml index 03904ed7c..5242a2bc1 100644 --- a/lib/runtime-core/Cargo.toml +++ b/lib/runtime-core/Cargo.toml @@ -59,3 +59,5 @@ generate-debug-information = ["wasm-debug"] # don't export symbols related to the GDB JIT interafce, LLVM or some other native # code will be providing them generate-debug-information-no-export-symbols = [] +# enable DynamicFunc's for closures with captured environment. +dynamicfunc-fat-closures = [] diff --git a/lib/runtime-core/src/typed_func.rs b/lib/runtime-core/src/typed_func.rs index b1d1399e9..61def512d 100644 --- a/lib/runtime-core/src/typed_func.rs +++ b/lib/runtime-core/src/typed_func.rs @@ -349,6 +349,10 @@ impl<'a> DynamicFunc<'a> { } } + if cfg!(not(feature = "dynamicfunc-fat-closures")) && mem::size_of::() != 0 { + unimplemented!("DynamicFunc with captured environment is disabled"); + } + let mut builder = TrampolineBufferBuilder::new(); let ctx: Box = Box::new(PolymorphicContext { arg_types: signature.params().to_vec(), From 9d6681006daf74e25c92885bda2780e6d2f34adc Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Wed, 11 Mar 2020 15:53:51 -0700 Subject: [PATCH 22/27] Fix `wax` command packaging for install script --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 601421c91..7365279ab 100644 --- a/Makefile +++ b/Makefile @@ -288,8 +288,8 @@ build-install-package: cp ./wapm-cli/target/release/wapm ./install/bin/ cp ./target/release/wasmer ./install/bin/ # Create the wax binary as symlink to wapm - cd ./install/bin/ && ln -s wapm wax - tar -C ./install -zcvf wasmer.tar.gz bin/wapm bin/wasmer + cd ./install/bin/ && ln -sf wapm wax && chmod +x wax + tar -C ./install -zcvf wasmer.tar.gz bin UNAME_S := $(shell uname -s) From a0d0263e86e04b5451d5a70a2ae418fca45ad3a4 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Wed, 11 Mar 2020 15:57:26 -0700 Subject: [PATCH 23/27] Update azure-pipelines.yml --- azure-pipelines.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index bccae7ddd..07f720e86 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -300,6 +300,7 @@ jobs: isDraft: false isPreRelease: false assets: '$(Build.ArtifactStagingDirectory)/**' + assetUploadMode: 'replace' # Don't delete previously uploaded assets (default) - job: Publish_Docs dependsOn: From dc9cc3292c82589dcb0069b802a2e03ad82771a5 Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Wed, 11 Mar 2020 16:00:21 -0700 Subject: [PATCH 24/27] Prepare for 0.16.1 release --- CHANGELOG.md | 4 +++ Cargo.lock | 38 ++++++++++----------- Cargo.toml | 2 +- lib/clif-backend/Cargo.toml | 6 ++-- lib/dev-utils/Cargo.toml | 2 +- lib/emscripten-tests/Cargo.toml | 14 ++++---- lib/emscripten/Cargo.toml | 4 +-- lib/interface-types/Cargo.toml | 2 +- lib/llvm-backend-tests/Cargo.toml | 6 ++-- lib/llvm-backend/Cargo.toml | 4 +-- lib/middleware-common-tests/Cargo.toml | 12 +++---- lib/middleware-common/Cargo.toml | 4 +-- lib/runtime-c-api/Cargo.toml | 10 +++--- lib/runtime-core-tests/Cargo.toml | 10 +++--- lib/runtime-core/Cargo.toml | 2 +- lib/runtime/Cargo.toml | 8 ++--- lib/singlepass-backend/Cargo.toml | 4 +-- lib/spectests/Cargo.toml | 10 +++--- lib/wasi-experimental-io-devices/Cargo.toml | 6 ++-- lib/wasi-tests/Cargo.toml | 14 ++++---- lib/wasi/Cargo.toml | 4 +-- lib/win-exception-handler/Cargo.toml | 4 +-- scripts/update_version_numbers.sh | 4 +-- src/installer/wasmer.iss | 2 +- 24 files changed, 90 insertions(+), 86 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c1d93420b..22885af0a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ ## 0.16.0 - 2020-03-11 +- [#1291](https://github.com/wasmerio/wasmer/pull/1291) Fix installation packaging script to package the `wax` command. + +## 0.16.0 - 2020-03-11 + - [#1286](https://github.com/wasmerio/wasmer/pull/1286) Updated Windows Wasmer icons. Add wax - [#1284](https://github.com/wasmerio/wasmer/pull/1284) Implement string and memory instructions in `wasmer-interface-types` - [#1272](https://github.com/wasmerio/wasmer/pull/1272) Fix off-by-one error bug when accessing memory with a `WasmPtr` that contains the last valid byte of memory. Also changes the behavior of `WasmPtr` with a length of 0 and `WasmPtr` where `std::mem::size_of::()` is 0 to always return `None` diff --git a/Cargo.lock b/Cargo.lock index 57aba6cea..d1ce82547 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1820,7 +1820,7 @@ dependencies = [ [[package]] name = "wasmer" -version = "0.16.0" +version = "0.16.1" dependencies = [ "atty", "byteorder", @@ -1851,7 +1851,7 @@ dependencies = [ [[package]] name = "wasmer-clif-backend" -version = "0.16.0" +version = "0.16.1" dependencies = [ "byteorder", "cranelift-codegen", @@ -1902,14 +1902,14 @@ dependencies = [ [[package]] name = "wasmer-dev-utils" -version = "0.16.0" +version = "0.16.1" dependencies = [ "libc", ] [[package]] name = "wasmer-emscripten" -version = "0.16.0" +version = "0.16.1" dependencies = [ "byteorder", "getrandom", @@ -1922,7 +1922,7 @@ dependencies = [ [[package]] name = "wasmer-emscripten-tests" -version = "0.16.0" +version = "0.16.1" dependencies = [ "glob 0.3.0", "wabt", @@ -1936,7 +1936,7 @@ dependencies = [ [[package]] name = "wasmer-interface-types" -version = "0.16.0" +version = "0.16.1" dependencies = [ "nom", "wast", @@ -1952,7 +1952,7 @@ dependencies = [ [[package]] name = "wasmer-llvm-backend" -version = "0.16.0" +version = "0.16.1" dependencies = [ "byteorder", "cc", @@ -1983,14 +1983,14 @@ dependencies = [ [[package]] name = "wasmer-middleware-common" -version = "0.16.0" +version = "0.16.1" dependencies = [ "wasmer-runtime-core", ] [[package]] name = "wasmer-middleware-common-tests" -version = "0.16.0" +version = "0.16.1" dependencies = [ "criterion", "wabt", @@ -2003,7 +2003,7 @@ dependencies = [ [[package]] name = "wasmer-runtime" -version = "0.16.0" +version = "0.16.1" dependencies = [ "criterion", "lazy_static", @@ -2020,7 +2020,7 @@ dependencies = [ [[package]] name = "wasmer-runtime-c-api" -version = "0.16.0" +version = "0.16.1" dependencies = [ "cbindgen", "libc", @@ -2032,7 +2032,7 @@ dependencies = [ [[package]] name = "wasmer-runtime-core" -version = "0.16.0" +version = "0.16.1" dependencies = [ "bincode", "blake3", @@ -2060,7 +2060,7 @@ dependencies = [ [[package]] name = "wasmer-runtime-core-tests" -version = "0.16.0" +version = "0.16.1" dependencies = [ "wabt", "wasmer-clif-backend", @@ -2071,7 +2071,7 @@ dependencies = [ [[package]] name = "wasmer-singlepass-backend" -version = "0.16.0" +version = "0.16.1" dependencies = [ "bincode", "byteorder", @@ -2088,7 +2088,7 @@ dependencies = [ [[package]] name = "wasmer-spectests" -version = "0.16.0" +version = "0.16.1" dependencies = [ "glob 0.3.0", "wabt", @@ -2100,7 +2100,7 @@ dependencies = [ [[package]] name = "wasmer-wasi" -version = "0.16.0" +version = "0.16.1" dependencies = [ "bincode", "byteorder", @@ -2117,7 +2117,7 @@ dependencies = [ [[package]] name = "wasmer-wasi-experimental-io-devices" -version = "0.16.0" +version = "0.16.1" dependencies = [ "log", "minifb", @@ -2130,7 +2130,7 @@ dependencies = [ [[package]] name = "wasmer-wasi-tests" -version = "0.16.0" +version = "0.16.1" dependencies = [ "glob 0.3.0", "wasmer-clif-backend", @@ -2143,7 +2143,7 @@ dependencies = [ [[package]] name = "wasmer-win-exception-handler" -version = "0.16.0" +version = "0.16.1" dependencies = [ "cmake", "libc", diff --git a/Cargo.toml b/Cargo.toml index 9a360270f..05874f849 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer" -version = "0.16.0" +version = "0.16.1" authors = ["The Wasmer Engineering Team "] edition = "2018" repository = "https://github.com/wasmerio/wasmer" diff --git a/lib/clif-backend/Cargo.toml b/lib/clif-backend/Cargo.toml index 9a2fc85ec..0cda55de6 100644 --- a/lib/clif-backend/Cargo.toml +++ b/lib/clif-backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-clif-backend" -version = "0.16.0" +version = "0.16.1" description = "Wasmer runtime Cranelift compiler backend" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -11,7 +11,7 @@ edition = "2018" readme = "README.md" [dependencies] -wasmer-runtime-core = { path = "../runtime-core", version = "0.16.0" } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.1" } cranelift-native = "0.59.0" cranelift-codegen = "0.59.0" cranelift-entity = "0.59.0" @@ -38,7 +38,7 @@ version = "0.0.7" [target.'cfg(windows)'.dependencies] winapi = { version = "0.3", features = ["errhandlingapi", "minwindef", "minwinbase", "winnt"] } -wasmer-win-exception-handler = { path = "../win-exception-handler", version = "0.16.0" } +wasmer-win-exception-handler = { path = "../win-exception-handler", version = "0.16.1" } [features] generate-debug-information = ["wasm-debug"] diff --git a/lib/dev-utils/Cargo.toml b/lib/dev-utils/Cargo.toml index 404efd77a..c97b4b16f 100644 --- a/lib/dev-utils/Cargo.toml +++ b/lib/dev-utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-dev-utils" -version = "0.16.0" +version = "0.16.1" description = "Wasmer runtime core library" license = "MIT" authors = ["The Wasmer Engineering Team "] diff --git a/lib/emscripten-tests/Cargo.toml b/lib/emscripten-tests/Cargo.toml index 4df41605d..750583a85 100644 --- a/lib/emscripten-tests/Cargo.toml +++ b/lib/emscripten-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-emscripten-tests" -version = "0.16.0" +version = "0.16.1" description = "Tests for our Emscripten implementation" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -9,15 +9,15 @@ publish = false build = "build/mod.rs" [dependencies] -wasmer-emscripten = { path = "../emscripten", version = "0.16.0" } -wasmer-runtime = { path = "../runtime", version = "0.16.0", default-features = false } -wasmer-clif-backend = { path = "../clif-backend", version = "0.16.0", optional = true} -wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.0", optional = true, features = ["test"] } -wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.0", optional = true } +wasmer-emscripten = { path = "../emscripten", version = "0.16.1" } +wasmer-runtime = { path = "../runtime", version = "0.16.1", default-features = false } +wasmer-clif-backend = { path = "../clif-backend", version = "0.16.1", optional = true} +wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.1", optional = true, features = ["test"] } +wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.1", optional = true } [dev-dependencies] wabt = "0.9.1" -wasmer-dev-utils = { path = "../dev-utils", version = "0.16.0"} +wasmer-dev-utils = { path = "../dev-utils", version = "0.16.1"} [build-dependencies] glob = "0.3" diff --git a/lib/emscripten/Cargo.toml b/lib/emscripten/Cargo.toml index cb946a491..de3469bc7 100644 --- a/lib/emscripten/Cargo.toml +++ b/lib/emscripten/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-emscripten" -version = "0.16.0" +version = "0.16.1" description = "Wasmer runtime emscripten implementation library" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -15,7 +15,7 @@ lazy_static = "1.4" libc = "0.2.60" log = "0.4" time = "0.1" -wasmer-runtime-core = { path = "../runtime-core", version = "0.16.0" } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.1" } [target.'cfg(windows)'.dependencies] getrandom = "0.1" diff --git a/lib/interface-types/Cargo.toml b/lib/interface-types/Cargo.toml index 6915304af..859986f8f 100644 --- a/lib/interface-types/Cargo.toml +++ b/lib/interface-types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-interface-types" -version = "0.16.0" +version = "0.16.1" description = "WebAssembly Interface Types library for Wasmer" license = "MIT" authors = ["The Wasmer Engineering Team "] diff --git a/lib/llvm-backend-tests/Cargo.toml b/lib/llvm-backend-tests/Cargo.toml index 6bb843be5..796655413 100644 --- a/lib/llvm-backend-tests/Cargo.toml +++ b/lib/llvm-backend-tests/Cargo.toml @@ -9,8 +9,8 @@ edition = "2018" [dependencies] wabt = "0.9.1" -wasmer-runtime-core = { path = "../runtime-core", version = "0.16.0" } -wasmer-runtime = { path = "../runtime", version = "0.16.0" } -wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.0", features = ["test"] } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.1" } +wasmer-runtime = { path = "../runtime", version = "0.16.1" } +wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.1", features = ["test"] } [features] diff --git a/lib/llvm-backend/Cargo.toml b/lib/llvm-backend/Cargo.toml index fa3d05b22..94f786e00 100644 --- a/lib/llvm-backend/Cargo.toml +++ b/lib/llvm-backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-llvm-backend" -version = "0.16.0" +version = "0.16.1" license = "MIT" authors = ["The Wasmer Engineering Team "] repository = "https://github.com/wasmerio/wasmer" @@ -10,7 +10,7 @@ edition = "2018" readme = "README.md" [dependencies] -wasmer-runtime-core = { path = "../runtime-core", version = "0.16.0", features = ["generate-debug-information-no-export-symbols"] } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.1", features = ["generate-debug-information-no-export-symbols"] } wasmparser = "0.51.3" smallvec = "0.6" goblin = "0.0.24" diff --git a/lib/middleware-common-tests/Cargo.toml b/lib/middleware-common-tests/Cargo.toml index 943da23a0..117dc79f0 100644 --- a/lib/middleware-common-tests/Cargo.toml +++ b/lib/middleware-common-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-middleware-common-tests" -version = "0.16.0" +version = "0.16.1" authors = ["The Wasmer Engineering Team "] edition = "2018" repository = "https://github.com/wasmerio/wasmer" @@ -8,11 +8,11 @@ license = "MIT" publish = false [dependencies] -wasmer-runtime-core = { path = "../runtime-core", version = "0.16.0" } -wasmer-middleware-common = { path = "../middleware-common", version = "0.16.0" } -wasmer-clif-backend = { path = "../clif-backend", version = "0.16.0", optional = true } -wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.0", features = ["test"], optional = true } -wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.0", optional = true } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.1" } +wasmer-middleware-common = { path = "../middleware-common", version = "0.16.1" } +wasmer-clif-backend = { path = "../clif-backend", version = "0.16.1", optional = true } +wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.1", features = ["test"], optional = true } +wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.1", optional = true } [features] clif = ["wasmer-clif-backend"] diff --git a/lib/middleware-common/Cargo.toml b/lib/middleware-common/Cargo.toml index ea39f5958..593fe5b8f 100644 --- a/lib/middleware-common/Cargo.toml +++ b/lib/middleware-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-middleware-common" -version = "0.16.0" +version = "0.16.1" repository = "https://github.com/wasmerio/wasmer" description = "Wasmer runtime common middlewares" license = "MIT" @@ -10,4 +10,4 @@ categories = ["wasm"] edition = "2018" [dependencies] -wasmer-runtime-core = { path = "../runtime-core", version = "0.16.0" } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.1" } diff --git a/lib/runtime-c-api/Cargo.toml b/lib/runtime-c-api/Cargo.toml index fb933aa2f..fbb3287b0 100644 --- a/lib/runtime-c-api/Cargo.toml +++ b/lib/runtime-c-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-runtime-c-api" -version = "0.16.0" +version = "0.16.1" description = "Wasmer C API library" documentation = "https://wasmerio.github.io/wasmer/c/runtime-c-api/" license = "MIT" @@ -20,22 +20,22 @@ libc = "0.2.60" [dependencies.wasmer-runtime] default-features = false path = "../runtime" -version = "0.16.0" +version = "0.16.1" [dependencies.wasmer-runtime-core] default-features = false path = "../runtime-core" -version = "0.16.0" +version = "0.16.1" [dependencies.wasmer-wasi] default-features = false path = "../wasi" -version = "0.16.0" +version = "0.16.1" optional = true [dependencies.wasmer-emscripten] path = "../emscripten" -version = "0.16.0" +version = "0.16.1" optional = true [features] diff --git a/lib/runtime-core-tests/Cargo.toml b/lib/runtime-core-tests/Cargo.toml index 1e5b58f27..aea0fd11b 100644 --- a/lib/runtime-core-tests/Cargo.toml +++ b/lib/runtime-core-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-runtime-core-tests" -version = "0.16.0" +version = "0.16.1" description = "Tests for the Wasmer runtime core crate" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -9,10 +9,10 @@ publish = false [dependencies] wabt = "0.9.1" -wasmer-runtime-core = { path = "../runtime-core", version = "0.16.0" } -wasmer-clif-backend = { path = "../clif-backend", version = "0.16.0", optional = true } -wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.0", optional = true } -wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.0", features = ["test"], optional = true } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.1" } +wasmer-clif-backend = { path = "../clif-backend", version = "0.16.1", optional = true } +wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.1", optional = true } +wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.1", features = ["test"], optional = true } [features] default = ["backend-cranelift"] diff --git a/lib/runtime-core/Cargo.toml b/lib/runtime-core/Cargo.toml index 03904ed7c..22f7fc40f 100644 --- a/lib/runtime-core/Cargo.toml +++ b/lib/runtime-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-runtime-core" -version = "0.16.0" +version = "0.16.1" description = "Wasmer runtime core library" license = "MIT" authors = ["The Wasmer Engineering Team "] diff --git a/lib/runtime/Cargo.toml b/lib/runtime/Cargo.toml index bc9b1fe3a..6af22a3b8 100644 --- a/lib/runtime/Cargo.toml +++ b/lib/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-runtime" -version = "0.16.0" +version = "0.16.1" description = "Wasmer runtime library" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -11,17 +11,17 @@ edition = "2018" readme = "README.md" [dependencies] -wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.0", optional = true } +wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.1", optional = true } lazy_static = "1.4" memmap = "0.7" [dependencies.wasmer-runtime-core] path = "../runtime-core" -version = "0.16.0" +version = "0.16.1" [dependencies.wasmer-clif-backend] path = "../clif-backend" -version = "0.16.0" +version = "0.16.1" optional = true # Dependencies for caching. diff --git a/lib/singlepass-backend/Cargo.toml b/lib/singlepass-backend/Cargo.toml index 2f3937f3b..564a26809 100644 --- a/lib/singlepass-backend/Cargo.toml +++ b/lib/singlepass-backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-singlepass-backend" -version = "0.16.0" +version = "0.16.1" repository = "https://github.com/wasmerio/wasmer" description = "Wasmer runtime single pass compiler backend" license = "MIT" @@ -11,7 +11,7 @@ edition = "2018" readme = "README.md" [dependencies] -wasmer-runtime-core = { path = "../runtime-core", version = "0.16.0" } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.1" } dynasm = "0.5" dynasmrt = "0.5" lazy_static = "1.4" diff --git a/lib/spectests/Cargo.toml b/lib/spectests/Cargo.toml index aed07d65c..26cd21d89 100644 --- a/lib/spectests/Cargo.toml +++ b/lib/spectests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-spectests" -version = "0.16.0" +version = "0.16.1" description = "Wasmer spectests library" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -9,10 +9,10 @@ edition = "2018" [dependencies] glob = "0.3" -wasmer-runtime = { path = "../runtime", version = "0.16.0", default-features = false} -wasmer-clif-backend = { path = "../clif-backend", version = "0.16.0", optional = true} -wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.0", features = ["test"], optional = true } -wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.0", optional = true } +wasmer-runtime = { path = "../runtime", version = "0.16.1", default-features = false} +wasmer-clif-backend = { path = "../clif-backend", version = "0.16.1", optional = true} +wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.1", features = ["test"], optional = true } +wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.1", optional = true } [build-dependencies] wabt = "0.9.1" diff --git a/lib/wasi-experimental-io-devices/Cargo.toml b/lib/wasi-experimental-io-devices/Cargo.toml index a64b3046a..ebf6b4873 100644 --- a/lib/wasi-experimental-io-devices/Cargo.toml +++ b/lib/wasi-experimental-io-devices/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-wasi-experimental-io-devices" -version = "0.16.0" +version = "0.16.1" authors = ["The Wasmer Engineering Team "] edition = "2018" repository = "https://github.com/wasmerio/wasmer" @@ -14,8 +14,8 @@ maintenance = { status = "experimental" } [dependencies] log = "0.4" minifb = "0.13" -wasmer-wasi = { version = "0.16.0", path = "../wasi" } -wasmer-runtime-core = { version = "0.16.0", path = "../runtime-core" } +wasmer-wasi = { version = "0.16.1", path = "../wasi" } +wasmer-runtime-core = { version = "0.16.1", path = "../runtime-core" } ref_thread_local = "0.0" serde = "1" typetag = "0.1" diff --git a/lib/wasi-tests/Cargo.toml b/lib/wasi-tests/Cargo.toml index 19b6c1e88..75a8488ef 100644 --- a/lib/wasi-tests/Cargo.toml +++ b/lib/wasi-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-wasi-tests" -version = "0.16.0" +version = "0.16.1" description = "Tests for our WASI implementation" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -10,18 +10,18 @@ build = "build/mod.rs" [dependencies] # We set default features to false to be able to use the singlepass backend properly -wasmer-runtime = { path = "../runtime", version = "0.16.0", default-features = false } -wasmer-wasi = { path = "../wasi", version = "0.16.0" } +wasmer-runtime = { path = "../runtime", version = "0.16.1", default-features = false } +wasmer-wasi = { path = "../wasi", version = "0.16.1" } # hack to get tests to work -wasmer-clif-backend = { path = "../clif-backend", version = "0.16.0", optional = true} -wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.0", optional = true } -wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.0", features = ["test"], optional = true } +wasmer-clif-backend = { path = "../clif-backend", version = "0.16.1", optional = true} +wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.1", optional = true } +wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.1", features = ["test"], optional = true } [build-dependencies] glob = "0.3" [dev-dependencies] -wasmer-dev-utils = { path = "../dev-utils", version = "0.16.0"} +wasmer-dev-utils = { path = "../dev-utils", version = "0.16.1"} [features] clif = ["wasmer-clif-backend", "wasmer-runtime/default-backend-cranelift"] diff --git a/lib/wasi/Cargo.toml b/lib/wasi/Cargo.toml index 13495fd12..f539f82b0 100644 --- a/lib/wasi/Cargo.toml +++ b/lib/wasi/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-wasi" -version = "0.16.0" +version = "0.16.1" description = "Wasmer runtime WASI implementation library" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -19,7 +19,7 @@ getrandom = "0.1" time = "0.1" typetag = "0.1" serde = { version = "1", features = ["derive"] } -wasmer-runtime-core = { path = "../runtime-core", version = "0.16.0" } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.1" } [target.'cfg(windows)'.dependencies] winapi = "0.3" diff --git a/lib/win-exception-handler/Cargo.toml b/lib/win-exception-handler/Cargo.toml index 7c5faacac..75079fc23 100644 --- a/lib/win-exception-handler/Cargo.toml +++ b/lib/win-exception-handler/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-win-exception-handler" -version = "0.16.0" +version = "0.16.1" description = "Wasmer runtime exception handling for Windows" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -8,7 +8,7 @@ repository = "https://github.com/wasmerio/wasmer" edition = "2018" [target.'cfg(windows)'.dependencies] -wasmer-runtime-core = { path = "../runtime-core", version = "0.16.0" } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.1" } winapi = { version = "0.3.8", features = ["winbase", "errhandlingapi", "minwindef", "minwinbase", "winnt"] } libc = "0.2.60" diff --git a/scripts/update_version_numbers.sh b/scripts/update_version_numbers.sh index ed93c6bde..84418905e 100755 --- a/scripts/update_version_numbers.sh +++ b/scripts/update_version_numbers.sh @@ -1,5 +1,5 @@ -PREVIOUS_VERSION='0.15.0' -NEXT_VERSION='0.16.0' +PREVIOUS_VERSION='0.16.0' +NEXT_VERSION='0.16.1' # quick hack fd Cargo.toml --exec sed -i '' "s/version = \"$PREVIOUS_VERSION\"/version = \"$NEXT_VERSION\"/" diff --git a/src/installer/wasmer.iss b/src/installer/wasmer.iss index 89826ab5e..20f4223c1 100644 --- a/src/installer/wasmer.iss +++ b/src/installer/wasmer.iss @@ -1,6 +1,6 @@ [Setup] AppName=Wasmer -AppVersion=0.16.0 +AppVersion=0.16.1 DefaultDirName={pf}\Wasmer DefaultGroupName=Wasmer Compression=lzma2 From 418edef88fe22c39835e0f7f223af0469ba04503 Mon Sep 17 00:00:00 2001 From: Syrus Akbary Date: Wed, 11 Mar 2020 16:10:06 -0700 Subject: [PATCH 25/27] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22885af0a..afc95820a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## **[Unreleased]** -## 0.16.0 - 2020-03-11 +## 0.16.1 - 2020-03-11 - [#1291](https://github.com/wasmerio/wasmer/pull/1291) Fix installation packaging script to package the `wax` command. From c3865c919c5ff9333a967e102787ca477bff458e Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Wed, 11 Mar 2020 18:59:09 -0700 Subject: [PATCH 26/27] Allow zero length arrays and check base offset for being out of bounds --- lib/runtime-core/src/memory/ptr.rs | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/lib/runtime-core/src/memory/ptr.rs b/lib/runtime-core/src/memory/ptr.rs index f9c798af1..9e991cb85 100644 --- a/lib/runtime-core/src/memory/ptr.rs +++ b/lib/runtime-core/src/memory/ptr.rs @@ -130,9 +130,10 @@ impl WasmPtr { // for any index, we will always result an aligned memory access let item_size = mem::size_of::() + (mem::size_of::() % mem::align_of::()); let slice_full_len = index as usize + length as usize; + let memory_size = memory.size().bytes().0; - if (self.offset as usize) + (item_size * slice_full_len) > memory.size().bytes().0 - || length == 0 + if (self.offset as usize) + (item_size * slice_full_len) > memory_size + || self.offset as usize >= memory_size || mem::size_of::() == 0 { return None; @@ -167,9 +168,10 @@ impl WasmPtr { // for any index, we will always result an aligned memory access let item_size = mem::size_of::() + (mem::size_of::() % mem::align_of::()); let slice_full_len = index as usize + length as usize; + let memory_size = memory.size().bytes().0; if (self.offset as usize) + (item_size * slice_full_len) > memory.size().bytes().0 - || length == 0 + || self.offset as usize >= memory_size || mem::size_of::() == 0 { return None; @@ -190,7 +192,11 @@ impl WasmPtr { /// underlying data can be mutated if the Wasm is allowed to execute or /// an aliasing `WasmPtr` is used to mutate memory. pub fn get_utf8_string(self, memory: &Memory, str_len: u32) -> Option<&str> { - if self.offset as usize + str_len as usize > memory.size().bytes().0 || str_len == 0 { + let memory_size = memory.size().bytes().0; + + if self.offset as usize + str_len as usize > memory.size().bytes().0 + || self.offset as usize >= memory_size + { return None; } let ptr = unsafe { memory.view::().as_ptr().add(self.offset as usize) as *const u8 }; @@ -271,15 +277,15 @@ mod test { memory::MemoryDescriptor::new(Pages(1), Some(Pages(1)), false).unwrap(); let memory = memory::Memory::new(memory_descriptor).unwrap(); - // test that basic access works and that len = 0 is caught correctly + // test that basic access works and that len = 0 works, but oob does not let start_wasm_ptr: WasmPtr = WasmPtr::new(0); let start_wasm_ptr_array: WasmPtr = WasmPtr::new(0); assert!(start_wasm_ptr.deref(&memory).is_some()); assert!(unsafe { start_wasm_ptr.deref_mut(&memory).is_some() }); - assert!(start_wasm_ptr_array.deref(&memory, 0, 0).is_none()); - assert!(start_wasm_ptr_array.get_utf8_string(&memory, 0).is_none()); - assert!(unsafe { start_wasm_ptr_array.deref_mut(&memory, 0, 0).is_none() }); + assert!(start_wasm_ptr_array.deref(&memory, 0, 0).is_some()); + assert!(start_wasm_ptr_array.get_utf8_string(&memory, 0).is_some()); + assert!(unsafe { start_wasm_ptr_array.deref_mut(&memory, 0, 0).is_some() }); assert!(start_wasm_ptr_array.deref(&memory, 0, 1).is_some()); assert!(unsafe { start_wasm_ptr_array.deref_mut(&memory, 0, 1).is_some() }); @@ -293,7 +299,8 @@ mod test { assert!(end_wasm_ptr_array.deref(&memory, 0, 1).is_some()); assert!(unsafe { end_wasm_ptr_array.deref_mut(&memory, 0, 1).is_some() }); - let invalid_idx_len_combos: [(u32, u32); 3] = [(0, 0), (0, 2), (1, 1)]; + let invalid_idx_len_combos: [(u32, u32); 3] = + [(last_valid_address_for_u8 + 1, 0), (0, 2), (1, 1)]; for &(idx, len) in invalid_idx_len_combos.into_iter() { assert!(end_wasm_ptr_array.deref(&memory, idx, len).is_none()); assert!(unsafe { end_wasm_ptr_array.deref_mut(&memory, idx, len).is_none() }); @@ -323,7 +330,8 @@ mod test { assert!(end_wasm_ptr_array.deref(&memory, 0, 1).is_some()); assert!(unsafe { end_wasm_ptr_array.deref_mut(&memory, 0, 1).is_some() }); - let invalid_idx_len_combos: [(u32, u32); 4] = [(0, 0), (1, 0), (0, 2), (1, 1)]; + let invalid_idx_len_combos: [(u32, u32); 3] = + [(last_valid_address_for_u32 + 1, 0), (0, 2), (1, 1)]; for &(idx, len) in invalid_idx_len_combos.into_iter() { assert!(end_wasm_ptr_array.deref(&memory, idx, len).is_none()); assert!(unsafe { end_wasm_ptr_array.deref_mut(&memory, idx, len).is_none() }); @@ -339,8 +347,6 @@ mod test { for oob_end_array_ptr in end_wasm_ptr_array_oob_array.into_iter() { assert!(oob_end_array_ptr.deref(&memory, 0, 1).is_none()); assert!(unsafe { oob_end_array_ptr.deref_mut(&memory, 0, 1).is_none() }); - assert!(oob_end_array_ptr.deref(&memory, 0, 0).is_none()); - assert!(unsafe { oob_end_array_ptr.deref_mut(&memory, 0, 0).is_none() }); assert!(oob_end_array_ptr.deref(&memory, 1, 0).is_none()); assert!(unsafe { oob_end_array_ptr.deref_mut(&memory, 1, 0).is_none() }); } From fffdba395d85357209460a99138b37ddac3df328 Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Wed, 11 Mar 2020 19:15:31 -0700 Subject: [PATCH 27/27] Prepare for 0.16.2 release --- CHANGELOG.md | 4 +++ Cargo.lock | 38 ++++++++++----------- Cargo.toml | 2 +- lib/clif-backend/Cargo.toml | 6 ++-- lib/dev-utils/Cargo.toml | 2 +- lib/emscripten-tests/Cargo.toml | 14 ++++---- lib/emscripten/Cargo.toml | 4 +-- lib/interface-types/Cargo.toml | 2 +- lib/llvm-backend-tests/Cargo.toml | 6 ++-- lib/llvm-backend/Cargo.toml | 4 +-- lib/middleware-common-tests/Cargo.toml | 12 +++---- lib/middleware-common/Cargo.toml | 4 +-- lib/runtime-c-api/Cargo.toml | 10 +++--- lib/runtime-core-tests/Cargo.toml | 10 +++--- lib/runtime-core/Cargo.toml | 2 +- lib/runtime/Cargo.toml | 8 ++--- lib/singlepass-backend/Cargo.toml | 4 +-- lib/spectests/Cargo.toml | 10 +++--- lib/wasi-experimental-io-devices/Cargo.toml | 6 ++-- lib/wasi-tests/Cargo.toml | 14 ++++---- lib/wasi/Cargo.toml | 4 +-- lib/win-exception-handler/Cargo.toml | 4 +-- scripts/update_version_numbers.sh | 4 +-- src/installer/wasmer.iss | 2 +- 24 files changed, 90 insertions(+), 86 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index afc95820a..0380b4f90 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## **[Unreleased]** +## 0.16.2 - 2020-03-11 + +- [#1294](https://github.com/wasmerio/wasmer/pull/1294) Fix bug related to system calls in WASI that rely on reading from WasmPtrs as arrays of length 0. `WasmPtr` will now succeed on length 0 arrays again. + ## 0.16.1 - 2020-03-11 - [#1291](https://github.com/wasmerio/wasmer/pull/1291) Fix installation packaging script to package the `wax` command. diff --git a/Cargo.lock b/Cargo.lock index d1ce82547..3cd09fa0d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1820,7 +1820,7 @@ dependencies = [ [[package]] name = "wasmer" -version = "0.16.1" +version = "0.16.2" dependencies = [ "atty", "byteorder", @@ -1851,7 +1851,7 @@ dependencies = [ [[package]] name = "wasmer-clif-backend" -version = "0.16.1" +version = "0.16.2" dependencies = [ "byteorder", "cranelift-codegen", @@ -1902,14 +1902,14 @@ dependencies = [ [[package]] name = "wasmer-dev-utils" -version = "0.16.1" +version = "0.16.2" dependencies = [ "libc", ] [[package]] name = "wasmer-emscripten" -version = "0.16.1" +version = "0.16.2" dependencies = [ "byteorder", "getrandom", @@ -1922,7 +1922,7 @@ dependencies = [ [[package]] name = "wasmer-emscripten-tests" -version = "0.16.1" +version = "0.16.2" dependencies = [ "glob 0.3.0", "wabt", @@ -1936,7 +1936,7 @@ dependencies = [ [[package]] name = "wasmer-interface-types" -version = "0.16.1" +version = "0.16.2" dependencies = [ "nom", "wast", @@ -1952,7 +1952,7 @@ dependencies = [ [[package]] name = "wasmer-llvm-backend" -version = "0.16.1" +version = "0.16.2" dependencies = [ "byteorder", "cc", @@ -1983,14 +1983,14 @@ dependencies = [ [[package]] name = "wasmer-middleware-common" -version = "0.16.1" +version = "0.16.2" dependencies = [ "wasmer-runtime-core", ] [[package]] name = "wasmer-middleware-common-tests" -version = "0.16.1" +version = "0.16.2" dependencies = [ "criterion", "wabt", @@ -2003,7 +2003,7 @@ dependencies = [ [[package]] name = "wasmer-runtime" -version = "0.16.1" +version = "0.16.2" dependencies = [ "criterion", "lazy_static", @@ -2020,7 +2020,7 @@ dependencies = [ [[package]] name = "wasmer-runtime-c-api" -version = "0.16.1" +version = "0.16.2" dependencies = [ "cbindgen", "libc", @@ -2032,7 +2032,7 @@ dependencies = [ [[package]] name = "wasmer-runtime-core" -version = "0.16.1" +version = "0.16.2" dependencies = [ "bincode", "blake3", @@ -2060,7 +2060,7 @@ dependencies = [ [[package]] name = "wasmer-runtime-core-tests" -version = "0.16.1" +version = "0.16.2" dependencies = [ "wabt", "wasmer-clif-backend", @@ -2071,7 +2071,7 @@ dependencies = [ [[package]] name = "wasmer-singlepass-backend" -version = "0.16.1" +version = "0.16.2" dependencies = [ "bincode", "byteorder", @@ -2088,7 +2088,7 @@ dependencies = [ [[package]] name = "wasmer-spectests" -version = "0.16.1" +version = "0.16.2" dependencies = [ "glob 0.3.0", "wabt", @@ -2100,7 +2100,7 @@ dependencies = [ [[package]] name = "wasmer-wasi" -version = "0.16.1" +version = "0.16.2" dependencies = [ "bincode", "byteorder", @@ -2117,7 +2117,7 @@ dependencies = [ [[package]] name = "wasmer-wasi-experimental-io-devices" -version = "0.16.1" +version = "0.16.2" dependencies = [ "log", "minifb", @@ -2130,7 +2130,7 @@ dependencies = [ [[package]] name = "wasmer-wasi-tests" -version = "0.16.1" +version = "0.16.2" dependencies = [ "glob 0.3.0", "wasmer-clif-backend", @@ -2143,7 +2143,7 @@ dependencies = [ [[package]] name = "wasmer-win-exception-handler" -version = "0.16.1" +version = "0.16.2" dependencies = [ "cmake", "libc", diff --git a/Cargo.toml b/Cargo.toml index 05874f849..0bb2e9a82 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer" -version = "0.16.1" +version = "0.16.2" authors = ["The Wasmer Engineering Team "] edition = "2018" repository = "https://github.com/wasmerio/wasmer" diff --git a/lib/clif-backend/Cargo.toml b/lib/clif-backend/Cargo.toml index 0cda55de6..fa24d5ed4 100644 --- a/lib/clif-backend/Cargo.toml +++ b/lib/clif-backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-clif-backend" -version = "0.16.1" +version = "0.16.2" description = "Wasmer runtime Cranelift compiler backend" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -11,7 +11,7 @@ edition = "2018" readme = "README.md" [dependencies] -wasmer-runtime-core = { path = "../runtime-core", version = "0.16.1" } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.2" } cranelift-native = "0.59.0" cranelift-codegen = "0.59.0" cranelift-entity = "0.59.0" @@ -38,7 +38,7 @@ version = "0.0.7" [target.'cfg(windows)'.dependencies] winapi = { version = "0.3", features = ["errhandlingapi", "minwindef", "minwinbase", "winnt"] } -wasmer-win-exception-handler = { path = "../win-exception-handler", version = "0.16.1" } +wasmer-win-exception-handler = { path = "../win-exception-handler", version = "0.16.2" } [features] generate-debug-information = ["wasm-debug"] diff --git a/lib/dev-utils/Cargo.toml b/lib/dev-utils/Cargo.toml index c97b4b16f..07800ed61 100644 --- a/lib/dev-utils/Cargo.toml +++ b/lib/dev-utils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-dev-utils" -version = "0.16.1" +version = "0.16.2" description = "Wasmer runtime core library" license = "MIT" authors = ["The Wasmer Engineering Team "] diff --git a/lib/emscripten-tests/Cargo.toml b/lib/emscripten-tests/Cargo.toml index 750583a85..5065de08a 100644 --- a/lib/emscripten-tests/Cargo.toml +++ b/lib/emscripten-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-emscripten-tests" -version = "0.16.1" +version = "0.16.2" description = "Tests for our Emscripten implementation" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -9,15 +9,15 @@ publish = false build = "build/mod.rs" [dependencies] -wasmer-emscripten = { path = "../emscripten", version = "0.16.1" } -wasmer-runtime = { path = "../runtime", version = "0.16.1", default-features = false } -wasmer-clif-backend = { path = "../clif-backend", version = "0.16.1", optional = true} -wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.1", optional = true, features = ["test"] } -wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.1", optional = true } +wasmer-emscripten = { path = "../emscripten", version = "0.16.2" } +wasmer-runtime = { path = "../runtime", version = "0.16.2", default-features = false } +wasmer-clif-backend = { path = "../clif-backend", version = "0.16.2", optional = true} +wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.2", optional = true, features = ["test"] } +wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.2", optional = true } [dev-dependencies] wabt = "0.9.1" -wasmer-dev-utils = { path = "../dev-utils", version = "0.16.1"} +wasmer-dev-utils = { path = "../dev-utils", version = "0.16.2"} [build-dependencies] glob = "0.3" diff --git a/lib/emscripten/Cargo.toml b/lib/emscripten/Cargo.toml index de3469bc7..3fb904902 100644 --- a/lib/emscripten/Cargo.toml +++ b/lib/emscripten/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-emscripten" -version = "0.16.1" +version = "0.16.2" description = "Wasmer runtime emscripten implementation library" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -15,7 +15,7 @@ lazy_static = "1.4" libc = "0.2.60" log = "0.4" time = "0.1" -wasmer-runtime-core = { path = "../runtime-core", version = "0.16.1" } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.2" } [target.'cfg(windows)'.dependencies] getrandom = "0.1" diff --git a/lib/interface-types/Cargo.toml b/lib/interface-types/Cargo.toml index 859986f8f..3bcebd337 100644 --- a/lib/interface-types/Cargo.toml +++ b/lib/interface-types/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-interface-types" -version = "0.16.1" +version = "0.16.2" description = "WebAssembly Interface Types library for Wasmer" license = "MIT" authors = ["The Wasmer Engineering Team "] diff --git a/lib/llvm-backend-tests/Cargo.toml b/lib/llvm-backend-tests/Cargo.toml index 796655413..e916850aa 100644 --- a/lib/llvm-backend-tests/Cargo.toml +++ b/lib/llvm-backend-tests/Cargo.toml @@ -9,8 +9,8 @@ edition = "2018" [dependencies] wabt = "0.9.1" -wasmer-runtime-core = { path = "../runtime-core", version = "0.16.1" } -wasmer-runtime = { path = "../runtime", version = "0.16.1" } -wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.1", features = ["test"] } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.2" } +wasmer-runtime = { path = "../runtime", version = "0.16.2" } +wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.2", features = ["test"] } [features] diff --git a/lib/llvm-backend/Cargo.toml b/lib/llvm-backend/Cargo.toml index 94f786e00..129d7e374 100644 --- a/lib/llvm-backend/Cargo.toml +++ b/lib/llvm-backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-llvm-backend" -version = "0.16.1" +version = "0.16.2" license = "MIT" authors = ["The Wasmer Engineering Team "] repository = "https://github.com/wasmerio/wasmer" @@ -10,7 +10,7 @@ edition = "2018" readme = "README.md" [dependencies] -wasmer-runtime-core = { path = "../runtime-core", version = "0.16.1", features = ["generate-debug-information-no-export-symbols"] } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.2", features = ["generate-debug-information-no-export-symbols"] } wasmparser = "0.51.3" smallvec = "0.6" goblin = "0.0.24" diff --git a/lib/middleware-common-tests/Cargo.toml b/lib/middleware-common-tests/Cargo.toml index 117dc79f0..22b3d723e 100644 --- a/lib/middleware-common-tests/Cargo.toml +++ b/lib/middleware-common-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-middleware-common-tests" -version = "0.16.1" +version = "0.16.2" authors = ["The Wasmer Engineering Team "] edition = "2018" repository = "https://github.com/wasmerio/wasmer" @@ -8,11 +8,11 @@ license = "MIT" publish = false [dependencies] -wasmer-runtime-core = { path = "../runtime-core", version = "0.16.1" } -wasmer-middleware-common = { path = "../middleware-common", version = "0.16.1" } -wasmer-clif-backend = { path = "../clif-backend", version = "0.16.1", optional = true } -wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.1", features = ["test"], optional = true } -wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.1", optional = true } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.2" } +wasmer-middleware-common = { path = "../middleware-common", version = "0.16.2" } +wasmer-clif-backend = { path = "../clif-backend", version = "0.16.2", optional = true } +wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.2", features = ["test"], optional = true } +wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.2", optional = true } [features] clif = ["wasmer-clif-backend"] diff --git a/lib/middleware-common/Cargo.toml b/lib/middleware-common/Cargo.toml index 593fe5b8f..345fff897 100644 --- a/lib/middleware-common/Cargo.toml +++ b/lib/middleware-common/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-middleware-common" -version = "0.16.1" +version = "0.16.2" repository = "https://github.com/wasmerio/wasmer" description = "Wasmer runtime common middlewares" license = "MIT" @@ -10,4 +10,4 @@ categories = ["wasm"] edition = "2018" [dependencies] -wasmer-runtime-core = { path = "../runtime-core", version = "0.16.1" } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.2" } diff --git a/lib/runtime-c-api/Cargo.toml b/lib/runtime-c-api/Cargo.toml index fbb3287b0..618ba71ba 100644 --- a/lib/runtime-c-api/Cargo.toml +++ b/lib/runtime-c-api/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-runtime-c-api" -version = "0.16.1" +version = "0.16.2" description = "Wasmer C API library" documentation = "https://wasmerio.github.io/wasmer/c/runtime-c-api/" license = "MIT" @@ -20,22 +20,22 @@ libc = "0.2.60" [dependencies.wasmer-runtime] default-features = false path = "../runtime" -version = "0.16.1" +version = "0.16.2" [dependencies.wasmer-runtime-core] default-features = false path = "../runtime-core" -version = "0.16.1" +version = "0.16.2" [dependencies.wasmer-wasi] default-features = false path = "../wasi" -version = "0.16.1" +version = "0.16.2" optional = true [dependencies.wasmer-emscripten] path = "../emscripten" -version = "0.16.1" +version = "0.16.2" optional = true [features] diff --git a/lib/runtime-core-tests/Cargo.toml b/lib/runtime-core-tests/Cargo.toml index aea0fd11b..7ea842d8c 100644 --- a/lib/runtime-core-tests/Cargo.toml +++ b/lib/runtime-core-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-runtime-core-tests" -version = "0.16.1" +version = "0.16.2" description = "Tests for the Wasmer runtime core crate" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -9,10 +9,10 @@ publish = false [dependencies] wabt = "0.9.1" -wasmer-runtime-core = { path = "../runtime-core", version = "0.16.1" } -wasmer-clif-backend = { path = "../clif-backend", version = "0.16.1", optional = true } -wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.1", optional = true } -wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.1", features = ["test"], optional = true } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.2" } +wasmer-clif-backend = { path = "../clif-backend", version = "0.16.2", optional = true } +wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.2", optional = true } +wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.2", features = ["test"], optional = true } [features] default = ["backend-cranelift"] diff --git a/lib/runtime-core/Cargo.toml b/lib/runtime-core/Cargo.toml index 22f7fc40f..967dbe32e 100644 --- a/lib/runtime-core/Cargo.toml +++ b/lib/runtime-core/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-runtime-core" -version = "0.16.1" +version = "0.16.2" description = "Wasmer runtime core library" license = "MIT" authors = ["The Wasmer Engineering Team "] diff --git a/lib/runtime/Cargo.toml b/lib/runtime/Cargo.toml index 6af22a3b8..cb3a1d700 100644 --- a/lib/runtime/Cargo.toml +++ b/lib/runtime/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-runtime" -version = "0.16.1" +version = "0.16.2" description = "Wasmer runtime library" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -11,17 +11,17 @@ edition = "2018" readme = "README.md" [dependencies] -wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.1", optional = true } +wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.2", optional = true } lazy_static = "1.4" memmap = "0.7" [dependencies.wasmer-runtime-core] path = "../runtime-core" -version = "0.16.1" +version = "0.16.2" [dependencies.wasmer-clif-backend] path = "../clif-backend" -version = "0.16.1" +version = "0.16.2" optional = true # Dependencies for caching. diff --git a/lib/singlepass-backend/Cargo.toml b/lib/singlepass-backend/Cargo.toml index 564a26809..889492287 100644 --- a/lib/singlepass-backend/Cargo.toml +++ b/lib/singlepass-backend/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-singlepass-backend" -version = "0.16.1" +version = "0.16.2" repository = "https://github.com/wasmerio/wasmer" description = "Wasmer runtime single pass compiler backend" license = "MIT" @@ -11,7 +11,7 @@ edition = "2018" readme = "README.md" [dependencies] -wasmer-runtime-core = { path = "../runtime-core", version = "0.16.1" } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.2" } dynasm = "0.5" dynasmrt = "0.5" lazy_static = "1.4" diff --git a/lib/spectests/Cargo.toml b/lib/spectests/Cargo.toml index 26cd21d89..a4b6576ce 100644 --- a/lib/spectests/Cargo.toml +++ b/lib/spectests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-spectests" -version = "0.16.1" +version = "0.16.2" description = "Wasmer spectests library" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -9,10 +9,10 @@ edition = "2018" [dependencies] glob = "0.3" -wasmer-runtime = { path = "../runtime", version = "0.16.1", default-features = false} -wasmer-clif-backend = { path = "../clif-backend", version = "0.16.1", optional = true} -wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.1", features = ["test"], optional = true } -wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.1", optional = true } +wasmer-runtime = { path = "../runtime", version = "0.16.2", default-features = false} +wasmer-clif-backend = { path = "../clif-backend", version = "0.16.2", optional = true} +wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.2", features = ["test"], optional = true } +wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.2", optional = true } [build-dependencies] wabt = "0.9.1" diff --git a/lib/wasi-experimental-io-devices/Cargo.toml b/lib/wasi-experimental-io-devices/Cargo.toml index ebf6b4873..06421d396 100644 --- a/lib/wasi-experimental-io-devices/Cargo.toml +++ b/lib/wasi-experimental-io-devices/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-wasi-experimental-io-devices" -version = "0.16.1" +version = "0.16.2" authors = ["The Wasmer Engineering Team "] edition = "2018" repository = "https://github.com/wasmerio/wasmer" @@ -14,8 +14,8 @@ maintenance = { status = "experimental" } [dependencies] log = "0.4" minifb = "0.13" -wasmer-wasi = { version = "0.16.1", path = "../wasi" } -wasmer-runtime-core = { version = "0.16.1", path = "../runtime-core" } +wasmer-wasi = { version = "0.16.2", path = "../wasi" } +wasmer-runtime-core = { version = "0.16.2", path = "../runtime-core" } ref_thread_local = "0.0" serde = "1" typetag = "0.1" diff --git a/lib/wasi-tests/Cargo.toml b/lib/wasi-tests/Cargo.toml index 75a8488ef..3a542ab7a 100644 --- a/lib/wasi-tests/Cargo.toml +++ b/lib/wasi-tests/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-wasi-tests" -version = "0.16.1" +version = "0.16.2" description = "Tests for our WASI implementation" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -10,18 +10,18 @@ build = "build/mod.rs" [dependencies] # We set default features to false to be able to use the singlepass backend properly -wasmer-runtime = { path = "../runtime", version = "0.16.1", default-features = false } -wasmer-wasi = { path = "../wasi", version = "0.16.1" } +wasmer-runtime = { path = "../runtime", version = "0.16.2", default-features = false } +wasmer-wasi = { path = "../wasi", version = "0.16.2" } # hack to get tests to work -wasmer-clif-backend = { path = "../clif-backend", version = "0.16.1", optional = true} -wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.1", optional = true } -wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.1", features = ["test"], optional = true } +wasmer-clif-backend = { path = "../clif-backend", version = "0.16.2", optional = true} +wasmer-singlepass-backend = { path = "../singlepass-backend", version = "0.16.2", optional = true } +wasmer-llvm-backend = { path = "../llvm-backend", version = "0.16.2", features = ["test"], optional = true } [build-dependencies] glob = "0.3" [dev-dependencies] -wasmer-dev-utils = { path = "../dev-utils", version = "0.16.1"} +wasmer-dev-utils = { path = "../dev-utils", version = "0.16.2"} [features] clif = ["wasmer-clif-backend", "wasmer-runtime/default-backend-cranelift"] diff --git a/lib/wasi/Cargo.toml b/lib/wasi/Cargo.toml index f539f82b0..e26bf73e3 100644 --- a/lib/wasi/Cargo.toml +++ b/lib/wasi/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-wasi" -version = "0.16.1" +version = "0.16.2" description = "Wasmer runtime WASI implementation library" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -19,7 +19,7 @@ getrandom = "0.1" time = "0.1" typetag = "0.1" serde = { version = "1", features = ["derive"] } -wasmer-runtime-core = { path = "../runtime-core", version = "0.16.1" } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.2" } [target.'cfg(windows)'.dependencies] winapi = "0.3" diff --git a/lib/win-exception-handler/Cargo.toml b/lib/win-exception-handler/Cargo.toml index 75079fc23..02d5c54b4 100644 --- a/lib/win-exception-handler/Cargo.toml +++ b/lib/win-exception-handler/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "wasmer-win-exception-handler" -version = "0.16.1" +version = "0.16.2" description = "Wasmer runtime exception handling for Windows" license = "MIT" authors = ["The Wasmer Engineering Team "] @@ -8,7 +8,7 @@ repository = "https://github.com/wasmerio/wasmer" edition = "2018" [target.'cfg(windows)'.dependencies] -wasmer-runtime-core = { path = "../runtime-core", version = "0.16.1" } +wasmer-runtime-core = { path = "../runtime-core", version = "0.16.2" } winapi = { version = "0.3.8", features = ["winbase", "errhandlingapi", "minwindef", "minwinbase", "winnt"] } libc = "0.2.60" diff --git a/scripts/update_version_numbers.sh b/scripts/update_version_numbers.sh index 84418905e..c436e38b7 100755 --- a/scripts/update_version_numbers.sh +++ b/scripts/update_version_numbers.sh @@ -1,5 +1,5 @@ -PREVIOUS_VERSION='0.16.0' -NEXT_VERSION='0.16.1' +PREVIOUS_VERSION='0.16.1' +NEXT_VERSION='0.16.2' # quick hack fd Cargo.toml --exec sed -i '' "s/version = \"$PREVIOUS_VERSION\"/version = \"$NEXT_VERSION\"/" diff --git a/src/installer/wasmer.iss b/src/installer/wasmer.iss index 20f4223c1..767409584 100644 --- a/src/installer/wasmer.iss +++ b/src/installer/wasmer.iss @@ -1,6 +1,6 @@ [Setup] AppName=Wasmer -AppVersion=0.16.1 +AppVersion=0.16.2 DefaultDirName={pf}\Wasmer DefaultGroupName=Wasmer Compression=lzma2