diff --git a/Cargo.toml b/Cargo.toml index 24ebde951f..faaff386e6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -32,4 +32,7 @@ tempdir = "*" faerie = "0.6.0" target-lexicon = { version = "0.2.0", default-features = false } +[dev-dependencies] +wabt = "0.7" + [workspace] diff --git a/filetests/rs2wasm-add-func.wat b/filetests/rs2wasm-add-func.wat new file mode 100644 index 0000000000..21ff7f5d7a --- /dev/null +++ b/filetests/rs2wasm-add-func.wat @@ -0,0 +1,20 @@ +(module + (type (;0;) (func)) + (type (;1;) (func (param i32 i32) (result i32))) + (func $add (type 1) (param i32 i32) (result i32) + get_local 1 + get_local 0 + i32.add) + (func $start (type 0)) + (table (;0;) 1 1 anyfunc) + (memory (;0;) 17) + (global (;0;) i32 (i32.const 1049114)) + (global (;1;) i32 (i32.const 1049114)) + (export "memory" (memory 0)) + (export "__indirect_function_table" (table 0)) + (export "__heap_base" (global 0)) + (export "__data_end" (global 1)) + (export "add" (func $add)) + (export "start" (func $start)) + (data (i32.const 1048576) "\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00") + (data (i32.const 1049092) "invalid malloc request")) diff --git a/src/main.rs b/src/main.rs index 99914c527a..25a3ec1441 100644 --- a/src/main.rs +++ b/src/main.rs @@ -44,6 +44,9 @@ extern crate wasmtime_execute; extern crate serde_derive; extern crate tempdir; +#[cfg(test)] +extern crate wabt; + use cranelift_codegen::isa::TargetIsa; use cranelift_codegen::settings; use cranelift_codegen::settings::Configurable; @@ -215,3 +218,39 @@ fn handle_module(args: &Args, path: PathBuf, isa: &TargetIsa) -> Result<(), Stri } Ok(()) } + +#[cfg(test)] +mod tests { + use cranelift_codegen::settings; + use cranelift_codegen::settings::Configurable; + use std::path::PathBuf; + use wabt; + use wasmtime_environ::{Module, ModuleEnvironment}; + + const PATH_MODULE_RS2WASM_ADD_FUNC: &str = r"filetests/rs2wasm-add-func.wat"; + + /// Simple test reading a wasm-file and translating to binary representation. + #[test] + fn test_environ_translate() { + let path = PathBuf::from(PATH_MODULE_RS2WASM_ADD_FUNC); + let wat_data = super::read_to_end(path).unwrap(); + assert!(wat_data.len() > 0); + + let data = wabt::wat2wasm(wat_data).expect("expecting valid wat-file"); + assert!(data.len() > 0); + + let mut flag_builder = settings::builder(); + flag_builder.enable("enable_verifier").unwrap(); + + let isa_builder = cranelift_native::builder().unwrap_or_else(|_| { + panic!("host machine is not a supported target"); + }); + let isa = isa_builder.finish(settings::Flags::new(flag_builder)); + + let mut module = Module::new(); + let environ = ModuleEnvironment::new(&*isa, &mut module); + + let translation = environ.translate(&data); + assert!(translation.is_ok()); + } +}