Browse Source

Support imports in wasm2obj

pull/100/head
Yury Delendik 6 years ago
committed by Dan Gohman
parent
commit
474809f5f3
  1. 37
      wasmtime-obj/src/function.rs

37
wasmtime-obj/src/function.rs

@ -4,12 +4,36 @@ use cranelift_entity::EntityRef;
use faerie::{Artifact, Decl, Link}; use faerie::{Artifact, Decl, Link};
use wasmtime_environ::{Compilation, Module, RelocationTarget, Relocations}; 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 /// Defines module functions
pub fn declare_functions( pub fn declare_functions(
obj: &mut Artifact, obj: &mut Artifact,
module: &Module, module: &Module,
relocations: &Relocations, relocations: &Relocations,
) -> Result<(), String> { ) -> 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() { for (i, _function_relocs) in relocations.iter().rev() {
let func_index = module.func_index(i); let func_index = module.func_index(i);
let string_name = format!("_wasm_function_{}", func_index.index()); let string_name = format!("_wasm_function_{}", func_index.index());
@ -61,7 +85,18 @@ pub fn emit_functions(
}) })
.map_err(|err| format!("{}", err))?; .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),
}; };
} }
} }

Loading…
Cancel
Save