From ddf532ddb5ddb7f63c5176aa1d7f0fd7d63b384f Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Fri, 29 Mar 2019 09:43:21 +0100 Subject: [PATCH 01/16] fix(llvm-backend) Remove an `example.rs` file. --- lib/llvm-backend/src/example.rs | 61 --------------------------------- 1 file changed, 61 deletions(-) delete mode 100644 lib/llvm-backend/src/example.rs diff --git a/lib/llvm-backend/src/example.rs b/lib/llvm-backend/src/example.rs deleted file mode 100644 index 5ce3c9a5ffb..00000000000 --- a/lib/llvm-backend/src/example.rs +++ /dev/null @@ -1,61 +0,0 @@ -use inkwell::OptimizationLevel; -use inkwell::builder::Builder; -use inkwell::context::Context; -use inkwell::execution_engine::{ExecutionEngine, JitFunction}; -use inkwell::module::Module; -use inkwell::targets::{InitializationConfig, Target}; -use std::error::Error; - -/// Convenience type alias for the `sum` function. -/// -/// Calling this is innately `unsafe` because there's no guarantee it doesn't -/// do `unsafe` operations internally. -type SumFunc = unsafe extern "C" fn(u64, u64, u64) -> u64; - -#[test] -fn test_sum() -> Result<(), Box> { - let context = Context::create(); - let module = context.create_module("sum"); - let builder = context.create_builder(); - let execution_engine = module.create_jit_execution_engine(OptimizationLevel::Aggressive)?; - - let sum = jit_compile_sum(&context, &module, &builder, &execution_engine) - .ok_or("Unable to JIT compile `sum`")?; - - let x = 1u64; - let y = 2u64; - let z = 3u64; - - unsafe { - println!("{} + {} + {} = {}", x, y, z, sum.call(x, y, z)); - assert_eq!(sum.call(x, y, z), x + y + z); - } - - Ok(()) -} - -fn jit_compile_sum( - context: &Context, - module: &Module, - builder: &Builder, - execution_engine: &ExecutionEngine, -) -> Option> { - let i64_type = context.i64_type(); - let fn_type = i64_type.fn_type(&[i64_type.into(), i64_type.into(), i64_type.into()], false); - - let function = module.add_function("sum", fn_type, None); - let basic_block = context.append_basic_block(&function, "entry"); - - builder.position_at_end(&basic_block); - - let x = function.get_nth_param(0)?.into_int_value(); - let y = function.get_nth_param(1)?.into_int_value(); - let z = function.get_nth_param(2)?.into_int_value(); - - let sum = builder.build_int_add(x, y, "sum"); - let sum = builder.build_int_add(sum, z, "sum"); - - builder.build_return(Some(&sum)); - - unsafe { execution_engine.get_function("sum").ok() } -} From a1ca7069afda1f71aa6ace1b9d777a4027245e15 Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Fri, 29 Mar 2019 10:03:40 +0100 Subject: [PATCH 02/16] fix(llvm-backend) Remove unused imports. --- lib/llvm-backend/src/backend.rs | 5 +---- lib/llvm-backend/src/code.rs | 4 ++-- lib/llvm-backend/src/intrinsics.rs | 5 +---- lib/llvm-backend/src/lib.rs | 13 ++----------- lib/llvm-backend/src/platform/unix.rs | 4 +--- lib/llvm-backend/src/trampolines.rs | 7 +++---- 6 files changed, 10 insertions(+), 28 deletions(-) diff --git a/lib/llvm-backend/src/backend.rs b/lib/llvm-backend/src/backend.rs index 742069d48fa..8831f6aa7e8 100644 --- a/lib/llvm-backend/src/backend.rs +++ b/lib/llvm-backend/src/backend.rs @@ -23,10 +23,7 @@ use wasmer_runtime_core::{ export::Context, module::{ModuleInfo, ModuleInner}, structures::TypedIndex, - types::{ - FuncIndex, FuncSig, LocalFuncIndex, LocalOrImport, MemoryIndex, SigIndex, TableIndex, Type, - Value, - }, + types::{FuncIndex, FuncSig, LocalFuncIndex, LocalOrImport, SigIndex, Type, Value}, vm::{self, ImportBacking}, vmcalls, }; diff --git a/lib/llvm-backend/src/code.rs b/lib/llvm-backend/src/code.rs index 173262b67be..284e2aa36f8 100644 --- a/lib/llvm-backend/src/code.rs +++ b/lib/llvm-backend/src/code.rs @@ -3,14 +3,14 @@ use inkwell::{ context::Context, module::{Linkage, Module}, passes::PassManager, - types::{BasicType, BasicTypeEnum, FunctionType, IntType, PointerType}, + types::{BasicType, BasicTypeEnum, FunctionType, PointerType}, values::{BasicValue, FloatValue, FunctionValue, IntValue, PhiValue, PointerValue}, AddressSpace, FloatPredicate, IntPredicate, }; use smallvec::SmallVec; use wasmer_runtime_core::{ memory::MemoryType, - module::{ExportIndex, ModuleInfo}, + module::ModuleInfo, structures::{Map, SliceMap, TypedIndex}, types::{ FuncIndex, FuncSig, GlobalIndex, LocalFuncIndex, LocalOrImport, MemoryIndex, SigIndex, diff --git a/lib/llvm-backend/src/intrinsics.rs b/lib/llvm-backend/src/intrinsics.rs index ba1e3abd34c..1ddbe743f96 100644 --- a/lib/llvm-backend/src/intrinsics.rs +++ b/lib/llvm-backend/src/intrinsics.rs @@ -4,10 +4,7 @@ use inkwell::{ context::Context, module::Module, types::{BasicType, FloatType, FunctionType, IntType, PointerType, StructType, VoidType}, - values::{ - BasicValue, BasicValueEnum, FloatValue, FunctionValue, InstructionValue, IntValue, - PointerValue, - }, + values::{BasicValue, BasicValueEnum, FloatValue, FunctionValue, IntValue, PointerValue}, AddressSpace, }; use std::marker::PhantomData; diff --git a/lib/llvm-backend/src/lib.rs b/lib/llvm-backend/src/lib.rs index ee4e02bbc16..5029c7cf70b 100644 --- a/lib/llvm-backend/src/lib.rs +++ b/lib/llvm-backend/src/lib.rs @@ -1,10 +1,5 @@ #![cfg_attr(nightly, feature(unwind_attributes))] -use inkwell::{ - execution_engine::JitFunction, - targets::{CodeModel, FileType, InitializationConfig, RelocMode, Target, TargetMachine}, - OptimizationLevel, -}; use wasmer_runtime_core::{ backend::{Compiler, CompilerConfig, Token}, cache::{Artifact, Error as CacheError}, @@ -47,14 +42,10 @@ impl Compiler for LLVMCompiler { // Create placeholder values here. let cache_gen = { - use wasmer_runtime_core::backend::{ - sys::Memory, CacheGen, ProtectedCaller, UserTrapper, - }; + use wasmer_runtime_core::backend::{sys::Memory, CacheGen}; use wasmer_runtime_core::cache::Error as CacheError; - use wasmer_runtime_core::error::RuntimeResult; use wasmer_runtime_core::module::ModuleInfo; - use wasmer_runtime_core::types::{FuncIndex, Value}; - use wasmer_runtime_core::vm; + struct Placeholder; impl CacheGen for Placeholder { fn generate_cache( diff --git a/lib/llvm-backend/src/platform/unix.rs b/lib/llvm-backend/src/platform/unix.rs index 2267ab129e2..2664263031d 100644 --- a/lib/llvm-backend/src/platform/unix.rs +++ b/lib/llvm-backend/src/platform/unix.rs @@ -1,7 +1,5 @@ use libc::{c_void, siginfo_t}; -use nix::sys::signal::{ - sigaction, SaFlags, SigAction, SigHandler, SigSet, Signal, SIGBUS, SIGFPE, SIGILL, SIGSEGV, -}; +use nix::sys::signal::{sigaction, SaFlags, SigAction, SigHandler, SigSet, SIGBUS, SIGSEGV}; /// `__register_frame` and `__deregister_frame` on macos take a single fde as an /// argument, so we need to parse the fde table here. diff --git a/lib/llvm-backend/src/trampolines.rs b/lib/llvm-backend/src/trampolines.rs index 4619cb990cd..4254180504c 100644 --- a/lib/llvm-backend/src/trampolines.rs +++ b/lib/llvm-backend/src/trampolines.rs @@ -3,10 +3,9 @@ use inkwell::{ builder::Builder, context::Context, module::{Linkage, Module}, - passes::PassManager, - types::{BasicType, BasicTypeEnum, FunctionType, PointerType}, - values::{BasicValue, FunctionValue, PhiValue, PointerValue}, - AddressSpace, FloatPredicate, IntPredicate, + types::{BasicType, FunctionType}, + values::FunctionValue, + AddressSpace, }; use wasmer_runtime_core::{ module::ModuleInfo, From 91f40639b7524ad86925cac59092aadba8709f56 Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Fri, 29 Mar 2019 10:04:09 +0100 Subject: [PATCH 03/16] fix(llvm-back) Mark `WasmTrapType` as deadcode. This enum is not used directly by Rust, but used externally. --- lib/llvm-backend/src/backend.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/llvm-backend/src/backend.rs b/lib/llvm-backend/src/backend.rs index 8831f6aa7e8..2ee3877c5b4 100644 --- a/lib/llvm-backend/src/backend.rs +++ b/lib/llvm-backend/src/backend.rs @@ -54,6 +54,7 @@ enum LLVMResult { OBJECT_LOAD_FAILURE, } +#[allow(dead_code)] #[repr(C)] enum WasmTrapType { Unreachable = 0, From dea4705dcbf4f2c929ffc927281bc8b16a142715 Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Fri, 29 Mar 2019 10:04:56 +0100 Subject: [PATCH 04/16] fix(llvm-backend) `LLVMBackend::new` doesn't use instrinsics yet. --- lib/llvm-backend/src/backend.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/llvm-backend/src/backend.rs b/lib/llvm-backend/src/backend.rs index 2ee3877c5b4..5a692c40e52 100644 --- a/lib/llvm-backend/src/backend.rs +++ b/lib/llvm-backend/src/backend.rs @@ -218,7 +218,7 @@ pub struct LLVMBackend { } impl LLVMBackend { - pub fn new(module: Module, intrinsics: Intrinsics) -> (Self, LLVMProtectedCaller) { + pub fn new(module: Module, _intrinsics: Intrinsics) -> (Self, LLVMProtectedCaller) { Target::initialize_x86(&InitializationConfig { asm_parser: true, asm_printer: true, From e3f39fc1278cb27a04844f58f205908946d55e44 Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Fri, 29 Mar 2019 10:05:39 +0100 Subject: [PATCH 05/16] fix(llvm-backend) `parse_function` doesn't need a `Module`. --- lib/llvm-backend/src/code.rs | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/llvm-backend/src/code.rs b/lib/llvm-backend/src/code.rs index 284e2aa36f8..14c3ced2d18 100644 --- a/lib/llvm-backend/src/code.rs +++ b/lib/llvm-backend/src/code.rs @@ -102,7 +102,6 @@ pub fn parse_function_bodies( parse_function( &context, - &module, &builder, &intrinsics, info, @@ -143,7 +142,6 @@ pub fn parse_function_bodies( fn parse_function( context: &Context, - module: &Module, builder: &Builder, intrinsics: &Intrinsics, info: &ModuleInfo, From 20378de0e7d6fdce7a991d62782ff13f2596cf5d Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Fri, 29 Mar 2019 10:06:11 +0100 Subject: [PATCH 06/16] fix(llvm-backend) `llvm_sig` variable is not used here. --- lib/llvm-backend/src/code.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/llvm-backend/src/code.rs b/lib/llvm-backend/src/code.rs index 14c3ced2d18..601d117d95d 100644 --- a/lib/llvm-backend/src/code.rs +++ b/lib/llvm-backend/src/code.rs @@ -153,7 +153,6 @@ fn parse_function( ) -> Result<(), BinaryReaderError> { let sig_index = info.func_assoc[func_index.convert_up(info)]; let func_sig = &info.signatures[sig_index]; - let llvm_sig = &signatures[sig_index]; let function = functions[func_index]; let mut state = State::new(); From 00e4b2511149c9421177ca5d968bf9fbb7975d38 Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Fri, 29 Mar 2019 10:06:31 +0100 Subject: [PATCH 07/16] fix(llvm-backend) No need to enumerate items in this iterator. --- lib/llvm-backend/src/code.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/llvm-backend/src/code.rs b/lib/llvm-backend/src/code.rs index 601d117d95d..20324bac97b 100644 --- a/lib/llvm-backend/src/code.rs +++ b/lib/llvm-backend/src/code.rs @@ -190,7 +190,7 @@ fn parse_function( let param_len = locals.len(); let mut local_idx = 0; - for (index, local) in locals_reader.into_iter().enumerate() { + for local in locals_reader.into_iter() { let (count, ty) = local?; let wasmer_ty = type_to_type(ty)?; let ty = type_to_llvm(intrinsics, wasmer_ty); From 7645a812d98eebd32cad41c16d8b4db6d01656ac Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Fri, 29 Mar 2019 10:07:08 +0100 Subject: [PATCH 08/16] fix(llvm-backend) Remove unused variables. --- lib/llvm-backend/src/code.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/llvm-backend/src/code.rs b/lib/llvm-backend/src/code.rs index 20324bac97b..05cde06949c 100644 --- a/lib/llvm-backend/src/code.rs +++ b/lib/llvm-backend/src/code.rs @@ -487,7 +487,6 @@ fn parse_function( if let ControlFrame::IfElse { if_else, next, - phis, if_else_state, .. } = &frame @@ -863,7 +862,7 @@ fn parse_function( let value = call_site.try_as_basic_value().left().unwrap(); state.push1(value); } - returns @ _ => unimplemented!("multi-value returns"), + _ => unimplemented!("multi-value returns"), } } @@ -2155,7 +2154,7 @@ fn parse_function( [one_value] => { builder.build_return(Some(one_value)); } - returns @ _ => { + _ => { // let struct_ty = llvm_sig.get_return_type().as_struct_type(); // let ret_struct = struct_ty.const_zero(); unimplemented!("multi-value returns not yet implemented") @@ -2208,7 +2207,7 @@ fn trap_if_not_representatable_as_int( ), }; - let masked = builder.build_and( + builder.build_and( float_bits, int_ty.const_int(exponent_mask, false), "masked_bits", From 76d26d97ac5bcb1850ba7dacba0253f69f011131 Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Fri, 29 Mar 2019 10:07:38 +0100 Subject: [PATCH 09/16] fix(llvm-backend) Remove `Intrinsics.ctx_ty`, `CtxType.ctx_ty, and `.ctx_ptr_ty`. --- lib/llvm-backend/src/intrinsics.rs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/lib/llvm-backend/src/intrinsics.rs b/lib/llvm-backend/src/intrinsics.rs index 1ddbe743f96..cd683981e94 100644 --- a/lib/llvm-backend/src/intrinsics.rs +++ b/lib/llvm-backend/src/intrinsics.rs @@ -114,7 +114,6 @@ pub struct Intrinsics { pub throw_trap: FunctionValue, - ctx_ty: StructType, pub ctx_ptr_ty: PointerType, } @@ -367,7 +366,6 @@ impl Intrinsics { void_ty.fn_type(&[i32_ty_basic], false), None, ), - ctx_ty, ctx_ptr_ty, } } @@ -380,9 +378,6 @@ impl Intrinsics { cache_builder: Builder, ) -> CtxType<'a> { CtxType { - ctx_ty: self.ctx_ty, - ctx_ptr_ty: self.ctx_ptr_ty, - ctx_ptr_value: func_value.get_nth_param(0).unwrap().into_pointer_value(), builder, @@ -432,9 +427,6 @@ struct ImportedFuncCache { } pub struct CtxType<'a> { - ctx_ty: StructType, - ctx_ptr_ty: PointerType, - ctx_ptr_value: PointerValue, builder: &'a Builder, From b03980f8c92b70df64c1fc14d4f1e0ea898deff4 Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Fri, 29 Mar 2019 10:08:43 +0100 Subject: [PATCH 10/16] fix(llvm-backend) Remove unused variables or functions. --- lib/llvm-backend/src/intrinsics.rs | 47 +++--------------------------- 1 file changed, 4 insertions(+), 43 deletions(-) diff --git a/lib/llvm-backend/src/intrinsics.rs b/lib/llvm-backend/src/intrinsics.rs index cd683981e94..1b367f5d4f8 100644 --- a/lib/llvm-backend/src/intrinsics.rs +++ b/lib/llvm-backend/src/intrinsics.rs @@ -449,9 +449,8 @@ impl<'a> CtxType<'a> { } pub fn memory(&mut self, index: MemoryIndex) -> MemoryCache { - let (cached_memories, builder, info, ctx_ptr_value, intrinsics, cache_builder) = ( + let (cached_memories, info, ctx_ptr_value, intrinsics, cache_builder) = ( &mut self.cached_memories, - self.builder, self.info, self.ctx_ptr_value, self.intrinsics, @@ -607,10 +606,8 @@ impl<'a> CtxType<'a> { } pub fn dynamic_sigindex(&mut self, index: SigIndex) -> IntValue { - let (cached_sigindices, builder, info, ctx_ptr_value, intrinsics, cache_builder) = ( + let (cached_sigindices, ctx_ptr_value, intrinsics, cache_builder) = ( &mut self.cached_sigindices, - self.builder, - self.info, self.ctx_ptr_value, self.intrinsics, &self.cache_builder, @@ -640,9 +637,8 @@ impl<'a> CtxType<'a> { } pub fn global_cache(&mut self, index: GlobalIndex) -> GlobalCache { - let (cached_globals, builder, ctx_ptr_value, info, intrinsics, cache_builder) = ( + let (cached_globals, ctx_ptr_value, info, intrinsics, cache_builder) = ( &mut self.cached_globals, - self.builder, self.ctx_ptr_value, self.info, self.intrinsics, @@ -717,9 +713,8 @@ impl<'a> CtxType<'a> { } pub fn imported_func(&mut self, index: ImportedFuncIndex) -> (PointerValue, PointerValue) { - let (cached_imported_functions, builder, ctx_ptr_value, intrinsics, cache_builder) = ( + let (cached_imported_functions, ctx_ptr_value, intrinsics, cache_builder) = ( &mut self.cached_imported_functions, - self.builder, self.ctx_ptr_value, self.intrinsics, &self.cache_builder, @@ -759,38 +754,4 @@ impl<'a> CtxType<'a> { (imported_func_cache.func_ptr, imported_func_cache.ctx_ptr) } - - pub fn build_trap(&self) { - self.builder.build_call(self.intrinsics.trap, &[], "trap"); - } } - -// pub struct Ctx { -// /// A pointer to an array of locally-defined memories, indexed by `MemoryIndex`. -// pub(crate) memories: *mut *mut LocalMemory, - -// /// A pointer to an array of locally-defined tables, indexed by `TableIndex`. -// pub(crate) tables: *mut *mut LocalTable, - -// /// A pointer to an array of locally-defined globals, indexed by `GlobalIndex`. -// pub(crate) globals: *mut *mut LocalGlobal, - -// /// A pointer to an array of imported memories, indexed by `MemoryIndex, -// pub(crate) imported_memories: *mut *mut LocalMemory, - -// /// A pointer to an array of imported tables, indexed by `TableIndex`. -// pub(crate) imported_tables: *mut *mut LocalTable, - -// /// A pointer to an array of imported globals, indexed by `GlobalIndex`. -// pub(crate) imported_globals: *mut *mut LocalGlobal, - -// /// A pointer to an array of imported functions, indexed by `FuncIndex`. -// pub(crate) imported_funcs: *mut ImportedFunc, - -// local_backing: *mut LocalBacking, -// import_backing: *mut ImportBacking, -// module: *const ModuleInner, - -// pub data: *mut c_void, -// pub data_finalizer: Option, -// } From 5cd45cbc28132a65942a883f2b4011d610b4e91d Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Fri, 29 Mar 2019 10:09:10 +0100 Subject: [PATCH 11/16] fix(llvm-backend) Mark a variable as unused. --- lib/llvm-backend/src/lib.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/llvm-backend/src/lib.rs b/lib/llvm-backend/src/lib.rs index 5029c7cf70b..50b06173160 100644 --- a/lib/llvm-backend/src/lib.rs +++ b/lib/llvm-backend/src/lib.rs @@ -47,10 +47,11 @@ impl Compiler for LLVMCompiler { use wasmer_runtime_core::module::ModuleInfo; struct Placeholder; + impl CacheGen for Placeholder { fn generate_cache( &self, - module: &ModuleInner, + _module: &ModuleInner, ) -> Result<(Box, Box<[u8]>, Memory), CacheError> { unimplemented!() } From 34b4f2fb1139e3cffb0e91c02fc924914cde30a6 Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Fri, 29 Mar 2019 10:09:39 +0100 Subject: [PATCH 12/16] fix(llvm-backend) Mark some variables as unused. --- lib/llvm-backend/src/platform/unix.rs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/lib/llvm-backend/src/platform/unix.rs b/lib/llvm-backend/src/platform/unix.rs index 2664263031d..12894f6bc2a 100644 --- a/lib/llvm-backend/src/platform/unix.rs +++ b/lib/llvm-backend/src/platform/unix.rs @@ -49,24 +49,22 @@ pub unsafe fn install_signal_handler() { SaFlags::SA_ONSTACK | SaFlags::SA_SIGINFO, SigSet::empty(), ); - // sigaction(SIGFPE, &sa).unwrap(); - // sigaction(SIGILL, &sa).unwrap(); sigaction(SIGSEGV, &sa).unwrap(); sigaction(SIGBUS, &sa).unwrap(); } #[cfg_attr(nightly, unwind(allowed))] extern "C" fn signal_trap_handler( - signum: ::nix::libc::c_int, - siginfo: *mut siginfo_t, - ucontext: *mut c_void, + _signum: ::nix::libc::c_int, + _siginfo: *mut siginfo_t, + _ucontext: *mut c_void, ) { unsafe { - /// Apparently, we can unwind from arbitary instructions, as long - /// as we don't need to catch the exception inside the function that - /// was interrupted. - /// - /// This works on macos, not sure about linux. + // Apparently, we can unwind from arbitary instructions, as long + // as we don't need to catch the exception inside the function that + // was interrupted. + // + // This works on macos, not sure about linux. throw_trap(2); } } From 8179dd6f96938131ed3f3fe0638a2bed2ebf62a3 Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Fri, 29 Mar 2019 10:09:56 +0100 Subject: [PATCH 13/16] fix(llvm-backend) Remove `sign_type` from `generate_trampoline`. --- lib/llvm-backend/src/trampolines.rs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/lib/llvm-backend/src/trampolines.rs b/lib/llvm-backend/src/trampolines.rs index 4254180504c..23677618b41 100644 --- a/lib/llvm-backend/src/trampolines.rs +++ b/lib/llvm-backend/src/trampolines.rs @@ -42,20 +42,12 @@ pub fn generate_trampolines( Some(Linkage::External), ); - generate_trampoline( - trampoline_func, - func_type, - sig, - context, - builder, - intrinsics, - ); + generate_trampoline(trampoline_func, sig, context, builder, intrinsics); } } fn generate_trampoline( trampoline_func: FunctionValue, - sig_type: FunctionType, func_sig: &FuncSig, context: &Context, builder: &Builder, From accbe52dd67efd76e29534e09c71572248a97317 Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Fri, 29 Mar 2019 13:42:13 -0700 Subject: [PATCH 14/16] add more stubs for pthreading, exceptions, and some invokes --- lib/emscripten/src/emscripten_target.rs | 49 +++++++++++++++++++++++++ lib/emscripten/src/exception.rs | 9 +++++ lib/emscripten/src/lib.rs | 17 +++++++++ lib/emscripten/src/process.rs | 5 +++ 4 files changed, 80 insertions(+) diff --git a/lib/emscripten/src/emscripten_target.rs b/lib/emscripten/src/emscripten_target.rs index 5e6b927e804..1877cbff1e5 100644 --- a/lib/emscripten/src/emscripten_target.rs +++ b/lib/emscripten/src/emscripten_target.rs @@ -118,6 +118,22 @@ pub fn _pthread_cond_destroy(_ctx: &mut Ctx, _a: i32) -> i32 { debug!("emscripten::_pthread_cond_destroy"); 0 } +pub fn _pthread_getspecific(_ctx: &mut Ctx, _a: i32) -> i32 { + debug!("emscripten::_pthread_getspecific"); + 0 +} +pub fn _pthread_setspecific(_ctx: &mut Ctx, _a: i32, _b: i32) -> i32 { + debug!("emscripten::_pthread_setspecific"); + 0 +} +pub fn _pthread_once(_ctx: &mut Ctx, _a: i32, _b: i32) -> i32 { + debug!("emscripten::_pthread_once"); + 0 +} +pub fn _pthread_key_create(_ctx: &mut Ctx, _a: i32, _b: i32) -> i32 { + debug!("emscripten::_pthread_key_create"); + 0 +} pub fn _pthread_create(_ctx: &mut Ctx, _a: i32, _b: i32, _c: i32, _d: i32) -> i32 { debug!("emscripten::_pthread_create"); 0 @@ -424,6 +440,30 @@ pub fn invoke_viiiiiiiii( panic!("dyn_call_viiiiiiiii is set to None"); } } +pub fn invoke_viiiiiiiiii( + ctx: &mut Ctx, + index: i32, + a1: i32, + a2: i32, + a3: i32, + a4: i32, + a5: i32, + a6: i32, + a7: i32, + a8: i32, + a9: i32, + a10: i32, +) { + debug!("emscripten::invoke_viiiiiiiiii"); + if let Some(dyn_call_viiiiiiiiii) = &get_emscripten_data(ctx).dyn_call_viiiiiiiiii { + dyn_call_viiiiiiiiii + .call(index, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) + .unwrap(); + } else { + panic!("dyn_call_viiiiiiiiii is set to None"); + } +} + pub fn invoke_iiji(ctx: &mut Ctx, index: i32, a1: i32, a2: i32, a3: i32, a4: i32) -> i32 { debug!("emscripten::invoke_iiji"); if let Some(dyn_call_iiji) = &get_emscripten_data(ctx).dyn_call_iiji { @@ -448,6 +488,15 @@ pub fn invoke_ji(ctx: &mut Ctx, index: i32, a1: i32) -> i32 { panic!("dyn_call_ji is set to None"); } } +pub fn invoke_jii(ctx: &mut Ctx, index: i32, a1: i32, a2: i32) -> i32 { + debug!("emscripten::invoke_jii"); + if let Some(dyn_call_jii) = &get_emscripten_data(ctx).dyn_call_jii { + dyn_call_jii.call(index, a1, a2).unwrap() + } else { + panic!("dyn_call_jii is set to None"); + } +} + pub fn invoke_jij(ctx: &mut Ctx, index: i32, a1: i32, a2: i32, a3: i32) -> i32 { debug!("emscripten::invoke_jij"); if let Some(dyn_call_jij) = &get_emscripten_data(ctx).dyn_call_jij { diff --git a/lib/emscripten/src/exception.rs b/lib/emscripten/src/exception.rs index b0aab78dd93..9044aff2a08 100644 --- a/lib/emscripten/src/exception.rs +++ b/lib/emscripten/src/exception.rs @@ -14,3 +14,12 @@ pub fn ___cxa_throw(ctx: &mut Ctx, _ptr: u32, _ty: u32, _destructor: u32) { debug!("emscripten::___cxa_throw"); _abort(ctx); } + +pub fn ___cxa_begin_catch(_ctx: &mut Ctx, _exception_object_ptr: u32) -> i32 { + debug!("emscripten::___cxa_begin_catch"); + -1 +} + +pub fn ___cxa_end_catch(_ctx: &mut Ctx) { + debug!("emscripten::___cxa_end_catch"); +} diff --git a/lib/emscripten/src/lib.rs b/lib/emscripten/src/lib.rs index 4d41cc40d47..b544bdc115d 100644 --- a/lib/emscripten/src/lib.rs +++ b/lib/emscripten/src/lib.rs @@ -104,9 +104,12 @@ pub struct EmscriptenData<'a> { pub dyn_call_viiiiiii: Option>, pub dyn_call_viiiiiiii: Option>, pub dyn_call_viiiiiiiii: Option>, + pub dyn_call_viiiiiiiiii: + Option>, pub dyn_call_iiji: Option>, pub dyn_call_j: Option>, pub dyn_call_ji: Option>, + pub dyn_call_jii: Option>, pub dyn_call_jij: Option>, pub dyn_call_jjj: Option>, pub dyn_call_viiij: Option>, @@ -160,9 +163,11 @@ impl<'a> EmscriptenData<'a> { let dyn_call_viiiiiii = instance.func("dynCall_viiiiiii").ok(); let dyn_call_viiiiiiii = instance.func("dynCall_viiiiiiii").ok(); let dyn_call_viiiiiiiii = instance.func("dynCall_viiiiiiiii").ok(); + let dyn_call_viiiiiiiiii = instance.func("dynCall_viiiiiiiiii").ok(); let dyn_call_iiji = instance.func("dynCall_iiji").ok(); let dyn_call_j = instance.func("dynCall_j").ok(); let dyn_call_ji = instance.func("dynCall_ji").ok(); + let dyn_call_jii = instance.func("dynCall_jii").ok(); let dyn_call_jij = instance.func("dynCall_jij").ok(); let dyn_call_jjj = instance.func("dynCall_jjj").ok(); let dyn_call_viiij = instance.func("dynCall_viiij").ok(); @@ -209,9 +214,11 @@ impl<'a> EmscriptenData<'a> { dyn_call_viiiiiii, dyn_call_viiiiiiii, dyn_call_viiiiiiiii, + dyn_call_viiiiiiiiii, dyn_call_iiji, dyn_call_j, dyn_call_ji, + dyn_call_jii, dyn_call_jij, dyn_call_jjj, dyn_call_viiij, @@ -562,6 +569,7 @@ pub fn generate_emscripten_env(globals: &mut EmscriptenGlobals) -> ImportObject "_kill" => func!(crate::process::_kill), "_llvm_stackrestore" => func!(crate::process::_llvm_stackrestore), "_llvm_stacksave" => func!(crate::process::_llvm_stacksave), + "_llvm_eh_typeid_for" => func!(crate::process::_llvm_eh_typeid_for), "_raise" => func!(crate::process::_raise), "_sem_init" => func!(crate::process::_sem_init), "_sem_post" => func!(crate::process::_sem_post), @@ -597,6 +605,8 @@ pub fn generate_emscripten_env(globals: &mut EmscriptenGlobals) -> ImportObject // Exception "___cxa_allocate_exception" => func!(crate::exception::___cxa_allocate_exception), "___cxa_throw" => func!(crate::exception::___cxa_throw), + "___cxa_begin_catch" => func!(crate::exception::___cxa_begin_catch), + "___cxa_end_catch" => func!(crate::exception::___cxa_end_catch), // Time "_gettimeofday" => func!(crate::time::_gettimeofday), @@ -675,6 +685,10 @@ pub fn generate_emscripten_env(globals: &mut EmscriptenGlobals) -> ImportObject "_pthread_rwlock_rdlock" => func!(crate::emscripten_target::_pthread_rwlock_rdlock), "_pthread_rwlock_unlock" => func!(crate::emscripten_target::_pthread_rwlock_unlock), "_pthread_setcancelstate" => func!(crate::emscripten_target::_pthread_setcancelstate), + "_pthread_getspecific" => func!(crate::emscripten_target::_pthread_getspecific), + "_pthread_setspecific" => func!(crate::emscripten_target::_pthread_setspecific), + "_pthread_once" => func!(crate::emscripten_target::_pthread_once), + "_pthread_key_create" => func!(crate::emscripten_target::_pthread_key_create), "___gxx_personality_v0" => func!(crate::emscripten_target::___gxx_personality_v0), "_getdtablesize" => func!(crate::emscripten_target::_getdtablesize), "_gethostbyaddr" => func!(crate::emscripten_target::_gethostbyaddr), @@ -693,9 +707,12 @@ pub fn generate_emscripten_env(globals: &mut EmscriptenGlobals) -> ImportObject "invoke_viiiiiii" => func!(crate::emscripten_target::invoke_viiiiiii), "invoke_viiiiiiii" => func!(crate::emscripten_target::invoke_viiiiiiii), "invoke_viiiiiiiii" => func!(crate::emscripten_target::invoke_viiiiiiiii), + "invoke_viiiiiiiii" => func!(crate::emscripten_target::invoke_viiiiiiiii), + "invoke_viiiiiiiiii" => func!(crate::emscripten_target::invoke_viiiiiiiiii), "invoke_iiji" => func!(crate::emscripten_target::invoke_iiji), "invoke_j" => func!(crate::emscripten_target::invoke_j), "invoke_ji" => func!(crate::emscripten_target::invoke_ji), + "invoke_jii" => func!(crate::emscripten_target::invoke_jii), "invoke_jij" => func!(crate::emscripten_target::invoke_jij), "invoke_jjj" => func!(crate::emscripten_target::invoke_jjj), "invoke_viiij" => func!(crate::emscripten_target::invoke_viiij), diff --git a/lib/emscripten/src/process.rs b/lib/emscripten/src/process.rs index ce47502e757..4c6e33e7027 100644 --- a/lib/emscripten/src/process.rs +++ b/lib/emscripten/src/process.rs @@ -150,6 +150,11 @@ pub fn _llvm_trap(ctx: &mut Ctx) { abort_with_message(ctx, "abort!"); } +pub fn _llvm_eh_typeid_for(_ctx: &mut Ctx, _type_info_addr: u32) -> i32 { + debug!("emscripten::_llvm_eh_typeid_for"); + -1 +} + pub fn _system(_ctx: &mut Ctx, _one: i32) -> c_int { debug!("emscripten::_system"); // TODO: May need to change this Em impl to a working version From ee60d47f5cd8d330319ba27da7408cbd5b6902f5 Mon Sep 17 00:00:00 2001 From: Mateusz Piotrowski <0mp@FreeBSD.org> Date: Mon, 1 Apr 2019 09:48:32 +0200 Subject: [PATCH 15/16] Add FreeBSD installation instructions for CMake --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 2a97592ed37..35838e4f168 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,7 @@ Please select your operating system: - [macOS](#macos) - [Debian-based Linuxes](#debian-based-linuxes) +- [FreeBSD](#freebsd) - [Microsoft Windows](#windows-msvc) #### macOS @@ -92,6 +93,12 @@ sudo port install cmake sudo apt install cmake ``` +#### FreeBSD + +```sh +pkg install cmake +``` + #### Windows (MSVC) Windows support is _highly experimental_. Only simple Wasm programs may be run, and no syscalls are allowed. This means From 1ff6ed6d1bf002774a4311aaf3b6565d5561f36a Mon Sep 17 00:00:00 2001 From: Brandon Fish Date: Tue, 2 Apr 2019 22:10:49 -0500 Subject: [PATCH 16/16] Add Export and GlobalDescriptor to Runtime API --- lib/runtime-core/src/types.rs | 1 + lib/runtime/src/lib.rs | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/runtime-core/src/types.rs b/lib/runtime-core/src/types.rs index 9ee5270dd73..53b4f0c06d8 100644 --- a/lib/runtime-core/src/types.rs +++ b/lib/runtime-core/src/types.rs @@ -207,6 +207,7 @@ pub enum Initializer { GetGlobal(ImportedGlobalIndex), } +/// Describes the mutability and type of a Global #[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)] pub struct GlobalDescriptor { pub mutable: bool, diff --git a/lib/runtime/src/lib.rs b/lib/runtime/src/lib.rs index 66d9c6acecd..a45faddc1c7 100644 --- a/lib/runtime/src/lib.rs +++ b/lib/runtime/src/lib.rs @@ -74,6 +74,7 @@ //! [`wasmer-clif-backend`]: https://crates.io/crates/wasmer-clif-backend //! [`compile_with`]: fn.compile_with.html +pub use wasmer_runtime_core::export::Export; pub use wasmer_runtime_core::global::Global; pub use wasmer_runtime_core::import::ImportObject; pub use wasmer_runtime_core::instance::{DynFunc, Instance}; @@ -95,7 +96,9 @@ pub mod wasm { //! Various types exposed by the Wasmer Runtime. pub use wasmer_runtime_core::global::Global; pub use wasmer_runtime_core::table::Table; - pub use wasmer_runtime_core::types::{FuncSig, MemoryDescriptor, TableDescriptor, Type, Value}; + pub use wasmer_runtime_core::types::{ + FuncSig, GlobalDescriptor, MemoryDescriptor, TableDescriptor, Type, Value, + }; } pub mod error {