Skip to content

Commit

Permalink
Support imports in wasm2obj
Browse files Browse the repository at this point in the history
  • Loading branch information
yurydelendik authored and sunfishcode committed Apr 3, 2019
1 parent cc5efeb commit 474809f
Showing 1 changed file with 36 additions and 1 deletion.
37 changes: 36 additions & 1 deletion wasmtime-obj/src/function.rs
Expand Up @@ -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());
Expand Down Expand Up @@ -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),
};
}
}
Expand Down

0 comments on commit 474809f

Please sign in to comment.