More code reorganization and cleanups.
This commit is contained in:
@@ -18,9 +18,6 @@ path = "src/wasm2obj.rs"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
cranelift-codegen = "0.18.1"
|
cranelift-codegen = "0.18.1"
|
||||||
cranelift-frontend = "0.18.1"
|
|
||||||
cranelift-reader = "0.18.1"
|
|
||||||
cranelift-wasm = "0.18.1"
|
|
||||||
cranelift-native = "0.18.1"
|
cranelift-native = "0.18.1"
|
||||||
wasmtime-runtime = { path = "lib/runtime" }
|
wasmtime-runtime = { path = "lib/runtime" }
|
||||||
wasmtime-execute = { path = "lib/execute" }
|
wasmtime-execute = { path = "lib/execute" }
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
doc-valid-idents = [ "WebAssembly", "NaN" ]
|
doc-valid-idents = [ "WebAssembly" ]
|
||||||
|
|||||||
@@ -24,11 +24,10 @@ fuzz_target!(|data: &[u8]| {
|
|||||||
let isa = isa_builder.finish(settings::Flags::new(flag_builder));
|
let isa = isa_builder.finish(settings::Flags::new(flag_builder));
|
||||||
let mut module = Module::new();
|
let mut module = Module::new();
|
||||||
let mut runtime = ModuleEnvironment::new(&*isa, &mut module);
|
let mut runtime = ModuleEnvironment::new(&*isa, &mut module);
|
||||||
match translate_module(&data, &mut runtime) {
|
let translation = match translate_module(&data, &mut runtime) {
|
||||||
Ok(()) => (),
|
Ok(()) => (),
|
||||||
Err(_) => return,
|
Err(_) => return,
|
||||||
};
|
};
|
||||||
let translation = runtime.finish_translation();
|
|
||||||
let _exec = match wasmtime_execute::compile_module(&*isa, &translation) {
|
let _exec = match wasmtime_execute::compile_module(&*isa, &translation) {
|
||||||
Ok(x) => x,
|
Ok(x) => x,
|
||||||
Err(_) => return,
|
Err(_) => return,
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ fn relocate(compilation: &mut Compilation, relocations: &[Vec<Relocation>]) {
|
|||||||
match r.reloc {
|
match r.reloc {
|
||||||
Reloc::Abs8 => unsafe {
|
Reloc::Abs8 => unsafe {
|
||||||
let reloc_address = body.as_mut_ptr().offset(r.offset as isize) as i64;
|
let reloc_address = body.as_mut_ptr().offset(r.offset as isize) as i64;
|
||||||
let reloc_addend = r.addend as i64;
|
let reloc_addend = r.addend;
|
||||||
let reloc_abs = target_func_address as i64 + reloc_addend;
|
let reloc_abs = target_func_address as i64 + reloc_addend;
|
||||||
write_unaligned(reloc_address as *mut i64, reloc_abs);
|
write_unaligned(reloc_address as *mut i64, reloc_abs);
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,6 +1,16 @@
|
|||||||
//! JIT-style runtime for WebAssembly using Cranelift.
|
//! JIT-style runtime for WebAssembly using Cranelift.
|
||||||
|
|
||||||
#![deny(missing_docs)]
|
#![deny(missing_docs, trivial_numeric_casts, unused_extern_crates, unstable_features)]
|
||||||
|
#![warn(unused_import_braces)]
|
||||||
|
#![cfg_attr(feature = "clippy", plugin(clippy(conf_file = "../../clippy.toml")))]
|
||||||
|
#![cfg_attr(feature = "cargo-clippy", allow(new_without_default, new_without_default_derive))]
|
||||||
|
#![cfg_attr(
|
||||||
|
feature = "cargo-clippy",
|
||||||
|
warn(
|
||||||
|
float_arithmetic, mut_mut, nonminimal_bool, option_map_unwrap_or, option_map_unwrap_or_else,
|
||||||
|
print_stdout, unicode_not_nfc, use_self
|
||||||
|
)
|
||||||
|
)]
|
||||||
|
|
||||||
extern crate cranelift_codegen;
|
extern crate cranelift_codegen;
|
||||||
extern crate cranelift_wasm;
|
extern crate cranelift_wasm;
|
||||||
|
|||||||
@@ -7,6 +7,5 @@ license = "Apache-2.0 WITH LLVM-exception"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
cranelift-codegen = "0.18.1"
|
cranelift-codegen = "0.18.1"
|
||||||
cranelift-wasm = "0.18.1"
|
|
||||||
wasmtime-runtime = { path = "../runtime" }
|
wasmtime-runtime = { path = "../runtime" }
|
||||||
faerie = "0.4.4"
|
faerie = "0.4.4"
|
||||||
|
|||||||
@@ -1,5 +1,18 @@
|
|||||||
|
//! Object-file writing library using the wasmtime runtime.
|
||||||
|
|
||||||
|
#![deny(missing_docs, trivial_numeric_casts, unused_extern_crates, unstable_features)]
|
||||||
|
#![warn(unused_import_braces)]
|
||||||
|
#![cfg_attr(feature = "clippy", plugin(clippy(conf_file = "../../clippy.toml")))]
|
||||||
|
#![cfg_attr(feature = "cargo-clippy", allow(new_without_default, new_without_default_derive))]
|
||||||
|
#![cfg_attr(
|
||||||
|
feature = "cargo-clippy",
|
||||||
|
warn(
|
||||||
|
float_arithmetic, mut_mut, nonminimal_bool, option_map_unwrap_or, option_map_unwrap_or_else,
|
||||||
|
print_stdout, unicode_not_nfc, use_self
|
||||||
|
)
|
||||||
|
)]
|
||||||
|
|
||||||
extern crate cranelift_codegen;
|
extern crate cranelift_codegen;
|
||||||
extern crate cranelift_wasm;
|
|
||||||
extern crate faerie;
|
extern crate faerie;
|
||||||
extern crate wasmtime_runtime;
|
extern crate wasmtime_runtime;
|
||||||
|
|
||||||
|
|||||||
@@ -71,8 +71,8 @@ impl binemit::RelocSink for RelocSink {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl RelocSink {
|
impl RelocSink {
|
||||||
fn new() -> RelocSink {
|
fn new() -> Self {
|
||||||
RelocSink {
|
Self {
|
||||||
func_relocs: Vec::new(),
|
func_relocs: Vec::new(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,10 +8,9 @@ use cranelift_codegen::ir::{
|
|||||||
};
|
};
|
||||||
use cranelift_codegen::isa;
|
use cranelift_codegen::isa;
|
||||||
use cranelift_codegen::settings;
|
use cranelift_codegen::settings;
|
||||||
use cranelift_wasm;
|
|
||||||
use cranelift_wasm::{
|
use cranelift_wasm::{
|
||||||
FunctionIndex, Global, GlobalIndex, GlobalVariable, Memory, MemoryIndex, SignatureIndex, Table,
|
self, FunctionIndex, Global, GlobalIndex, GlobalVariable, Memory, MemoryIndex, SignatureIndex, Table,
|
||||||
TableIndex, WasmResult,
|
TableIndex, WasmResult, translate_module,
|
||||||
};
|
};
|
||||||
use module::{DataInitializer, Export, LazyContents, Module, TableElements};
|
use module::{DataInitializer, Export, LazyContents, Module, TableElements};
|
||||||
use target_lexicon::Triple;
|
use target_lexicon::Triple;
|
||||||
@@ -23,7 +22,7 @@ pub fn get_func_name(func_index: FunctionIndex) -> ir::ExternalName {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Object containing the standalone runtime information. To be passed after creation as argument
|
/// Object containing the standalone runtime information. To be passed after creation as argument
|
||||||
/// to `cranelift_wasm::translatemodule`.
|
/// to `compile_module`.
|
||||||
pub struct ModuleEnvironment<'data, 'module> {
|
pub struct ModuleEnvironment<'data, 'module> {
|
||||||
/// Compilation setting flags.
|
/// Compilation setting flags.
|
||||||
pub isa: &'module isa::TargetIsa,
|
pub isa: &'module isa::TargetIsa,
|
||||||
@@ -54,16 +53,18 @@ impl<'data, 'module> ModuleEnvironment<'data, 'module> {
|
|||||||
self.func_env().pointer_type()
|
self.func_env().pointer_type()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Declare that translation of the module is complete. This consumes the
|
/// Translate the given wasm module data using this environment. This consumes the
|
||||||
/// `ModuleEnvironment` with its mutable reference to the `Module` and
|
/// `ModuleEnvironment` with its mutable reference to the `Module` and produces a
|
||||||
/// produces a `ModuleTranslation` with an immutable reference to the
|
/// `ModuleTranslation` with an immutable reference to the `Module` (which has
|
||||||
/// `Module`.
|
/// become fully populated).
|
||||||
pub fn finish_translation(self) -> ModuleTranslation<'data, 'module> {
|
pub fn translate(mut self, data: &'data [u8]) -> WasmResult<ModuleTranslation<'data, 'module>> {
|
||||||
ModuleTranslation {
|
translate_module(data, &mut self)?;
|
||||||
|
|
||||||
|
Ok(ModuleTranslation {
|
||||||
isa: self.isa,
|
isa: self.isa,
|
||||||
module: self.module,
|
module: self.module,
|
||||||
lazy: self.lazy,
|
lazy: self.lazy,
|
||||||
}
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -117,7 +118,7 @@ impl<'module_environment> FuncEnvironment<'module_environment> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// This trait is useful for
|
/// This trait is useful for
|
||||||
/// `cranelift_wasm::translatemodule` because it
|
/// `cranelift_wasm::translate_module` because it
|
||||||
/// tells how to translate runtime-dependent wasm instructions. These functions should not be
|
/// tells how to translate runtime-dependent wasm instructions. These functions should not be
|
||||||
/// called by the user.
|
/// called by the user.
|
||||||
impl<'data, 'module> cranelift_wasm::ModuleEnvironment<'data>
|
impl<'data, 'module> cranelift_wasm::ModuleEnvironment<'data>
|
||||||
@@ -176,7 +177,7 @@ impl<'data, 'module> cranelift_wasm::ModuleEnvironment<'data>
|
|||||||
self.module.globals.push(global);
|
self.module.globals.push(global);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_global(&self, global_index: GlobalIndex) -> &cranelift_wasm::Global {
|
fn get_global(&self, global_index: GlobalIndex) -> &Global {
|
||||||
&self.module.globals[global_index]
|
&self.module.globals[global_index]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -273,7 +274,7 @@ impl<'module_environment> cranelift_wasm::FuncEnvironment for FuncEnvironment<'m
|
|||||||
self.globals_base = Some(new_base);
|
self.globals_base = Some(new_base);
|
||||||
new_base
|
new_base
|
||||||
});
|
});
|
||||||
let offset = index as usize * pointer_bytes;
|
let offset = index * pointer_bytes;
|
||||||
let offset32 = offset as i32;
|
let offset32 = offset as i32;
|
||||||
debug_assert_eq!(offset32 as usize, offset);
|
debug_assert_eq!(offset32 as usize, offset);
|
||||||
let gv = func.create_global_value(ir::GlobalValueData::Deref {
|
let gv = func.create_global_value(ir::GlobalValueData::Deref {
|
||||||
@@ -295,7 +296,7 @@ impl<'module_environment> cranelift_wasm::FuncEnvironment for FuncEnvironment<'m
|
|||||||
self.globals_base = Some(new_base);
|
self.globals_base = Some(new_base);
|
||||||
new_base
|
new_base
|
||||||
});
|
});
|
||||||
let offset = index as usize * pointer_bytes;
|
let offset = index * pointer_bytes;
|
||||||
let offset32 = offset as i32;
|
let offset32 = offset as i32;
|
||||||
debug_assert_eq!(offset32 as usize, offset);
|
debug_assert_eq!(offset32 as usize, offset);
|
||||||
let heap_base_addr = func.create_global_value(ir::GlobalValueData::Deref {
|
let heap_base_addr = func.create_global_value(ir::GlobalValueData::Deref {
|
||||||
|
|||||||
@@ -3,7 +3,17 @@
|
|||||||
//! the translation the base addresses of regions of memory that will hold the globals, tables and
|
//! the translation the base addresses of regions of memory that will hold the globals, tables and
|
||||||
//! linear memories.
|
//! linear memories.
|
||||||
|
|
||||||
#![deny(missing_docs)]
|
#![deny(missing_docs, trivial_numeric_casts, unused_extern_crates, unstable_features)]
|
||||||
|
#![warn(unused_import_braces)]
|
||||||
|
#![cfg_attr(feature = "clippy", plugin(clippy(conf_file = "../../clippy.toml")))]
|
||||||
|
#![cfg_attr(feature = "cargo-clippy", allow(new_without_default, new_without_default_derive))]
|
||||||
|
#![cfg_attr(
|
||||||
|
feature = "cargo-clippy",
|
||||||
|
warn(
|
||||||
|
float_arithmetic, mut_mut, nonminimal_bool, option_map_unwrap_or, option_map_unwrap_or_else,
|
||||||
|
print_stdout, unicode_not_nfc, use_self
|
||||||
|
)
|
||||||
|
)]
|
||||||
|
|
||||||
extern crate cranelift_codegen;
|
extern crate cranelift_codegen;
|
||||||
extern crate cranelift_wasm;
|
extern crate cranelift_wasm;
|
||||||
|
|||||||
19
src/main.rs
19
src/main.rs
@@ -5,9 +5,20 @@
|
|||||||
//! IL. Can also executes the `start` function of the module by laying out the memories, globals
|
//! IL. Can also executes the `start` function of the module by laying out the memories, globals
|
||||||
//! and tables, then emitting the translated code with hardcoded addresses to memory.
|
//! and tables, then emitting the translated code with hardcoded addresses to memory.
|
||||||
|
|
||||||
|
#![deny(missing_docs, trivial_numeric_casts, unused_extern_crates, unstable_features)]
|
||||||
|
#![warn(unused_import_braces)]
|
||||||
|
#![cfg_attr(feature = "clippy", plugin(clippy(conf_file = "../../clippy.toml")))]
|
||||||
|
#![cfg_attr(feature = "cargo-clippy", allow(new_without_default, new_without_default_derive))]
|
||||||
|
#![cfg_attr(
|
||||||
|
feature = "cargo-clippy",
|
||||||
|
warn(
|
||||||
|
float_arithmetic, mut_mut, nonminimal_bool, option_map_unwrap_or, option_map_unwrap_or_else,
|
||||||
|
unicode_not_nfc, use_self
|
||||||
|
)
|
||||||
|
)]
|
||||||
|
|
||||||
extern crate cranelift_codegen;
|
extern crate cranelift_codegen;
|
||||||
extern crate cranelift_native;
|
extern crate cranelift_native;
|
||||||
extern crate cranelift_wasm;
|
|
||||||
extern crate docopt;
|
extern crate docopt;
|
||||||
extern crate wasmtime_execute;
|
extern crate wasmtime_execute;
|
||||||
extern crate wasmtime_runtime;
|
extern crate wasmtime_runtime;
|
||||||
@@ -18,7 +29,6 @@ extern crate tempdir;
|
|||||||
use cranelift_codegen::isa::TargetIsa;
|
use cranelift_codegen::isa::TargetIsa;
|
||||||
use cranelift_codegen::settings;
|
use cranelift_codegen::settings;
|
||||||
use cranelift_codegen::settings::Configurable;
|
use cranelift_codegen::settings::Configurable;
|
||||||
use cranelift_wasm::translate_module;
|
|
||||||
use docopt::Docopt;
|
use docopt::Docopt;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
@@ -119,9 +129,8 @@ fn handle_module(args: &Args, path: PathBuf, isa: &TargetIsa) -> Result<(), Stri
|
|||||||
data = read_to_end(file_path).map_err(|err| String::from(err.description()))?;
|
data = read_to_end(file_path).map_err(|err| String::from(err.description()))?;
|
||||||
}
|
}
|
||||||
let mut module = Module::new();
|
let mut module = Module::new();
|
||||||
let mut environ = ModuleEnvironment::new(isa, &mut module);
|
let environ = ModuleEnvironment::new(isa, &mut module);
|
||||||
translate_module(&data, &mut environ).map_err(|e| e.to_string())?;
|
let translation = environ.translate(&data).map_err(|e| e.to_string())?;
|
||||||
let translation = environ.finish_translation();
|
|
||||||
let instance = match compile_and_link_module(isa, &translation) {
|
let instance = match compile_and_link_module(isa, &translation) {
|
||||||
Ok(compilation) => {
|
Ok(compilation) => {
|
||||||
let mut instance =
|
let mut instance =
|
||||||
|
|||||||
@@ -4,9 +4,20 @@
|
|||||||
//! IL, then translates it to native code, and writes it out to a native
|
//! IL, then translates it to native code, and writes it out to a native
|
||||||
//! object file with relocations.
|
//! object file with relocations.
|
||||||
|
|
||||||
|
#![deny(missing_docs, trivial_numeric_casts, unused_extern_crates, unstable_features)]
|
||||||
|
#![warn(unused_import_braces)]
|
||||||
|
#![cfg_attr(feature = "clippy", plugin(clippy(conf_file = "../../clippy.toml")))]
|
||||||
|
#![cfg_attr(feature = "cargo-clippy", allow(new_without_default, new_without_default_derive))]
|
||||||
|
#![cfg_attr(
|
||||||
|
feature = "cargo-clippy",
|
||||||
|
warn(
|
||||||
|
float_arithmetic, mut_mut, nonminimal_bool, option_map_unwrap_or, option_map_unwrap_or_else,
|
||||||
|
unicode_not_nfc, use_self
|
||||||
|
)
|
||||||
|
)]
|
||||||
|
|
||||||
extern crate cranelift_codegen;
|
extern crate cranelift_codegen;
|
||||||
extern crate cranelift_native;
|
extern crate cranelift_native;
|
||||||
extern crate cranelift_wasm;
|
|
||||||
extern crate docopt;
|
extern crate docopt;
|
||||||
extern crate wasmtime_obj;
|
extern crate wasmtime_obj;
|
||||||
extern crate wasmtime_runtime;
|
extern crate wasmtime_runtime;
|
||||||
@@ -15,7 +26,6 @@ extern crate serde_derive;
|
|||||||
extern crate faerie;
|
extern crate faerie;
|
||||||
|
|
||||||
use cranelift_codegen::settings;
|
use cranelift_codegen::settings;
|
||||||
use cranelift_wasm::translate_module;
|
|
||||||
use docopt::Docopt;
|
use docopt::Docopt;
|
||||||
use faerie::Artifact;
|
use faerie::Artifact;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
@@ -91,21 +101,19 @@ fn handle_module(path: PathBuf, output: &str) -> Result<(), String> {
|
|||||||
});
|
});
|
||||||
let isa = isa_builder.finish(settings::Flags::new(flag_builder));
|
let isa = isa_builder.finish(settings::Flags::new(flag_builder));
|
||||||
|
|
||||||
let mut module = wasmtime_runtime::Module::new();
|
|
||||||
let mut environ = wasmtime_runtime::ModuleEnvironment::new(&*isa, &mut module);
|
|
||||||
translate_module(&data, &mut environ).map_err(|e| e.to_string())?;
|
|
||||||
|
|
||||||
let mut obj = Artifact::new(isa.triple().clone(), String::from(output));
|
let mut obj = Artifact::new(isa.triple().clone(), String::from(output));
|
||||||
|
|
||||||
|
let mut module = wasmtime_runtime::Module::new();
|
||||||
|
let environ = wasmtime_runtime::ModuleEnvironment::new(&*isa, &mut module);
|
||||||
|
let translation = environ.translate(&data).map_err(|e| e.to_string())?;
|
||||||
|
|
||||||
// FIXME: We need to initialize memory in a way that supports alternate
|
// FIXME: We need to initialize memory in a way that supports alternate
|
||||||
// memory spaces, imported base addresses, and offsets.
|
// memory spaces, imported base addresses, and offsets.
|
||||||
for init in &environ.lazy.data_initializers {
|
for init in &translation.lazy.data_initializers {
|
||||||
obj.define("memory", Vec::from(init.data))
|
obj.define("memory", Vec::from(init.data))
|
||||||
.map_err(|err| format!("{}", err))?;
|
.map_err(|err| format!("{}", err))?;
|
||||||
}
|
}
|
||||||
|
|
||||||
let translation = environ.finish_translation();
|
|
||||||
|
|
||||||
let (compilation, relocations) = compile_module(&translation, &*isa)?;
|
let (compilation, relocations) = compile_module(&translation, &*isa)?;
|
||||||
|
|
||||||
emit_module(&mut obj, &translation.module, &compilation, &relocations)?;
|
emit_module(&mut obj, &translation.module, &compilation, &relocations)?;
|
||||||
|
|||||||
Reference in New Issue
Block a user