From 38f67933f329eaf07c4df658f1fa70076277c498 Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Mon, 29 Mar 2021 16:01:46 +0200 Subject: [PATCH 1/4] Bump wasmparser and update API usage --- Cargo.toml | 2 +- src/ir/mod.rs | 4 +- src/module/exports.rs | 3 + src/module/functions/local_function/emit.rs | 5 +- src/module/functions/local_function/mod.rs | 77 +++++++++++++++++---- src/module/imports.rs | 3 + src/module/mod.rs | 22 ++++-- 7 files changed, 90 insertions(+), 26 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 77270dde..a640e5aa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -29,7 +29,7 @@ leb128 = "0.2.4" log = "0.4.8" rayon = { version = "1.1.0", optional = true } walrus-macro = { path = './crates/macro', version = '=0.18.0' } -wasmparser = "0.67.0" +wasmparser = "0.77.0" [features] parallel = ['rayon', 'id-arena/rayon'] diff --git a/src/ir/mod.rs b/src/ir/mod.rs index abd225c2..af192c66 100644 --- a/src/ir/mod.rs +++ b/src/ir/mod.rs @@ -943,20 +943,18 @@ pub enum UnaryOp { F64x2ExtractLane { idx: u8 }, V128Not, + V128AnyTrue, I8x16Abs, I8x16Neg, - I8x16AnyTrue, I8x16AllTrue, I8x16Bitmask, I16x8Abs, I16x8Neg, - I16x8AnyTrue, I16x8AllTrue, I16x8Bitmask, I32x4Abs, I32x4Neg, - I32x4AnyTrue, I32x4AllTrue, I32x4Bitmask, I64x2Neg, diff --git a/src/module/exports.rs b/src/module/exports.rs index 6180ecbd..17bbab2b 100644 --- a/src/module/exports.rs +++ b/src/module/exports.rs @@ -145,6 +145,9 @@ impl Module { Type | Module | Instance => { unimplemented!("module linking not supported"); } + Event => { + unimplemented!("exception handling not supported"); + } }; self.exports.arena.alloc_with_id(|id| Export { id, diff --git a/src/module/functions/local_function/emit.rs b/src/module/functions/local_function/emit.rs index 663173a7..b2c5ad9b 100644 --- a/src/module/functions/local_function/emit.rs +++ b/src/module/functions/local_function/emit.rs @@ -500,15 +500,15 @@ impl<'instr> Visitor<'instr> for Emit<'_, '_> { V128Not => self.simd(0x4d), + V128AnyTrue => self.simd(0x53), + I8x16Abs => self.simd(0x60), I8x16Neg => self.simd(0x61), - I8x16AnyTrue => self.simd(0x62), I8x16AllTrue => self.simd(0x63), I8x16Bitmask => self.simd(0x64), I16x8Abs => self.simd(0x80), I16x8Neg => self.simd(0x81), - I16x8AnyTrue => self.simd(0x82), I16x8AllTrue => self.simd(0x83), I16x8Bitmask => self.simd(0x84), I16x8WidenLowI8x16S => self.simd(0x87), @@ -518,7 +518,6 @@ impl<'instr> Visitor<'instr> for Emit<'_, '_> { I32x4Abs => self.simd(0xa0), I32x4Neg => self.simd(0xa1), - I32x4AnyTrue => self.simd(0xa2), I32x4AllTrue => self.simd(0xa3), I32x4Bitmask => self.simd(0xa4), I32x4WidenLowI16x8S => self.simd(0xa7), diff --git a/src/module/functions/local_function/mod.rs b/src/module/functions/local_function/mod.rs index 3937a260..00816206 100644 --- a/src/module/functions/local_function/mod.rs +++ b/src/module/functions/local_function/mod.rs @@ -1057,6 +1057,7 @@ fn append_instruction<'context>( Operator::F64x2Ge => binop(ctx, BinaryOp::F64x2Ge), Operator::V128Not => unop(ctx, UnaryOp::V128Not), + Operator::V128AnyTrue => unop(ctx, UnaryOp::V128AnyTrue), Operator::V128And => binop(ctx, BinaryOp::V128And), Operator::V128AndNot => binop(ctx, BinaryOp::V128AndNot), Operator::V128Or => binop(ctx, BinaryOp::V128Or), @@ -1066,7 +1067,6 @@ fn append_instruction<'context>( Operator::I8x16Abs => unop(ctx, UnaryOp::I8x16Abs), Operator::I8x16Neg => unop(ctx, UnaryOp::I8x16Neg), - Operator::I8x16AnyTrue => unop(ctx, UnaryOp::I8x16AnyTrue), Operator::I8x16AllTrue => unop(ctx, UnaryOp::I8x16AllTrue), Operator::I8x16Shl => binop(ctx, BinaryOp::I8x16Shl), Operator::I8x16ShrS => binop(ctx, BinaryOp::I8x16ShrS), @@ -1080,7 +1080,6 @@ fn append_instruction<'context>( Operator::I16x8Abs => unop(ctx, UnaryOp::I16x8Abs), Operator::I16x8Neg => unop(ctx, UnaryOp::I16x8Neg), - Operator::I16x8AnyTrue => unop(ctx, UnaryOp::I16x8AnyTrue), Operator::I16x8AllTrue => unop(ctx, UnaryOp::I16x8AllTrue), Operator::I16x8Shl => binop(ctx, BinaryOp::I16x8Shl), Operator::I16x8ShrS => binop(ctx, BinaryOp::I16x8ShrS), @@ -1095,7 +1094,6 @@ fn append_instruction<'context>( Operator::I32x4Abs => unop(ctx, UnaryOp::I32x4Abs), Operator::I32x4Neg => unop(ctx, UnaryOp::I32x4Neg), - Operator::I32x4AnyTrue => unop(ctx, UnaryOp::I32x4AnyTrue), Operator::I32x4AllTrue => unop(ctx, UnaryOp::I32x4AllTrue), Operator::I32x4Shl => binop(ctx, BinaryOp::I32x4Shl), Operator::I32x4ShrS => binop(ctx, BinaryOp::I32x4ShrS), @@ -1169,14 +1167,14 @@ fn append_instruction<'context>( Operator::I8x16NarrowI16x8U => binop(ctx, BinaryOp::I8x16NarrowI16x8U), Operator::I16x8NarrowI32x4S => binop(ctx, BinaryOp::I16x8NarrowI32x4S), Operator::I16x8NarrowI32x4U => binop(ctx, BinaryOp::I16x8NarrowI32x4U), - Operator::I16x8WidenLowI8x16S => unop(ctx, UnaryOp::I16x8WidenLowI8x16S), - Operator::I16x8WidenLowI8x16U => unop(ctx, UnaryOp::I16x8WidenLowI8x16U), - Operator::I16x8WidenHighI8x16S => unop(ctx, UnaryOp::I16x8WidenHighI8x16S), - Operator::I16x8WidenHighI8x16U => unop(ctx, UnaryOp::I16x8WidenHighI8x16U), - Operator::I32x4WidenLowI16x8S => unop(ctx, UnaryOp::I32x4WidenLowI16x8S), - Operator::I32x4WidenLowI16x8U => unop(ctx, UnaryOp::I32x4WidenLowI16x8U), - Operator::I32x4WidenHighI16x8S => unop(ctx, UnaryOp::I32x4WidenHighI16x8S), - Operator::I32x4WidenHighI16x8U => unop(ctx, UnaryOp::I32x4WidenHighI16x8U), + Operator::I16x8ExtendLowI8x16S => unop(ctx, UnaryOp::I16x8WidenLowI8x16S), + Operator::I16x8ExtendLowI8x16U => unop(ctx, UnaryOp::I16x8WidenLowI8x16U), + Operator::I16x8ExtendHighI8x16S => unop(ctx, UnaryOp::I16x8WidenHighI8x16S), + Operator::I16x8ExtendHighI8x16U => unop(ctx, UnaryOp::I16x8WidenHighI8x16U), + Operator::I32x4ExtendLowI16x8S => unop(ctx, UnaryOp::I32x4WidenLowI16x8S), + Operator::I32x4ExtendLowI16x8U => unop(ctx, UnaryOp::I32x4WidenLowI16x8U), + Operator::I32x4ExtendHighI16x8S => unop(ctx, UnaryOp::I32x4WidenHighI16x8S), + Operator::I32x4ExtendHighI16x8U => unop(ctx, UnaryOp::I32x4WidenHighI16x8U), Operator::V128Load8x8S { memarg } => load_simd(ctx, memarg, LoadSimdKind::V128Load8x8S), Operator::V128Load8x8U { memarg } => load_simd(ctx, memarg, LoadSimdKind::V128Load8x8U), Operator::V128Load16x4S { memarg } => load_simd(ctx, memarg, LoadSimdKind::V128Load16x4S), @@ -1225,8 +1223,61 @@ fn append_instruction<'context>( ctx.alloc_instr(ElemDrop { elem }, loc); } - Operator::ReturnCall { .. } | Operator::ReturnCallIndirect { .. } => { - unimplemented!("not supported"); + Operator::ReturnCall { .. } + | Operator::ReturnCallIndirect { .. } + | Operator::Try { ty: _ } + | Operator::Catch { index: _ } + | Operator::Throw { index: _ } + | Operator::Rethrow { relative_depth: _ } + | Operator::Unwind + | Operator::Delegate { relative_depth: _ } + | Operator::CatchAll + | Operator::V128Load8Lane { memarg: _, lane: _ } + | Operator::V128Load16Lane { memarg: _, lane: _ } + | Operator::V128Load32Lane { memarg: _, lane: _ } + | Operator::V128Load64Lane { memarg: _, lane: _ } + | Operator::V128Store8Lane { memarg: _, lane: _ } + | Operator::V128Store16Lane { memarg: _, lane: _ } + | Operator::V128Store32Lane { memarg: _, lane: _ } + | Operator::V128Store64Lane { memarg: _, lane: _ } + | Operator::I64x2Eq + | Operator::I64x2Ne + | Operator::I64x2LtS + | Operator::I64x2GtS + | Operator::I64x2LeS + | Operator::I64x2GeS + | Operator::I8x16Popcnt + | Operator::I16x8ExtAddPairwiseI8x16S + | Operator::I16x8ExtAddPairwiseI8x16U + | Operator::I16x8Q15MulrSatS + | Operator::I16x8ExtMulLowI8x16S + | Operator::I16x8ExtMulHighI8x16S + | Operator::I16x8ExtMulLowI8x16U + | Operator::I16x8ExtMulHighI8x16U + | Operator::I32x4ExtAddPairwiseI16x8S + | Operator::I32x4ExtAddPairwiseI16x8U + | Operator::I32x4ExtMulLowI16x8S + | Operator::I32x4ExtMulHighI16x8S + | Operator::I32x4ExtMulLowI16x8U + | Operator::I32x4ExtMulHighI16x8U + | Operator::I64x2Abs + | Operator::I64x2AllTrue + | Operator::I64x2Bitmask + | Operator::I64x2ExtendLowI32x4S + | Operator::I64x2ExtendHighI32x4S + | Operator::I64x2ExtendLowI32x4U + | Operator::I64x2ExtendHighI32x4U + | Operator::I64x2ExtMulLowI32x4S + | Operator::I64x2ExtMulHighI32x4S + | Operator::I64x2ExtMulLowI32x4U + | Operator::I64x2ExtMulHighI32x4U + | Operator::I32x4TruncSatF64x2SZero + | Operator::I32x4TruncSatF64x2UZero + | Operator::F64x2ConvertLowI32x4S + | Operator::F64x2ConvertLowI32x4U + | Operator::F32x4DemoteF64x2Zero + | Operator::F64x2PromoteLowF32x4 => { + unimplemented!("not supported") } } } diff --git a/src/module/imports.rs b/src/module/imports.rs index 5a656e28..7ac5816d 100644 --- a/src/module/imports.rs +++ b/src/module/imports.rs @@ -165,6 +165,9 @@ impl Module { | wasmparser::ImportSectionEntryType::Instance(_) => { unimplemented!("module linking not implemented"); } + wasmparser::ImportSectionEntryType::Event(_) => { + unimplemented!("exception handling not implemented") + } } } diff --git a/src/module/mod.rs b/src/module/mod.rs index ad57f96f..8401278b 100644 --- a/src/module/mod.rs +++ b/src/module/mod.rs @@ -206,6 +206,7 @@ impl Module { name, data, data_offset, + range: _range, } => { let result = match name { "producers" => wasmparser::ProducersSectionReader::new(data, data_offset) @@ -234,7 +235,7 @@ impl Module { Payload::End => validator.end()?, - // the module linking proposal is not implemented yet + // the module linking proposal is not implemented yet. Payload::AliasSection(s) => { validator.alias_section(&s)?; unreachable!() @@ -243,15 +244,24 @@ impl Module { validator.instance_section(&s)?; unreachable!() } - Payload::ModuleSection(s) => { - validator.module_section(&s)?; + Payload::ModuleSectionEntry { + parser: _, + range: _, + } => { + validator.module_section_entry(); unreachable!() } - Payload::ModuleCodeSectionStart { count, range, .. } => { - validator.module_code_section_start(count, &range)?; + Payload::ModuleSectionStart { + count, + range, + size: _, + } => { + validator.module_section_start(count, &range)?; unreachable!() } - Payload::ModuleCodeSectionEntry { .. } => unreachable!(), + + // exception handling is not implemented yet. + Payload::EventSection(_) => unreachable!(), } } From e46f7d65b3a2aa2dabbdf09b60685accddff0176 Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Wed, 31 Mar 2021 11:09:11 +0200 Subject: [PATCH 2/4] Add emission support for other memories This adds support for re-emitting wasm code that interacts with multiple memories, that is, not the primary (0th) one. Parsing support was already present for reading MemArgs that referred to other memories. --- src/module/functions/local_function/emit.rs | 15 ++++++++++++--- src/module/mod.rs | 1 + 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/module/functions/local_function/emit.rs b/src/module/functions/local_function/emit.rs index b2c5ad9b..e4717839 100644 --- a/src/module/functions/local_function/emit.rs +++ b/src/module/functions/local_function/emit.rs @@ -892,9 +892,18 @@ impl Emit<'_, '_> { } fn memarg(&mut self, id: MemoryId, arg: &MemArg) { - assert_eq!(self.indices.get_memory_index(id), 0); - self.encoder.u32(arg.align.trailing_zeros()); - self.encoder.u32(arg.offset); + let mem_index = self.indices.get_memory_index(id); + if mem_index == 0 { + self.encoder.u32(arg.align.trailing_zeros()); + self.encoder.u32(arg.offset); + } else { + assert!(arg.align.trailing_zeros() < (1 << 6), "alignment too large"); + let multi_memory_flag = 1 << 6; + let flags = arg.align.trailing_zeros() | multi_memory_flag; + self.encoder.u32(flags); + self.encoder.u32(arg.offset); + self.encoder.u32(mem_index); + }; } fn simd(&mut self, opcode: u32) { diff --git a/src/module/mod.rs b/src/module/mod.rs index 8401278b..36e5d1a3 100644 --- a/src/module/mod.rs +++ b/src/module/mod.rs @@ -123,6 +123,7 @@ impl Module { bulk_memory: !config.only_stable_features, simd: !config.only_stable_features, threads: !config.only_stable_features, + multi_memory: !config.only_stable_features, ..WasmFeatures::default() }); From bcfd1f4c12d535c82429c853aac83db631fbc176 Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Wed, 31 Mar 2021 11:35:39 +0200 Subject: [PATCH 3/4] Update CI workflow for setting new PATH entries --- .github/workflows/main.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d67021b3..1940efdc 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -28,13 +28,13 @@ jobs: cd wabt cmake . -DBUILD_TESTS=OFF make -j$(nproc) wast2json spectest-interp wasm-interp - echo ::add-path::`pwd` + echo `pwd` > $GITHUB_PATH - name: Install binaryen run: | set -e curl -L https://github.com/WebAssembly/binaryen/releases/download/1.39.1/binaryen-1.39.1-x86_64-linux.tar.gz | tar xzf - - echo "##[add-path]`pwd`/binaryen-1.39.1" + echo "`pwd`/binaryen-1.39.1" > $GITHUB_PATH - run: cargo build --all - run: cargo test --all - run: cargo check --benches @@ -52,12 +52,12 @@ jobs: run: | set -e curl -L https://github.com/WebAssembly/wabt/releases/download/1.0.13/wabt-1.0.13-linux.tar.gz | tar xzf - - echo "##[add-path]`pwd`/wabt-1.0.13" + echo "`pwd`/wabt-1.0.13" > $GITHUB_PATH - name: Install binaryen run: | set -e curl -L https://github.com/WebAssembly/binaryen/releases/download/1.39.1/binaryen-1.39.1-x86_64-linux.tar.gz | tar xzf - - echo "##[add-path]`pwd`/binaryen-1.39.1" + echo "`pwd`/binaryen-1.39.1" > $GITHUB_PATH - name: Run fuzzer run: cargo test -p walrus-fuzz-utils > fuzz.log || (tail -n 1000 fuzz.log && exit 1) env: @@ -79,12 +79,12 @@ jobs: run: | set -e curl -L https://github.com/WebAssembly/wabt/releases/download/1.0.13/wabt-1.0.13-linux.tar.gz | tar xzf - - echo "##[add-path]`pwd`/wabt-1.0.13" + echo "`pwd`/wabt-1.0.13" > $GITHUB_PATH - name: Install binaryen run: | set -e curl -L https://github.com/WebAssembly/binaryen/releases/download/1.39.1/binaryen-1.39.1-x86_64-linux.tar.gz | tar xzf - - echo "##[add-path]`pwd`/binaryen-1.39.1" + echo "`pwd`/binaryen-1.39.1" > $GITHUB_PATH - name: Run fuzzer run: | cargo fuzz run ${{ matrix.test }} -- -max_total_time=300 -rss_limit_mb=4096 > fuzz.log 2>&1 || (tail -n 1000 fuzz.log && exit 1) From 4189d6d47f6a2988eceff73325ce5fa3432acf1c Mon Sep 17 00:00:00 2001 From: Benjamin Bouvier Date: Wed, 31 Mar 2021 13:43:27 +0200 Subject: [PATCH 4/4] Support ignoring tests for NYI features + adapt test expectations - Also update spec-tests and wabt to support newer features. - Make it fuzz-safe when features aren't supported. --- .github/workflows/main.yml | 2 +- crates/tests/build.rs | 44 +++++++++++++++++++++++++- crates/tests/tests/round_trip/simd.wat | 28 ++++------------ crates/tests/tests/spec-tests | 2 +- src/module/mod.rs | 15 +++++---- 5 files changed, 61 insertions(+), 30 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 1940efdc..daa88a39 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -20,7 +20,7 @@ jobs: - uses: actions/checkout@v2 with: repository: WebAssembly/wabt - ref: 8e42376ccd5f05dc1036f91b4262e67b0fc66c2d + ref: aa0515b3c808da880942db8658abeaa969534667 path: wabt - name: Build wabt run: | diff --git a/crates/tests/build.rs b/crates/tests/build.rs index 12f6806a..9942ecb7 100644 --- a/crates/tests/build.rs +++ b/crates/tests/build.rs @@ -4,6 +4,42 @@ use std::fs; use std::path::Path; use walkdir::WalkDir; +fn is_known_failing(name: &str) -> bool { + match name { + // TODO issues to investigate: wasm parsed when it shouldn't + "tests_spec_tests_proposals_bulk_memory_operations_binary_wast" + | "tests_spec_tests_proposals_reference_types_binary_wast" => true, + + // SIMD isn't fully implemented yet. + "tests_spec_tests_proposals_simd_simd_boolean_wast" + | "tests_spec_tests_proposals_simd_simd_conversions_wast" + | "tests_spec_tests_proposals_simd_simd_f32x4_rounding_wast" + | "tests_spec_tests_proposals_simd_simd_f64x2_rounding_wast" + | "tests_spec_tests_proposals_simd_simd_i16x8_extadd_pairwise_i8x16_wast" + | "tests_spec_tests_proposals_simd_simd_i16x8_extmul_i8x16_wast" + | "tests_spec_tests_proposals_simd_simd_i16x8_q15mulr_sat_s_wast" + | "tests_spec_tests_proposals_simd_simd_i32x4_extadd_pairwise_i16x8_wast" + | "tests_spec_tests_proposals_simd_simd_i32x4_extmul_i16x8_wast" + | "tests_spec_tests_proposals_simd_simd_i32x4_trunc_sat_f64x2_wast" + | "tests_spec_tests_proposals_simd_simd_i64x2_arith2_wast" + | "tests_spec_tests_proposals_simd_simd_i64x2_cmp_wast" + | "tests_spec_tests_proposals_simd_simd_i64x2_extmul_i32x4_wast" + | "tests_spec_tests_proposals_simd_simd_i8x16_arith2_wast" + | "tests_spec_tests_proposals_simd_simd_int_to_int_extend_wast" + | "tests_spec_tests_proposals_simd_simd_load16_lane_wast" + | "tests_spec_tests_proposals_simd_simd_load32_lane_wast" + | "tests_spec_tests_proposals_simd_simd_load64_lane_wast" + | "tests_spec_tests_proposals_simd_simd_load8_lane_wast" + | "tests_spec_tests_proposals_simd_simd_load_zero_wast" + | "tests_spec_tests_proposals_simd_simd_store16_lane_wast" + | "tests_spec_tests_proposals_simd_simd_store32_lane_wast" + | "tests_spec_tests_proposals_simd_simd_store64_lane_wast" + | "tests_spec_tests_proposals_simd_simd_store8_lane_wast" => true, + + _ => false, + } +} + fn for_each_wat_file(dir: P, mut f: F) where P: AsRef, @@ -37,8 +73,14 @@ fn generate_tests(name: &str) { for_each_wat_file(Path::new("tests").join(name), |path| { let test_name = path_to_ident(path); + let ignore_test = if is_known_failing(&test_name) { + "#[ignore]" + } else { + "" + }; tests.push_str(&format!( - "#[test] fn {}() {{ walrus_tests_utils::handle(run(\"{}\".as_ref())); }}\n", + "#[test] {} fn {}() {{ walrus_tests_utils::handle(run(\"{}\".as_ref())); }}\n", + ignore_test, test_name, path.display(), )); diff --git a/crates/tests/tests/round_trip/simd.wat b/crates/tests/tests/round_trip/simd.wat index c0c4d0b8..e97694ee 100644 --- a/crates/tests/tests/round_trip/simd.wat +++ b/crates/tests/tests/round_trip/simd.wat @@ -263,13 +263,13 @@ local.get 1 local.get 2 v128.bitselect) + (func $v128.any_true (export "v128.any_true") (param v128) (result i32) + local.get 0 + v128.any_true) (func $i8x16.neg (export "i8x16.neg") (param v128) (result v128) local.get 0 i8x16.neg) - (func $i8x16.any_true (export "i8x16.any_true") (param v128) (result i32) - local.get 0 - i8x16.any_true) (func $i8x16.all_true (export "i8x16.all_true") (param v128) (result i32) local.get 0 i8x16.all_true) @@ -313,9 +313,6 @@ (func $i16x8.neg (export "i16x8.neg") (param v128) (result v128) local.get 0 i16x8.neg) - (func $i16x8.any_true (export "i16x8.any_true") (param v128) (result i32) - local.get 0 - i16x8.any_true) (func $i16x8.all_true (export "i16x8.all_true") (param v128) (result i32) local.get 0 i16x8.all_true) @@ -363,9 +360,6 @@ (func $i32x4.neg (export "i32x4.neg") (param v128) (result v128) local.get 0 i32x4.neg) - (func $i32x4.any_true (export "i32x4.any_true") (param v128) (result i32) - local.get 0 - i32x4.any_true) (func $i32x4.all_true (export "i32x4.all_true") (param v128) (result i32) local.get 0 i32x4.all_true) @@ -929,30 +923,24 @@ (func $v128.not (type 10) (param v128) (result v128) local.get 0 v128.not) + (func $v128.any_true (type 6) (param v128) (result i32) + local.get 0 + v128.any_true) (func $i8x16.neg (type 10) (param v128) (result v128) local.get 0 i8x16.neg) - (func $i8x16.any_true (type 6) (param v128) (result i32) - local.get 0 - i8x16.any_true) (func $i8x16.all_true (type 6) (param v128) (result i32) local.get 0 i8x16.all_true) (func $i16x8.neg (type 10) (param v128) (result v128) local.get 0 i16x8.neg) - (func $i16x8.any_true (type 6) (param v128) (result i32) - local.get 0 - i16x8.any_true) (func $i16x8.all_true (type 6) (param v128) (result i32) local.get 0 i16x8.all_true) (func $i32x4.neg (type 10) (param v128) (result v128) local.get 0 i32x4.neg) - (func $i32x4.any_true (type 6) (param v128) (result i32) - local.get 0 - i32x4.any_true) (func $i32x4.all_true (type 6) (param v128) (result i32) local.get 0 i32x4.all_true) @@ -1057,8 +1045,8 @@ (export "v128.or" (func $v128.or)) (export "v128.xor" (func $v128.xor)) (export "v128.bitselect" (func $v128.bitselect)) + (export "v128.any_true" (func $v128.any_true)) (export "i8x16.neg" (func $i8x16.neg)) - (export "i8x16.any_true" (func $i8x16.any_true)) (export "i8x16.all_true" (func $i8x16.all_true)) (export "i8x16.shl" (func $i8x16.shl)) (export "i8x16.shr_s" (func $i8x16.shr_s)) @@ -1070,7 +1058,6 @@ (export "i8x16.sub_sat_u" (func $i8x16.sub_sat_u)) (export "i8x16.sub_sat_s" (func $i8x16.sub_sat_s)) (export "i16x8.neg" (func $i16x8.neg)) - (export "i16x8.any_true" (func $i16x8.any_true)) (export "i16x8.all_true" (func $i16x8.all_true)) (export "i16x8.shl" (func $i16x8.shl)) (export "i16x8.shr_s" (func $i16x8.shr_s)) @@ -1083,7 +1070,6 @@ (export "i16x8.sub_sat_s" (func $i16x8.sub_sat_s)) (export "i16x8.mul" (func $i16x8.mul)) (export "i32x4.neg" (func $i32x4.neg)) - (export "i32x4.any_true" (func $i32x4.any_true)) (export "i32x4.all_true" (func $i32x4.all_true)) (export "i32x4.shl" (func $i32x4.shl)) (export "i32x4.shr_s" (func $i32x4.shr_s)) diff --git a/crates/tests/tests/spec-tests b/crates/tests/tests/spec-tests index 18f83401..01efde81 160000 --- a/crates/tests/tests/spec-tests +++ b/crates/tests/tests/spec-tests @@ -1 +1 @@ -Subproject commit 18f83401a47a0e43772cf7d9f216e994bf7c7fa6 +Subproject commit 01efde81028c5b0d099eb836645a2dc5e7755449 diff --git a/src/module/mod.rs b/src/module/mod.rs index 36e5d1a3..9ef1107b 100644 --- a/src/module/mod.rs +++ b/src/module/mod.rs @@ -36,7 +36,7 @@ pub use crate::module::producers::ModuleProducers; pub use crate::module::tables::{ModuleTables, Table, TableId}; pub use crate::module::types::ModuleTypes; use crate::parse::IndicesToIds; -use anyhow::Context; +use anyhow::{bail, Context}; use std::fs; use std::mem; use std::path::Path; @@ -239,18 +239,18 @@ impl Module { // the module linking proposal is not implemented yet. Payload::AliasSection(s) => { validator.alias_section(&s)?; - unreachable!() + bail!("not supported yet"); } Payload::InstanceSection(s) => { validator.instance_section(&s)?; - unreachable!() + bail!("not supported yet"); } Payload::ModuleSectionEntry { parser: _, range: _, } => { validator.module_section_entry(); - unreachable!() + bail!("not supported yet"); } Payload::ModuleSectionStart { count, @@ -258,11 +258,14 @@ impl Module { size: _, } => { validator.module_section_start(count, &range)?; - unreachable!() + bail!("not supported yet"); } // exception handling is not implemented yet. - Payload::EventSection(_) => unreachable!(), + Payload::EventSection(reader) => { + validator.event_section(&reader)?; + bail!("not supported yet"); + } } }