From bf1cec562e73836c1ea0a6a30f8299acb9e5427d Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Fri, 30 Oct 2026 13:51:17 -0700 Subject: [PATCH] Update wasm-tools dependencies Keepin up-to-date. Required explicitly rejecting some new AST constructs such as multibyte-array-access and acquire-release-atomics. --- Cargo.lock | 180 ++++++++++++------ Cargo.toml | 24 +-- .../src/translate/code_translator.rs | 25 ++- crates/environ/src/fact/trampoline.rs | 7 +- crates/fuzzing/src/generators/stacks.rs | 5 +- crates/fuzzing/src/oracles/memory.rs | 12 +- crates/wast/src/component.rs | 33 +++- crates/wizer/src/component/instrument.rs | 4 +- supply-chain/imports.lock | 49 +++-- winch/codegen/src/codegen/mod.rs | 42 ++-- winch/codegen/src/visitor.rs | 11 +- 11 files changed, 279 insertions(+), 113 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3524655616c9..5a45e3a69357 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -570,7 +570,7 @@ dependencies = [ "test-programs-artifacts", "tokio", "wasm-compose", - "wasmparser 0.262.0", + "wasmparser 0.263.0", "wasmtime", "wasmtime-wasi", ] @@ -2200,14 +2200,14 @@ dependencies = [ [[package]] name = "json-from-wast" -version = "0.262.0" +version = "0.263.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1515408a2e3983e7db5e379fac2d0e5ad5df7890160c4d6a4f669eaf2b212833" +checksum = "22fa7acd574900a0144c8e6c4d99425c613c42d5e749a79fd86ab81b0b67cce4" dependencies = [ "anyhow", "serde", "serde_derive", - "wast 262.0.0", + "wast 263.0.0", ] [[package]] @@ -3810,7 +3810,7 @@ dependencies = [ "wasmtime", "wasmtime-test-util", "wat", - "wit-component 0.262.0", + "wit-component 0.263.0", ] [[package]] @@ -4271,7 +4271,7 @@ name = "verify-component-adapter" version = "51.0.0-dev" dependencies = [ "anyhow", - "wasmparser 0.262.0", + "wasmparser 0.263.0", "wat", ] @@ -4348,7 +4348,7 @@ dependencies = [ "byte-array-literals", "object 0.40.0", "wasip1", - "wasm-encoder 0.262.0", + "wasm-encoder 0.263.0", "wit-bindgen-rust-macro 0.63.0", ] @@ -4378,17 +4378,17 @@ dependencies = [ [[package]] name = "wasm-compose" -version = "0.262.0" +version = "0.263.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "310f2ca84cded739b16ecf9c57631e55b8f99e23da03680e8c42a30a12fb583a" +checksum = "556cf3f0ea89f5944d254f94fcda920e3e6f79d892dc8558dfee493e52d775b4" dependencies = [ "anyhow", "indexmap 2.14.0", "log", "petgraph", "smallvec 1.15.1", - "wasm-encoder 0.262.0", - "wasmparser 0.262.0", + "wasm-encoder 0.263.0", + "wasmparser 0.263.0", "wat", ] @@ -4412,6 +4412,16 @@ dependencies = [ "wasmparser 0.262.0", ] +[[package]] +name = "wasm-encoder" +version = "0.263.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b883a26aea02eaabe2d2c3fba7eb039ef5cdcb5d5201ae5551e73d5e251a81f" +dependencies = [ + "leb128fmt", + "wasmparser 0.263.0", +] + [[package]] name = "wasm-metadata" version = "0.244.0" @@ -4436,32 +4446,44 @@ dependencies = [ "wasmparser 0.262.0", ] +[[package]] +name = "wasm-metadata" +version = "0.263.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8997a297f42413bee775d73a750def062ee1ec4a6d904703cb08046c0296774d" +dependencies = [ + "anyhow", + "indexmap 2.14.0", + "wasm-encoder 0.263.0", + "wasmparser 0.263.0", +] + [[package]] name = "wasm-mutate" -version = "0.262.0" +version = "0.263.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f150fafe16364db7c59261ec9e112445823add9602fbeec7d01610d3af9430e2" +checksum = "9f98a0627474a54264353d4d5177a80840dda0ff05a1d25e22f5004ccd3cf474" dependencies = [ "egg", "log", "rand 0.10.1", "thiserror 2.0.17", - "wasm-encoder 0.262.0", - "wasmparser 0.262.0", + "wasm-encoder 0.263.0", + "wasmparser 0.263.0", ] [[package]] name = "wasm-smith" -version = "0.262.0" +version = "0.263.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59ba1915172128cdc0ef870cae157e539882a9605e591ef36d0d2e9cbb73505" +checksum = "1102593f74a5b8b496683ea553f55a899a54461a5ad370d1a9eafd32e698a29d" dependencies = [ "anyhow", "arbitrary", "flagset", "serde", "serde_derive", - "wasm-encoder 0.262.0", + "wasm-encoder 0.263.0", "wat", ] @@ -4475,14 +4497,14 @@ dependencies = [ [[package]] name = "wasm-wave" -version = "0.262.0" +version = "0.263.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9290c2d9b4528528199374292c051d5b3d4d401e464a90235da45d78f42f00a2" +checksum = "ee6d8d3340761c0f41fe624a1e88be7ae81c17a2c086a2286ada584d3c475188" dependencies = [ "anyhow", "logos", "thiserror 2.0.17", - "wit-parser 0.262.0", + "wit-parser 0.263.0", ] [[package]] @@ -4552,6 +4574,18 @@ name = "wasmparser" version = "0.262.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "974d643b125b272607e2fff8012ea14a8328acd7621e4bafa7afb32500052b1b" +dependencies = [ + "bitflags 2.11.1", + "hashbrown 0.17.0", + "indexmap 2.14.0", + "semver", +] + +[[package]] +name = "wasmparser" +version = "0.263.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f5fa0a054ae153606df820eb0a84213e28cda41bbe04ba2628e71b6ba100fcb" dependencies = [ "bitflags 2.11.1", "hashbrown 0.17.0", @@ -4562,13 +4596,13 @@ dependencies = [ [[package]] name = "wasmprinter" -version = "0.262.0" +version = "0.263.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3232d77b0187af27c1eb54c3f368cc51b3f899e58637ec9f52d47201f75d4d04" +checksum = "b40c3aedc383a68866a7bae302578765c3f05c9e11ea6d242e5cc450f8300a26" dependencies = [ "anyhow", "termcolor", - "wasmparser 0.262.0", + "wasmparser 0.263.0", ] [[package]] @@ -4611,9 +4645,9 @@ dependencies = [ "tempfile", "tokio", "wasm-compose", - "wasm-encoder 0.262.0", + "wasm-encoder 0.263.0", "wasm-wave", - "wasmparser 0.262.0", + "wasmparser 0.263.0", "wasmtime-environ", "wasmtime-internal-cache", "wasmtime-internal-component-macro", @@ -4630,7 +4664,7 @@ dependencies = [ "wasmtime-test-util", "wat", "windows-sys 0.61.2", - "wit-parser 0.262.0", + "wit-parser 0.263.0", ] [[package]] @@ -4724,8 +4758,8 @@ dependencies = [ "toml", "tracing", "walkdir", - "wasm-encoder 0.262.0", - "wasmparser 0.262.0", + "wasm-encoder 0.263.0", + "wasmparser 0.263.0", "wasmprinter", "wasmtime", "wasmtime-cli-flags", @@ -4747,10 +4781,10 @@ dependencies = [ "wasmtime-wasi-tls", "wasmtime-wast", "wasmtime-wizer", - "wast 262.0.0", + "wast 263.0.0", "wat", "windows-sys 0.61.2", - "wit-component 0.262.0", + "wit-component 0.263.0", ] [[package]] @@ -4794,8 +4828,8 @@ dependencies = [ "sha2", "smallvec 1.15.1", "target-lexicon 0.13.5", - "wasm-encoder 0.262.0", - "wasmparser 0.262.0", + "wasm-encoder 0.263.0", + "wasmparser 0.263.0", "wasmprinter", "wasmtime-internal-component-util", "wasmtime-internal-core", @@ -4809,7 +4843,7 @@ dependencies = [ "arbitrary", "env_logger 0.11.5", "libfuzzer-sys", - "wasmparser 0.262.0", + "wasmparser 0.263.0", "wasmprinter", "wasmtime-environ", "wasmtime-test-util", @@ -4841,7 +4875,7 @@ dependencies = [ "rand 0.10.1", "smallvec 1.15.1", "target-lexicon 0.13.5", - "wasmparser 0.262.0", + "wasmparser 0.263.0", "wasmtime", "wasmtime-fuzzing", "wasmtime-internal-core", @@ -4869,12 +4903,12 @@ dependencies = [ "tempfile", "tokio", "v8", - "wasm-encoder 0.262.0", + "wasm-encoder 0.263.0", "wasm-mutate", "wasm-smith", "wasm-spec-interpreter", "wasmi", - "wasmparser 0.262.0", + "wasmparser 0.263.0", "wasmprinter", "wasmtime", "wasmtime-cli-flags", @@ -4931,7 +4965,7 @@ dependencies = [ "wasmtime", "wasmtime-internal-component-util", "wasmtime-internal-wit-bindgen", - "wit-parser 0.262.0", + "wit-parser 0.263.0", ] [[package]] @@ -4965,7 +4999,7 @@ dependencies = [ "smallvec 1.15.1", "target-lexicon 0.13.5", "thiserror 2.0.17", - "wasmparser 0.262.0", + "wasmparser 0.263.0", "wasmtime-environ", "wasmtime-internal-core", "wasmtime-internal-unwinder", @@ -5084,7 +5118,7 @@ dependencies = [ "log", "object 0.40.0", "target-lexicon 0.13.5", - "wasmparser 0.262.0", + "wasmparser 0.263.0", "wasmtime-environ", "wasmtime-internal-cranelift", "winch-codegen", @@ -5098,8 +5132,8 @@ dependencies = [ "bitflags 2.11.1", "heck", "indexmap 2.14.0", - "wit-component 0.262.0", - "wit-parser 0.262.0", + "wit-component 0.263.0", + "wit-parser 0.263.0", ] [[package]] @@ -5143,7 +5177,7 @@ dependencies = [ "serde_derive", "target-lexicon 0.13.5", "toml", - "wasmparser 0.262.0", + "wasmparser 0.263.0", "wasmprinter", "wasmtime", "wasmtime-environ", @@ -5293,9 +5327,9 @@ dependencies = [ "object 0.40.0", "serde_json", "tokio", - "wasmparser 0.262.0", + "wasmparser 0.263.0", "wasmtime", - "wast 262.0.0", + "wast 263.0.0", ] [[package]] @@ -5309,8 +5343,8 @@ dependencies = [ "rayon", "test-programs-artifacts", "tokio", - "wasm-encoder 0.262.0", - "wasmparser 0.262.0", + "wasm-encoder 0.263.0", + "wasmparser 0.263.0", "wasmprinter", "wasmtime", "wasmtime-wasi", @@ -5328,25 +5362,25 @@ dependencies = [ [[package]] name = "wast" -version = "262.0.0" +version = "263.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30612a0c29249b5f185888a107e8a519d920226b7d07f9d351fd094e9f75eb23" +checksum = "69d90bcf581b501aa1c358bc5dc0faa979cd375796908860ebcb6d1d70b907c7" dependencies = [ "bumpalo", "gimli 0.34.0", "leb128fmt", "memchr", "unicode-width 0.2.0", - "wasm-encoder 0.262.0", + "wasm-encoder 0.263.0", ] [[package]] name = "wat" -version = "1.262.0" +version = "1.263.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e228027f2b07bbaf946980ebbe2437fca73be6f54c40c2a8d4f42f277075f8d1" +checksum = "bbc9c5aca783b3f1838be89f3f9937c528b90ec5faa6fb62d809726c16a7d8f7" dependencies = [ - "wast 262.0.0", + "wast 263.0.0", ] [[package]] @@ -5473,7 +5507,7 @@ dependencies = [ "smallvec 1.15.1", "target-lexicon 0.13.5", "thiserror 2.0.17", - "wasmparser 0.262.0", + "wasmparser 0.263.0", "wasmtime-environ", "wasmtime-internal-core", "wasmtime-internal-cranelift", @@ -5786,6 +5820,25 @@ dependencies = [ "wit-parser 0.262.0", ] +[[package]] +name = "wit-component" +version = "0.263.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4189bd180353b942b788715519dff886517b540e648c6f6e5129f57429945bf7" +dependencies = [ + "anyhow", + "bitflags 2.11.1", + "indexmap 2.14.0", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder 0.263.0", + "wasm-metadata 0.263.0", + "wasmparser 0.263.0", + "wit-parser 0.263.0", +] + [[package]] name = "wit-parser" version = "0.244.0" @@ -5823,6 +5876,25 @@ dependencies = [ "wasmparser 0.262.0", ] +[[package]] +name = "wit-parser" +version = "0.263.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874d6ce9db4261cb66980ab14f3da066b24292497b6f46f988c0d1b9b27913f3" +dependencies = [ + "anyhow", + "hashbrown 0.17.0", + "id-arena", + "indexmap 2.14.0", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-ident", + "wasmparser 0.263.0", +] + [[package]] name = "witx" version = "0.9.1" diff --git a/Cargo.toml b/Cargo.toml index e41b00b3e69a..6bac94ea5189 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -372,18 +372,18 @@ wit-bindgen = { version = "0.63.0", default-features = false } wit-bindgen-rust-macro = { version = "0.63.0", default-features = false } # wasm-tools family: -wasmparser = { version = "0.262.0", default-features = false, features = ['simd'] } -wat = "1.262.0" -wast = "262.0.0" -wasmprinter = "0.262.0" -wasm-encoder = "0.262.0" -wasm-smith = "0.262.0" -wasm-mutate = "0.262.0" -wit-parser = "0.262.0" -wit-component = "0.262.0" -wasm-wave = "0.262.0" -wasm-compose = { version = "0.262.0", default-features = false } -json-from-wast = "0.262.0" +wasmparser = { version = "0.263.0", default-features = false, features = ['simd'] } +wat = "1.263.0" +wast = "263.0.0" +wasmprinter = "0.263.0" +wasm-encoder = "0.263.0" +wasm-smith = "0.263.0" +wasm-mutate = "0.263.0" +wit-parser = "0.263.0" +wit-component = "0.263.0" +wasm-wave = "0.263.0" +wasm-compose = { version = "0.263.0", default-features = false } +json-from-wast = "0.263.0" wstd = "0.6.5" wasip2 = "1.0" diff --git a/crates/cranelift/src/translate/code_translator.rs b/crates/cranelift/src/translate/code_translator.rs index 027f0a004635..4347125a5653 100644 --- a/crates/cranelift/src/translate/code_translator.rs +++ b/crates/cranelift/src/translate/code_translator.rs @@ -93,7 +93,7 @@ use itertools::Itertools; use smallvec::{SmallVec, ToSmallVec}; use std::collections::{HashMap, hash_map}; use std::vec::Vec; -use wasmparser::{FuncValidator, MemArg, Operator, WasmModuleResources}; +use wasmparser::{FuncValidator, MemArg, MemArgTarget, Operator, Ordering, WasmModuleResources}; use wasmtime_environ::{ DataIndex, ElemIndex, FuncIndex, GlobalIndex, MemoryIndex, TableIndex, TagIndex, TypeConvert, TypeIndex, WasmHeapType, WasmRefType, WasmResult, WasmValType, wasm_unsupported, @@ -1431,7 +1431,10 @@ pub fn translate_operator( Operator::MemoryAtomicWait32 { .. } => I32, _ => unreachable!(), }; - let memory_index = MemoryIndex::from_u32(memarg.memory); + let memory_index = match memarg.target { + MemArgTarget::Memory(index) => MemoryIndex::from_u32(index), + MemArgTarget::Array(_) => return Err(wasm_unsupported!("should not be valid")), + }; let heap = environ.get_or_create_heap(builder.func, memory_index); let timeout = environ.stacks.pop1(); // 64 (fixed) let expected = environ.stacks.pop1(); // 32 or 64 (per the `Ixx` in `IxxAtomicWait`) @@ -1457,7 +1460,10 @@ pub fn translate_operator( environ.stacks.push1(res); } Operator::MemoryAtomicNotify { memarg } => { - let memory_index = MemoryIndex::from_u32(memarg.memory); + let memory_index = match memarg.target { + MemArgTarget::Memory(index) => MemoryIndex::from_u32(index), + MemArgTarget::Array(_) => return Err(wasm_unsupported!("should not be valid")), + }; let heap = environ.get_or_create_heap(builder.func, memory_index); let count = environ.stacks.pop1(); // 32 (fixed) let addr = environ.stacks.pop1(); @@ -1675,7 +1681,10 @@ pub fn translate_operator( translate_atomic_cas(I64, I32, memarg, builder, environ)? } - Operator::AtomicFence { .. } => { + Operator::AtomicFence { ordering } => { + if *ordering != Ordering::SeqCst { + return Err(wasm_unsupported!("acquire-release-atomics")); + } builder.ins().fence(); } Operator::MemoryCopy { src_mem, dst_mem } => { @@ -3619,7 +3628,10 @@ fn prepare_addr( ) -> WasmResult> { let index = environ.stacks.pop1(); - let memory_index = MemoryIndex::from_u32(memarg.memory); + let memory_index = match memarg.target { + MemArgTarget::Memory(index) => MemoryIndex::from_u32(index), + MemArgTarget::Array(_) => return Err(wasm_unsupported!("multibyte-array-access proposal")), + }; let heap = environ.get_or_create_heap(builder.func, memory_index); // How exactly the bounds check is performed here and what it's performed @@ -3820,6 +3832,9 @@ fn prepare_atomic_addr( builder: &mut FunctionBuilder, environ: &mut FuncEnvironment<'_>, ) -> WasmResult> { + if memarg.ordering.is_some() { + return Err(wasm_unsupported!("acquire-release-atomics")); + } align_atomic_addr(memarg, loaded_bytes, builder, environ); prepare_addr(memarg, loaded_bytes, builder, environ) } diff --git a/crates/environ/src/fact/trampoline.rs b/crates/environ/src/fact/trampoline.rs index 85a0800173d8..ecbbd75f6f9b 100644 --- a/crates/environ/src/fact/trampoline.rs +++ b/crates/environ/src/fact/trampoline.rs @@ -35,7 +35,9 @@ use crate::{FuncIndex, GlobalIndex, IndexType, NUM_COMPONENT_CONTEXT_SLOTS, Trap use std::collections::HashMap; use std::mem; use std::ops::Range; -use wasm_encoder::{BlockType, Catch, Encode, Instruction, Instruction::*, MemArg, ValType}; +use wasm_encoder::{ + BlockType, Catch, Encode, Instruction, Instruction::*, MemArg, MemArgTarget, ValType, +}; use wasmtime_component_util::{DiscriminantSize, FlagsSize}; use super::DataModel; @@ -4506,7 +4508,8 @@ impl<'a> Memory<'a> { MemArg { offset: u64::from(self.offset), align, - memory_index: self.mem_opts().memory.unwrap().0.as_u32(), + target: MemArgTarget::Memory(self.mem_opts().memory.unwrap().0.as_u32()), + ordering: None, } } diff --git a/crates/fuzzing/src/generators/stacks.rs b/crates/fuzzing/src/generators/stacks.rs index 78c92234e1b8..48071cdffc98 100644 --- a/crates/fuzzing/src/generators/stacks.rs +++ b/crates/fuzzing/src/generators/stacks.rs @@ -9,7 +9,7 @@ use std::mem; use std::num::NonZeroUsize; use arbitrary::{Arbitrary, Result, Unstructured}; -use wasm_encoder::{Instruction, ValType}; +use wasm_encoder::{Instruction, MemArgTarget, ValType}; const MAX_FUNCS: u32 = 20; const MAX_OPS: usize = 1_000; @@ -260,7 +260,8 @@ impl Stacks { .instruction(&Instruction::I32Store(wasm_encoder::MemArg { offset: 0, align: 0, - memory_index: memory, + target: MemArgTarget::Memory(memory), + ordering: None, })) .instruction(&Instruction::GlobalGet(stack_len_global)) .instruction(&Instruction::I32Const(mem::size_of::() as i32)) diff --git a/crates/fuzzing/src/oracles/memory.rs b/crates/fuzzing/src/oracles/memory.rs index 9f01dc2e102b..288eb58f4dda 100644 --- a/crates/fuzzing/src/oracles/memory.rs +++ b/crates/fuzzing/src/oracles/memory.rs @@ -312,7 +312,8 @@ fn build_wasm(image: &HeapImage, offset: u32) -> Vec { wasm_encoder::MemArg { offset: u64::from(offset), align: 0, - memory_index: 0, + target: Default::default(), + ordering: None, }, )); func.instruction(&wasm_encoder::Instruction::End); @@ -328,7 +329,8 @@ fn build_wasm(image: &HeapImage, offset: u32) -> Vec { wasm_encoder::MemArg { offset: u64::from(offset), align: 0, - memory_index: 0, + target: Default::default(), + ordering: None, }, )); func.instruction(&wasm_encoder::Instruction::End); @@ -343,7 +345,8 @@ fn build_wasm(image: &HeapImage, offset: u32) -> Vec { func.instruction(&wasm_encoder::Instruction::I32Load(wasm_encoder::MemArg { offset: u64::from(offset), align: 0, - memory_index: 0, + target: Default::default(), + ordering: None, })); func.instruction(&wasm_encoder::Instruction::End); code.function(&func); @@ -357,7 +360,8 @@ fn build_wasm(image: &HeapImage, offset: u32) -> Vec { func.instruction(&wasm_encoder::Instruction::I64Load(wasm_encoder::MemArg { offset: u64::from(offset), align: 0, - memory_index: 0, + target: Default::default(), + ordering: None, })); func.instruction(&wasm_encoder::Instruction::End); code.function(&func); diff --git a/crates/wast/src/component.rs b/crates/wast/src/component.rs index 48843b319a50..095b5ab03699 100644 --- a/crates/wast/src/component.rs +++ b/crates/wast/src/component.rs @@ -49,6 +49,13 @@ pub fn val(v: &ComponentConst<'_>) -> Result { Err(v) => Err(payload_val(v.as_deref())?), }), ComponentConst::Flags(v) => Val::Flags(v.iter().map(|s| s.to_string()).collect()), + ComponentConst::Map(entries) => { + let mut pairs = Vec::new(); + for (k, v) in entries { + pairs.push((val(k)?, val(v)?)); + } + Val::Map(pairs) + } }) } @@ -132,7 +139,7 @@ pub fn match_val(expected: &ComponentConst<'_>, actual: &Val) -> Result<()> { }, ComponentConst::Record(e) => match actual { Val::Record(a) => { - if e.len() != e.len() { + if e.len() != a.len() { bail!("mismatched number of record fields"); } for ((e_name, e_val), (a_name, a_val)) in e.iter().zip(a.iter()) { @@ -207,6 +214,29 @@ pub fn match_val(expected: &ComponentConst<'_>, actual: &Val) -> Result<()> { } _ => mismatch(expected, actual), }, + ComponentConst::Map(e) => match actual { + Val::Map(a) => { + if e.len() != a.len() { + bail!("expected {} map entries got {}", e.len(), a.len()); + } + let mut used = vec![false; a.len()]; + for (e_key, e_val) in e { + let found = a.iter().enumerate().position(|(i, (a_key, a_val))| { + !used[i] + && match_val(e_key, a_key).is_ok() + && match_val(e_val, a_val).is_ok() + }); + match found { + Some(i) => used[i] = true, + None => bail!( + "expected map entry ({e_key:?}, {e_val:?}) not found in {actual:?}" + ), + } + } + Ok(()) + } + _ => mismatch(expected, actual), + }, } } @@ -263,6 +293,7 @@ fn mismatch(expected: &ComponentConst<'_>, actual: &Val) -> Result<()> { ComponentConst::Option(..) => "option", ComponentConst::Result(..) => "result", ComponentConst::Flags(..) => "flags", + ComponentConst::Map(..) => "map", }; let actual = match actual { Val::Bool(..) => "bool", diff --git a/crates/wizer/src/component/instrument.rs b/crates/wizer/src/component/instrument.rs index 6562e217a983..db8448b3f20e 100644 --- a/crates/wizer/src/component/instrument.rs +++ b/crates/wizer/src/component/instrument.rs @@ -1,6 +1,7 @@ use crate::ModuleContext; use crate::component::info::{Accessor, RawSection}; use crate::component::{ComponentContext, WIZER_INSTANCE}; +use wasm_encoder::MemArgTarget; use wasm_encoder::reencode::{Reencode, RoundtripReencoder}; use wasmtime::{Result, bail}; @@ -248,7 +249,8 @@ impl AccessorBuilder<'_> { let memarg = |offset| wasm_encoder::MemArg { align: 2, offset, - memory_index: self.accessor_nmemories, + target: MemArgTarget::Memory(self.accessor_nmemories), + ordering: None, }; // Store the ptr/len into the page that was just allocated ins.local_get(0); diff --git a/supply-chain/imports.lock b/supply-chain/imports.lock index ab39e71d566a..d6de76fb17be 100644 --- a/supply-chain/imports.lock +++ b/supply-chain/imports.lock @@ -1146,8 +1146,8 @@ user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.json-from-wast]] -version = "0.262.0" -when = "2026-10-13" +version = "0.263.0" +when = "2026-10-30" trusted-publisher = "github:bytecodealliance/wasm-tools" [[publisher.libc]] @@ -1633,8 +1633,8 @@ user-login = "alexcrichton" user-name = "Alex Crichton" [[publisher.wasm-compose]] -version = "0.262.0" -when = "2026-10-13" +version = "0.263.0" +when = "2026-10-30" trusted-publisher = "github:bytecodealliance/wasm-tools" [[publisher.wasm-encoder]] @@ -1647,6 +1647,11 @@ version = "0.262.0" when = "2026-10-13" trusted-publisher = "github:bytecodealliance/wasm-tools" +[[publisher.wasm-encoder]] +version = "0.263.0" +when = "2026-10-30" +trusted-publisher = "github:bytecodealliance/wasm-tools" + [[publisher.wasm-metadata]] version = "0.236.0" when = "2025-07-28" @@ -1658,9 +1663,14 @@ version = "0.262.0" when = "2026-10-13" trusted-publisher = "github:bytecodealliance/wasm-tools" +[[publisher.wasm-metadata]] +version = "0.263.0" +when = "2026-10-30" +trusted-publisher = "github:bytecodealliance/wasm-tools" + [[publisher.wasm-wave]] -version = "0.262.0" -when = "2026-10-13" +version = "0.263.0" +when = "2026-10-30" trusted-publisher = "github:bytecodealliance/wasm-tools" [[publisher.wasmparser]] @@ -1673,9 +1683,14 @@ version = "0.262.0" when = "2026-10-13" trusted-publisher = "github:bytecodealliance/wasm-tools" +[[publisher.wasmparser]] +version = "0.263.0" +when = "2026-10-30" +trusted-publisher = "github:bytecodealliance/wasm-tools" + [[publisher.wasmprinter]] -version = "0.262.0" -when = "2026-10-13" +version = "0.263.0" +when = "2026-10-30" trusted-publisher = "github:bytecodealliance/wasm-tools" [[publisher.wasmtime]] @@ -1829,13 +1844,13 @@ when = "2026-10-02" trusted-publisher = "github:bytecodealliance/wasmtime" [[publisher.wast]] -version = "262.0.0" -when = "2026-10-13" +version = "263.0.0" +when = "2026-10-30" trusted-publisher = "github:bytecodealliance/wasm-tools" [[publisher.wat]] -version = "1.262.0" -when = "2026-10-13" +version = "1.263.0" +when = "2026-10-30" trusted-publisher = "github:bytecodealliance/wasm-tools" [[publisher.wiggle]] @@ -2053,6 +2068,11 @@ version = "0.262.0" when = "2026-10-13" trusted-publisher = "github:bytecodealliance/wasm-tools" +[[publisher.wit-component]] +version = "0.263.0" +when = "2026-10-30" +trusted-publisher = "github:bytecodealliance/wasm-tools" + [[publisher.wit-parser]] version = "0.244.0" when = "2026-01-06" @@ -2063,6 +2083,11 @@ version = "0.262.0" when = "2026-10-13" trusted-publisher = "github:bytecodealliance/wasm-tools" +[[publisher.wit-parser]] +version = "0.263.0" +when = "2026-10-30" +trusted-publisher = "github:bytecodealliance/wasm-tools" + [[publisher.witx]] version = "0.9.1" when = "2021-06-22" diff --git a/winch/codegen/src/codegen/mod.rs b/winch/codegen/src/codegen/mod.rs index a3ba7a2e462c..8ac8b3c245e2 100644 --- a/winch/codegen/src/codegen/mod.rs +++ b/winch/codegen/src/codegen/mod.rs @@ -19,8 +19,8 @@ use cranelift_codegen::{ use smallvec::SmallVec; use std::marker::PhantomData; use wasmparser::{ - BinaryReader, FuncValidator, MemArg, Operator, OperatorsReader, ValidatorResources, - VisitOperator, VisitSimdOperator, WasmFeatures, + BinaryReader, FuncValidator, MemArg, MemArgTarget, Operator, OperatorsReader, + ValidatorResources, VisitOperator, VisitSimdOperator, WasmFeatures, }; use wasmtime_cranelift::{TRAP_BAD_SIGNATURE, TRAP_HEAP_MISALIGNED, TRAP_TABLE_OUT_OF_BOUNDS}; use wasmtime_environ::{ @@ -1527,6 +1527,9 @@ where memarg: &MemArg, access_size: OperandSize, ) -> Result> { + if memarg.ordering.is_some() { + bail!(wasm_unsupported!("acquire-release-atomics")); + } self.emit_check_align(heap, memarg, access_size)?; self.emit_compute_heap_address(heap, memarg, access_size) } @@ -1548,7 +1551,7 @@ where Ok(()) }; - let memory_index = MemoryIndex::from_u32(arg.memory); + let memory_index = memarg_memory_index(arg)?; let heap = self.env.resolve_heap(memory_index); // Ensure that the destination register is not allocated if @@ -1595,7 +1598,7 @@ where /// Emit a WebAssembly store. pub fn emit_wasm_store(&mut self, arg: &MemArg, kind: StoreKind) -> Result<()> { - let memory_index = MemoryIndex::from_u32(arg.memory); + let memory_index = memarg_memory_index(arg)?; let heap = self.env.resolve_heap(memory_index); let src = self.context.pop_to_reg(self.masm, None)?; @@ -2545,7 +2548,7 @@ where size: OperandSize, extend: Option>, ) -> Result<()> { - let memory_index = MemoryIndex::from_u32(arg.memory); + let memory_index = memarg_memory_index(arg)?; let heap = self.env.resolve_heap(memory_index); // We need to pop-push the operand to compute the address before passing control over to // masm, because some architectures may have specific requirements for the registers used @@ -2603,7 +2606,7 @@ where let replacement = self.context.pop_to_reg(self.masm, None)?; let expected = self.context.pop_to_reg(self.masm, None)?; - let memory_index = MemoryIndex::from_u32(arg.memory); + let memory_index = memarg_memory_index(arg)?; let heap = self.env.resolve_heap(memory_index); if let Some(addr) = self.emit_compute_heap_address_align_checked(&heap, arg, size)? { self.context @@ -2647,11 +2650,8 @@ where AtomicWaitKind::Wait32 => self.env.builtins.memory_atomic_wait32::()?, AtomicWaitKind::Wait64 => self.env.builtins.memory_atomic_wait64::()?, }; - let builtin = self.prepare_builtin_defined_memory_arg( - MemoryIndex::from_u32(arg.memory), - stack_len, - builtin, - )?; + let builtin = + self.prepare_builtin_defined_memory_arg(memarg_memory_index(arg)?, stack_len, builtin)?; if arg.offset != 0 { self.masm.checked_uadd( @@ -2692,11 +2692,8 @@ where // Put the target memory index as the first argument. let builtin = self.env.builtins.memory_atomic_notify::()?; let stack_len = self.context.stack.len(); - let builtin = self.prepare_builtin_defined_memory_arg( - MemoryIndex::from_u32(arg.memory), - stack_len, - builtin, - )?; + let builtin = + self.prepare_builtin_defined_memory_arg(memarg_memory_index(arg)?, stack_len, builtin)?; if arg.offset != 0 { self.masm.checked_uadd( @@ -2796,3 +2793,16 @@ pub fn control_index(depth: u32, control_length: usize) -> Result { .checked_sub(depth as usize) .ok_or_else(|| format_err!(CodeGenError::control_frame_expected())) } + +/// Returns the linear memory targeted by the given `MemArg`. +/// +/// Note that winch doesn't support the multibyte-array-access proposal at this +/// time hence this helper to return an error if that shows up. +fn memarg_memory_index(memarg: &MemArg) -> Result { + match memarg.target { + MemArgTarget::Memory(index) => Ok(MemoryIndex::from_u32(index)), + MemArgTarget::Array(_) => Err(format_err!(wasm_unsupported!( + "multibyte-array-access proposal" + ))), + } +} diff --git a/winch/codegen/src/visitor.rs b/winch/codegen/src/visitor.rs index fb51feeb1043..4c7f45a58918 100644 --- a/winch/codegen/src/visitor.rs +++ b/winch/codegen/src/visitor.rs @@ -24,13 +24,13 @@ use cranelift_codegen::ir::ExceptionTag; use regalloc2::RegClass; use smallvec::{SmallVec, smallvec}; use wasmparser::{ - BlockType, BrTable, HeapType, Ieee32, Ieee64, MemArg, TryTable, V128, ValType, VisitOperator, - VisitSimdOperator, + BlockType, BrTable, HeapType, Ieee32, Ieee64, MemArg, Ordering, TryTable, V128, ValType, + VisitOperator, VisitSimdOperator, }; use wasmtime_cranelift::TRAP_INDIRECT_CALL_TO_NULL; use wasmtime_environ::{ DataIndex, ElemIndex, FuncIndex, GlobalIndex, MemoryIndex, TableIndex, TagIndex, TypeConvert, - TypeIndex, WasmCompositeInnerType, WasmHeapType, WasmValType, + TypeIndex, WasmCompositeInnerType, WasmHeapType, WasmValType, wasm_unsupported, }; /// A macro to define unsupported WebAssembly operators. @@ -3004,7 +3004,10 @@ where self.emit_atomic_notify(&arg) } - fn visit_atomic_fence(&mut self) -> Self::Output { + fn visit_atomic_fence(&mut self, ordering: Ordering) -> Self::Output { + if ordering != Ordering::SeqCst { + bail!(wasm_unsupported!("acquire-release-atomics")); + } self.masm.fence() }