Implement cross-instance indirect calls.

This commit is contained in:
Dan Gohman
2019-01-03 08:31:03 -08:00
parent b646f9b4e0
commit 087b5b4dff
7 changed files with 51 additions and 46 deletions

View File

@@ -5,11 +5,11 @@ use cranelift_entity::EntityRef;
use cranelift_entity::{BoxedSlice, PrimaryMap};
use cranelift_wasm::{
DefinedFuncIndex, DefinedGlobalIndex, DefinedMemoryIndex, DefinedTableIndex, GlobalInit,
SignatureIndex,
};
use export::Export;
use imports::Imports;
use memory::LinearMemory;
use sig_registry::SignatureRegistry;
use signalhandlers::{wasmtime_init_eager, wasmtime_init_finish};
use std::rc::Rc;
use std::slice;
@@ -18,7 +18,7 @@ use table::Table;
use traphandlers::wasmtime_call;
use vmcontext::{
VMCallerCheckedAnyfunc, VMContext, VMFunctionBody, VMGlobalDefinition, VMMemoryDefinition,
VMTableDefinition,
VMSharedSignatureIndex, VMTableDefinition,
};
use wasmtime_environ::{DataInitializer, Module};
@@ -38,8 +38,7 @@ pub struct Instance {
tables: BoxedSlice<DefinedTableIndex, Table>,
/// Function Signature IDs.
/// FIXME: This should be shared across instances rather than per-Instance.
sig_registry: SignatureRegistry,
vmshared_signatures: BoxedSlice<SignatureIndex, VMSharedSignatureIndex>,
/// Resolved imports.
vmctx_imports: Imports,
@@ -67,8 +66,8 @@ impl Instance {
finished_functions: BoxedSlice<DefinedFuncIndex, *const VMFunctionBody>,
mut vmctx_imports: Imports,
data_initializers: &[DataInitializer],
mut vmshared_signatures: BoxedSlice<SignatureIndex, VMSharedSignatureIndex>,
) -> Result<Box<Self>, InstantiationError> {
let mut sig_registry = create_and_initialize_signatures(&module);
let mut tables = create_tables(&module);
let mut memories = create_memories(&module)?;
@@ -102,13 +101,14 @@ impl Instance {
let vmctx_tables_ptr = vmctx_tables.values_mut().into_slice().as_mut_ptr();
let vmctx_memories_ptr = vmctx_memories.values_mut().into_slice().as_mut_ptr();
let vmctx_globals_ptr = vmctx_globals.values_mut().into_slice().as_mut_ptr();
let vmctx_shared_signatures_ptr = sig_registry.vmshared_signatures();
let vmctx_shared_signatures_ptr =
vmshared_signatures.values_mut().into_slice().as_mut_ptr();
let mut result = Box::new(Self {
module,
memories,
tables,
sig_registry,
vmshared_signatures,
vmctx_imports,
finished_functions,
vmctx_tables,
@@ -399,14 +399,6 @@ fn check_memory_init_bounds(
Ok(())
}
fn create_and_initialize_signatures(module: &Module) -> SignatureRegistry {
let mut sig_registry = SignatureRegistry::new();
for (sig_index, sig) in module.signatures.iter() {
sig_registry.register(sig_index, sig);
}
sig_registry
}
/// Allocate memory for just the tables of the current module.
fn create_tables(module: &Module) -> BoxedSlice<DefinedTableIndex, Table> {
let num_imports = module.imported_tables.len();
@@ -453,7 +445,7 @@ fn initialize_tables(instance: &mut Instance) -> Result<(), InstantiationError>
let imported_func = &instance.vmctx_imports.functions[*func_idx];
(imported_func.body, imported_func.vmctx)
};
let type_index = instance.sig_registry.lookup(callee_sig);
let type_index = instance.vmshared_signatures[callee_sig];
subslice[i] = VMCallerCheckedAnyfunc {
func_ptr: callee_ptr,
type_index,