From 474809f5f3a4dd4975c5ff620ff1ab6af5adeac6 Mon Sep 17 00:00:00 2001 From: Yury Delendik Date: Tue, 2 Apr 2019 16:30:30 -0500 Subject: [PATCH] Support imports in wasm2obj --- wasmtime-obj/src/function.rs | 37 +++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/wasmtime-obj/src/function.rs b/wasmtime-obj/src/function.rs index 246c5d6459..49bd57ce65 100644 --- a/wasmtime-obj/src/function.rs +++ b/wasmtime-obj/src/function.rs @@ -4,12 +4,36 @@ use cranelift_entity::EntityRef; use faerie::{Artifact, Decl, Link}; use wasmtime_environ::{Compilation, Module, RelocationTarget, Relocations}; +fn get_reloc_target_special_import_name(target: RelocationTarget) -> Option<&'static str> { + Some(match target { + RelocationTarget::Memory32Grow => &"wasmtime_memory32_grow", + RelocationTarget::ImportedMemory32Grow => &"wasmtime_memory32_grow", + RelocationTarget::Memory32Size => &"wasmtime_memory32_size", + RelocationTarget::ImportedMemory32Size => &"wasmtime_imported_memory32_size", + _ => return None, + }) +} + /// Defines module functions pub fn declare_functions( obj: &mut Artifact, module: &Module, relocations: &Relocations, ) -> Result<(), String> { + for i in 0..module.imported_funcs.len() { + let string_name = format!("_wasm_function_{}", i); + obj.declare(string_name, Decl::function_import()) + .map_err(|err| format!("{}", err))?; + } + for (_, function_relocs) in relocations.iter() { + for r in function_relocs { + let special_import_name = get_reloc_target_special_import_name(r.reloc_target); + if let Some(special_import_name) = special_import_name { + obj.declare(special_import_name, Decl::function_import()) + .map_err(|err| format!("{}", err))?; + } + } + } for (i, _function_relocs) in relocations.iter().rev() { let func_index = module.func_index(i); let string_name = format!("_wasm_function_{}", func_index.index()); @@ -61,7 +85,18 @@ pub fn emit_functions( }) .map_err(|err| format!("{}", err))?; } - _ => panic!("relocations target not supported yet"), + RelocationTarget::Memory32Grow + | RelocationTarget::ImportedMemory32Grow + | RelocationTarget::Memory32Size + | RelocationTarget::ImportedMemory32Size => { + obj.link(Link { + from: &string_name, + to: get_reloc_target_special_import_name(r.reloc_target).expect("name"), + at: r.offset as u64, + }) + .map_err(|err| format!("{}", err))?; + } + _ => panic!("relocations target not supported yet: {:?}", r.reloc_target), }; } }