wasmtime: Initial, partial support for externref
This is enough to get an `externref -> externref` identity function passing. However, `externref`s that are dropped by compiled Wasm code are (safely) leaked. Follow up work will leverage cranelift's stack maps to resolve this issue.
This commit is contained in:
@@ -149,8 +149,10 @@ impl Compiler {
|
||||
let mut cx = FunctionBuilderContext::new();
|
||||
let mut trampolines = HashMap::new();
|
||||
let mut trampoline_relocations = HashMap::new();
|
||||
for sig in translation.module.local.signatures.values() {
|
||||
let index = self.signatures.register(sig);
|
||||
for (wasm_func_ty, native_sig) in translation.module.local.signatures.values() {
|
||||
let index = self
|
||||
.signatures
|
||||
.register(wasm_func_ty.clone(), native_sig.clone());
|
||||
if trampolines.contains_key(&index) {
|
||||
continue;
|
||||
}
|
||||
@@ -158,7 +160,7 @@ impl Compiler {
|
||||
&*self.isa,
|
||||
&mut self.code_memory,
|
||||
&mut cx,
|
||||
sig,
|
||||
native_sig,
|
||||
std::mem::size_of::<u128>(),
|
||||
)?;
|
||||
trampolines.insert(index, trampoline);
|
||||
@@ -167,7 +169,7 @@ impl Compiler {
|
||||
// show up be sure to log it in case anyone's listening and there's
|
||||
// an accidental bug.
|
||||
if relocations.len() > 0 {
|
||||
log::info!("relocations found in trampoline for {:?}", sig);
|
||||
log::info!("relocations found in trampoline for {:?}", native_sig);
|
||||
trampoline_relocations.insert(index, relocations);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,8 +31,8 @@ pub fn resolve_imports(
|
||||
|
||||
match (import, &export) {
|
||||
(EntityIndex::Function(func_index), Some(Export::Function(f))) => {
|
||||
let import_signature = module.local.func_signature(*func_index);
|
||||
let signature = signatures.lookup(f.signature).unwrap();
|
||||
let import_signature = module.local.native_func_signature(*func_index);
|
||||
let signature = signatures.lookup_native(f.signature).unwrap();
|
||||
if signature != *import_signature {
|
||||
// TODO: If the difference is in the calling convention,
|
||||
// we could emit a wrapper function to fix it up.
|
||||
|
||||
@@ -93,7 +93,7 @@ impl<'data> RawCompiledModule<'data> {
|
||||
.local
|
||||
.signatures
|
||||
.values()
|
||||
.map(|sig| signature_registry.register(sig))
|
||||
.map(|(wasm, native)| signature_registry.register(wasm.clone(), native.clone()))
|
||||
.collect::<PrimaryMap<_, _>>()
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user