Skip to content

Commit

Permalink
winch: Run winch through a subset of the spec suite (#6610)
Browse files Browse the repository at this point in the history
prtest:full
  • Loading branch information
saulecabrera committed Jul 3, 2023
1 parent c19c729 commit 815046d
Show file tree
Hide file tree
Showing 9 changed files with 1,732 additions and 9 deletions.
24 changes: 22 additions & 2 deletions build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,13 @@ fn main() -> anyhow::Result<()> {
);
let mut out = String::new();

for strategy in &["Cranelift"] {
for strategy in &["Cranelift", "Winch"] {
writeln!(out, "#[cfg(test)]")?;
writeln!(out, "#[allow(non_snake_case)]")?;
if *strategy == "Winch" {
// We only test Winch on x86_64, for now.
writeln!(out, "{}", "#[cfg(all(target_arch = \"x86_64\"))]")?;
}
writeln!(out, "mod {} {{", strategy)?;

with_test_module(&mut out, "misc", |out| {
Expand All @@ -31,6 +35,7 @@ fn main() -> anyhow::Result<()> {
test_directory_module(out, "tests/misc_testsuite/memory64", strategy)?;
test_directory_module(out, "tests/misc_testsuite/component-model", strategy)?;
test_directory_module(out, "tests/misc_testsuite/function-references", strategy)?;
test_directory_module(out, "tests/misc_testsuite/winch", strategy)?;
Ok(())
})?;

Expand Down Expand Up @@ -186,7 +191,22 @@ fn write_testsuite_tests(

/// Ignore tests that aren't supported yet.
fn ignore(testsuite: &str, testname: &str, strategy: &str) -> bool {
assert_eq!(strategy, "Cranelift");
assert!(strategy == "Cranelift" || strategy == "Winch");

// Ignore everything except the winch misc test suite.
// We ignore tests that assert for traps on windows, given
// that Winch doesn't encode unwind information for Windows, yet.
if strategy == "Winch" {
if testsuite != "winch" {
return true;
}

let assert_trap = ["i32", "i64"].contains(&testname);

if assert_trap && env::var("CARGO_CFG_TARGET_OS").unwrap().as_str() == "windows" {
return true;
}
}

// This is an empty file right now which the `wast` crate doesn't parse
if testname.contains("memory_copy1") {
Expand Down
18 changes: 11 additions & 7 deletions tests/all/wast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,6 @@ fn run_wast(wast: &str, strategy: Strategy, pooling: bool) -> anyhow::Result<()>

let wast_bytes = std::fs::read(wast).with_context(|| format!("failed to read `{}`", wast))?;

match strategy {
Strategy::Cranelift => {}
_ => unimplemented!(),
}

let wast = Path::new(wast);

let memory64 = feature_found(wast, "memory64");
Expand All @@ -40,18 +35,27 @@ fn run_wast(wast: &str, strategy: Strategy, pooling: bool) -> anyhow::Result<()>
return Ok(());
}

let is_cranelift = match strategy {
Strategy::Cranelift => true,
_ => false,
};

let mut cfg = Config::new();
cfg.wasm_multi_memory(multi_memory)
.wasm_threads(threads)
.wasm_memory64(memory64)
.wasm_function_references(function_references)
.wasm_reference_types(reference_types)
.wasm_relaxed_simd(relaxed_simd)
.cranelift_debug_verifier(true);
.strategy(strategy);

if is_cranelift {
cfg.cranelift_debug_verifier(true);
}

cfg.wasm_component_model(feature_found(wast, "component-model"));

if feature_found(wast, "canonicalize-nan") {
if feature_found(wast, "canonicalize-nan") && is_cranelift {
cfg.cranelift_nan_canonicalization(true);
}
let test_allocates_lots_of_memory = wast.ends_with("more-than-4gb.wast");
Expand Down
161 changes: 161 additions & 0 deletions tests/misc_testsuite/winch/block.wast
Original file line number Diff line number Diff line change
@@ -0,0 +1,161 @@
;; Test `block` operator

(module
;; Auxiliary definition
(memory 1)

(func $dummy)

(func (export "empty")
(block)
(block $l)
)

(func (export "singular") (result i32)
(block (nop))
(block (result i32) (i32.const 7))
)

(func (export "nested") (result i32)
(block (result i32)
(block (call $dummy) (block) (nop))
(block (result i32) (call $dummy) (i32.const 9))
)
)

(func (export "deep") (result i32)
(block (result i32) (block (result i32)
(block (result i32) (block (result i32)
(block (result i32) (block (result i32)
(block (result i32) (block (result i32)
(block (result i32) (block (result i32)
(block (result i32) (block (result i32)
(block (result i32) (block (result i32)
(block (result i32) (block (result i32)
(block (result i32) (block (result i32)
(block (result i32) (block (result i32)
(block (result i32) (block (result i32)
(block (result i32) (block (result i32)
(block (result i32) (block (result i32)
(block (result i32) (block (result i32)
(block (result i32) (block (result i32)
(block (result i32) (block (result i32)
(block (result i32) (block (result i32)
(block (result i32) (block (result i32)
(block (result i32) (block (result i32)
(call $dummy) (i32.const 150)
))
))
))
))
))
))
))
))
))
))
))
))
))
))
))
))
))
))
))
)

(func (export "as-if-condition")
(block (result i32) (i32.const 1)) (if (then (call $dummy)))
)
(func (export "as-if-then") (result i32)
(if (result i32) (i32.const 1) (then (block (result i32) (i32.const 1))) (else (i32.const 2)))
)
(func (export "as-if-else") (result i32)
(if (result i32) (i32.const 1) (then (i32.const 2)) (else (block (result i32) (i32.const 1))))
)

(func (export "as-br_if-first") (result i32)
(block (result i32) (br_if 0 (block (result i32) (i32.const 1)) (i32.const 2)))
)
(func (export "as-br_if-last") (result i32)
(block (result i32) (br_if 0 (i32.const 2) (block (result i32) (i32.const 1))))
)


(func $f (param i32) (result i32) (local.get 0))

(func (export "as-call-value") (result i32)
(call $f (block (result i32) (i32.const 1)))
)
(func (export "as-return-value") (result i32)
(block (result i32) (i32.const 1)) (return)
)
(func (export "as-br-value") (result i32)
(block (result i32) (br 0 (block (result i32) (i32.const 1))))
)
(func (export "as-local.set-value") (result i32)
(local i32) (local.set 0 (block (result i32) (i32.const 1))) (local.get 0)
)

(func (export "as-unary-operand") (result i32)
(i32.ctz (block (result i32) (call $dummy) (i32.const 13)))
)
(func (export "as-binary-operand") (result i32)
(i32.mul
(block (result i32) (call $dummy) (i32.const 3))
(block (result i32) (call $dummy) (i32.const 4))
)
)
(func (export "as-test-operand") (result i32)
(i32.eqz (block (result i32) (call $dummy) (i32.const 13)))
)
(func (export "break-value") (result i32)
(block (result i32) (br 0 (i32.const 18)) (i32.const 19))
)
(func (export "break-inner") (result i32)
(local i32)
(local.set 0 (i32.const 0))
(local.set 0 (i32.add (local.get 0) (block (result i32) (block (result i32) (br 1 (i32.const 0x1))))))
(local.set 0 (i32.add (local.get 0) (block (result i32) (block (br 0)) (i32.const 0x2))))
(local.set 0
(i32.add (local.get 0) (block (result i32) (i32.ctz (br 0 (i32.const 0x4)))))
)
(local.set 0
(i32.add (local.get 0) (block (result i32) (i32.ctz (block (result i32) (br 1 (i32.const 0x8))))))
)
(local.get 0)
)

(func (export "effects") (result i32)
(local i32)
(block
(local.set 0 (i32.const 1))
(local.set 0 (i32.mul (local.get 0) (i32.const 3)))
(local.set 0 (i32.sub (local.get 0) (i32.const 5)))
(local.set 0 (i32.mul (local.get 0) (i32.const 7)))
(br 0)
(local.set 0 (i32.mul (local.get 0) (i32.const 100)))
)
(i32.eq (local.get 0) (i32.const -14))
)
)

(assert_return (invoke "empty"))
(assert_return (invoke "singular") (i32.const 7))
(assert_return (invoke "nested") (i32.const 9))
(assert_return (invoke "deep") (i32.const 150))
(assert_return (invoke "as-if-condition"))
(assert_return (invoke "as-if-then") (i32.const 1))
(assert_return (invoke "as-if-else") (i32.const 2))
(assert_return (invoke "as-br_if-first") (i32.const 1))
(assert_return (invoke "as-br_if-last") (i32.const 2))
(assert_return (invoke "as-call-value") (i32.const 1))
(assert_return (invoke "as-return-value") (i32.const 1))
(assert_return (invoke "as-br-value") (i32.const 1))
(assert_return (invoke "as-local.set-value") (i32.const 1))
(assert_return (invoke "as-unary-operand") (i32.const 0))
(assert_return (invoke "as-binary-operand") (i32.const 12))
(assert_return (invoke "as-test-operand") (i32.const 0))
(assert_return (invoke "break-inner") (i32.const 0xf))
(assert_return (invoke "effects") (i32.const 1))
Loading

0 comments on commit 815046d

Please sign in to comment.