Add support for (register) command in spec tests and enable importing mutable globals.

Enable the part of the simd spec tests that now pass.
This commit is contained in:
Nick Lewycky
2019-08-02 14:16:39 -07:00
parent 17b5082c9b
commit 2fabb5bc20
4 changed files with 61 additions and 43 deletions

View File

@ -146,7 +146,7 @@ pub fn validating_parser_config(features: &Features) -> wasmparser::ValidatingPa
enable_bulk_memory: false, enable_bulk_memory: false,
enable_multi_value: false, enable_multi_value: false,
}, },
mutable_global_imports: false, mutable_global_imports: true,
} }
} }

View File

@ -140,7 +140,7 @@ pub fn validate_and_report_errors_with_features(
enable_reference_types: false, enable_reference_types: false,
enable_threads: false, enable_threads: false,
}, },
mutable_global_imports: false, mutable_global_imports: true,
}; };
let mut parser = wasmparser::ValidatingParser::new(wasm, Some(config)); let mut parser = wasmparser::ValidatingParser::new(wasm, Some(config));
loop { loop {

View File

@ -132,7 +132,7 @@ fn get_compiler() -> impl Compiler {
CraneliftCompiler::new() CraneliftCompiler::new()
} }
pub fn generate_imports() -> ImportObject { pub fn generate_imports(extra_imports: Vec<(String, Instance)>) -> ImportObject {
let mut features = wabt::Features::new(); let mut features = wabt::Features::new();
features.enable_simd(); features.enable_simd();
let wasm_binary = wat2wasm_with_features(IMPORT_MODULE.as_bytes(), features).expect("WAST not valid or malformed"); let wasm_binary = wat2wasm_with_features(IMPORT_MODULE.as_bytes(), features).expect("WAST not valid or malformed");
@ -143,6 +143,9 @@ pub fn generate_imports() -> ImportObject {
.expect("WASM can't be instantiated"); .expect("WASM can't be instantiated");
let mut imports = ImportObject::new(); let mut imports = ImportObject::new();
imports.register("spectest", instance); imports.register("spectest", instance);
for (name, instance) in extra_imports {
imports.register(name, instance);
}
imports imports
} }
@ -303,6 +306,8 @@ struct WastTestGenerator {
script_parser: ScriptParser, script_parser: ScriptParser,
module_calls: HashMap<i32, Vec<String>>, module_calls: HashMap<i32, Vec<String>>,
buffer: String, buffer: String,
modules_by_name: HashMap<String, i32>,
registered_modules: Vec<(i32, String)>,
} }
impl WastTestGenerator { impl WastTestGenerator {
@ -322,6 +327,8 @@ impl WastTestGenerator {
script_parser: script, script_parser: script,
buffer: buffer, buffer: buffer,
module_calls: HashMap::new(), module_calls: HashMap::new(),
modules_by_name: HashMap::new(),
registered_modules: Vec::new(),
} }
} }
@ -392,7 +399,7 @@ fn test_module_{}() {{
self.module_calls.remove(&module); self.module_calls.remove(&module);
} }
fn visit_module(&mut self, module: &ModuleBinary, _name: &Option<String>) { fn visit_module(&mut self, module: &ModuleBinary, name: &Option<String>) {
let wasm_binary: Vec<u8> = module.clone().into_vec(); let wasm_binary: Vec<u8> = module.clone().into_vec();
let mut features = Features::new(); let mut features = Features::new();
features.enable_simd(); features.enable_simd();
@ -409,7 +416,9 @@ fn test_module_{}() {{
println!(\"{{}}\", module_str); println!(\"{{}}\", module_str);
let wasm_binary = wat2wasm(module_str.as_bytes()).expect(\"WAST not valid or malformed\"); let wasm_binary = wat2wasm(module_str.as_bytes()).expect(\"WAST not valid or malformed\");
let module = wasmer_runtime_core::compile_with_config(&wasm_binary[..], &get_compiler(), CompilerConfig {{ features: Features {{ simd: true }}, ..Default::default() }}).expect(\"WASM can't be compiled\"); let module = wasmer_runtime_core::compile_with_config(&wasm_binary[..], &get_compiler(), CompilerConfig {{ features: Features {{ simd: true }}, ..Default::default() }}).expect(\"WASM can't be compiled\");
module.instantiate(&generate_imports()).expect(\"WASM can't be instantiated\") let mut extra_imports = Vec::new();
{}
module.instantiate(&generate_imports(extra_imports)).expect(\"WASM can't be instantiated\")
}}\n", }}\n",
self.last_module, self.last_module,
// We do this to ident four spaces, so it looks aligned to the function body // We do this to ident four spaces, so it looks aligned to the function body
@ -417,9 +426,22 @@ fn test_module_{}() {{
.replace("\n", "\n ") .replace("\n", "\n ")
.replace("\\", "\\\\") .replace("\\", "\\\\")
.replace("\"", "\\\""), .replace("\"", "\\\""),
self.registered_modules.iter().map(|(number, name)| format!("extra_imports.push((String::from(\"{}\"), create_module_{}()));", name, number)).fold(String::from(""), |acc, x| format!("{}{}\n", acc, x)),
) )
.as_str(), .as_str(),
); );
if let Some(name) = name {
self.record_named_module(name);
}
}
fn record_named_module(&mut self, name: &String) {
self.modules_by_name.insert(name.clone(), self.last_module);
}
fn visit_register_module(&mut self, name: &String, as_name: &String) {
self.registered_modules
.push((*self.modules_by_name.get(name).unwrap(), as_name.clone()));
} }
fn visit_assert_invalid(&mut self, module: &ModuleBinary) { fn visit_assert_invalid(&mut self, module: &ModuleBinary) {
@ -763,11 +785,8 @@ fn {}() {{
} => { } => {
// Do nothing for now // Do nothing for now
} }
CommandKind::Register { CommandKind::Register { name, as_name } => {
name: _, self.visit_register_module(name.as_ref().unwrap(), as_name);
as_name: _,
} => {
// Do nothing for now
} }
CommandKind::PerformAction(action) => { CommandKind::PerformAction(action) => {
self.visit_perform_action(action); self.visit_perform_action(action);

View File

@ -9,49 +9,48 @@
;; v128 globals ;; v128 globals
;; wasmer silently doesn't implement (register) yet (module $M
;;(module $M (global (export "a") v128 (v128.const f32x4 0.0 1.0 2.0 3.0))
;; (global (export "a") v128 (v128.const f32x4 0.0 1.0 2.0 3.0)) (global (export "b") (mut v128) (v128.const f32x4 4.0 5.0 6.0 7.0))
;; (global (export "b") (mut v128) (v128.const f32x4 4.0 5.0 6.0 7.0)) )
;;) (register "M" $M)
;;(register "M" $M)
(module (module
;; (global $a (import "M" "a") v128) (global $a (import "M" "a") v128)
;; (global $b (import "M" "b") (mut v128)) (global $b (import "M" "b") (mut v128))
;; (global $c v128 (global.get $a)) (global $c v128 (global.get $a))
(global $d v128 (v128.const i32x4 8 9 10 11)) (global $d v128 (v128.const i32x4 8 9 10 11))
;; (global $e (mut v128) (global.get $a)) (global $e (mut v128) (global.get $a))
;; (global $f (mut v128) (v128.const i32x4 12 13 14 15)) (global $f (mut v128) (v128.const i32x4 12 13 14 15))
;; (func (export "get-a") (result v128) (global.get $a)) (func (export "get-a") (result v128) (global.get $a))
;; (func (export "get-b") (result v128) (global.get $b)) (func (export "get-b") (result v128) (global.get $b))
;; (func (export "get-c") (result v128) (global.get $c)) (func (export "get-c") (result v128) (global.get $c))
(func (export "get-d") (result v128) (global.get $d)) (func (export "get-d") (result v128) (global.get $d))
;; (func (export "get-e") (result v128) (global.get $e)) (func (export "get-e") (result v128) (global.get $e))
;; (func (export "get-f") (result v128) (global.get $f)) (func (export "get-f") (result v128) (global.get $f))
;; (func (export "set-b") (param $value v128) (global.set $b (local.get $value))) (func (export "set-b") (param $value v128) (global.set $b (local.get $value)))
;; (func (export "set-e") (param $value v128) (global.set $e (local.get $value))) (func (export "set-e") (param $value v128) (global.set $e (local.get $value)))
;; (func (export "set-f") (param $value v128) (global.set $f (local.get $value))) (func (export "set-f") (param $value v128) (global.set $f (local.get $value)))
) )
;;(assert_return (invoke "get-a") (v128.const f32x4 0.0 1.0 2.0 3.0)) (assert_return (invoke "get-a") (v128.const f32x4 0.0 1.0 2.0 3.0))
;;(assert_return (invoke "get-b") (v128.const f32x4 4.0 5.0 6.0 7.0)) (assert_return (invoke "get-b") (v128.const f32x4 4.0 5.0 6.0 7.0))
;;(assert_return (invoke "get-c") (v128.const f32x4 0.0 1.0 2.0 3.0)) (assert_return (invoke "get-c") (v128.const f32x4 0.0 1.0 2.0 3.0))
(assert_return (invoke "get-d") (v128.const i32x4 8 9 10 11)) (assert_return (invoke "get-d") (v128.const i32x4 8 9 10 11))
;;(assert_return (invoke "get-e") (v128.const f32x4 0.0 1.0 2.0 3.0)) (assert_return (invoke "get-e") (v128.const f32x4 0.0 1.0 2.0 3.0))
;;(assert_return (invoke "get-f") (v128.const i32x4 12 13 14 15)) (assert_return (invoke "get-f") (v128.const i32x4 12 13 14 15))
;;(invoke "set-b" (v128.const f64x2 nan:0x1 nan:0x2)) (invoke "set-b" (v128.const f64x2 nan:0x1 nan:0x2))
;;(assert_return (invoke "get-b") (v128.const f64x2 nan:0x1 nan:0x2)) (assert_return (invoke "get-b") (v128.const f64x2 nan:0x1 nan:0x2))
;;
;;(invoke "set-e" (v128.const f64x2 -nan:0x3 +inf)) (invoke "set-e" (v128.const f64x2 -nan:0x3 +inf))
;;(assert_return (invoke "get-e") (v128.const f64x2 -nan:0x3 +inf)) (assert_return (invoke "get-e") (v128.const f64x2 -nan:0x3 +inf))
;;
;;(invoke "set-f" (v128.const f32x4 -inf +3.14 10.0e30 +nan:0x42)) (invoke "set-f" (v128.const f32x4 -inf +3.14 10.0e30 +nan:0x42))
;;(assert_return (invoke "get-f") (v128.const f32x4 -inf +3.14 10.0e30 +nan:0x42)) (assert_return (invoke "get-f") (v128.const f32x4 -inf +3.14 10.0e30 +nan:0x42))
(assert_invalid (module (global v128 (i32.const 0))) "invalid initializer expression") (assert_invalid (module (global v128 (i32.const 0))) "invalid initializer expression")
(assert_invalid (module (global v128 (i64.const 0))) "invalid initializer expression") (assert_invalid (module (global v128 (i64.const 0))) "invalid initializer expression")