NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #2678 most downloaded on crates.io
A library for performing WebAssembly transformations
Last release 28 days ago
10 Sep 2026
Ships unpredictably
gaps range from 8 days to 10 months
Some releases are documented
notes for 29 of 53 stable releases
1 version withdrawn
withdrawn after publishing
8 years old
54 releases · first in 2019
DW_AT_high_pc is now emitted as fixed-width DW_FORM_data4 (as LLVM does) rather than DW_FORM_udata. Tools that patch code addresses in place, such as
DW_AT_high_pc is now emitted as fixed-width DW_FORM_data4 (as LLVM does)
rather than DW_FORM_udata. Tools that patch code addresses in place, such
as binaryen's DWARF update under wasm-opt -g, rely on the encoded size not
changing and aborted with "compile unit size was incorrect" on walrus output.fix: tombstone removed-code DWARF addresses as -2, not -1 by @guybedford in #322
Full Changelog: 0.27.0...0.27.1
One column per quarter.
-2 instead of -1.
In DWARF 4 .debug_loc/.debug_ranges with 4-byte addresses a begin of
-1 is the base address selection marker, so the previous tombstone made
the rest of the section unparseable (llvm-dwarfdump: "unexpected end of
data"; wasm-opt -g: "debug_loc error").fix: keep dynamic-link metadata before standard sections by @danlapid in #320
Full Changelog: 0.26.5...0.27.0
Released 2026-09-08.
memory.discard experimental instruction removeddylink.0 and legacy dylink metadata before standard sections, preserving their payloads.memory.discard experimental instruction removed
Released 2026-09-08.
memory.discard experimental instruction removeddylink.0 and legacy dylink metadata before standard sections, preserving their payloads.Add memory.discard instruction support (memory-control proposal) by @guybedford in #319
Full Changelog: 0.26.4...0.26.5
Fix MVP element-segment encoding for table64 active segments by @guybedford in #317
Full Changelog: 0.26.3...0.26.4
Fix panic parsing legacy try/catch with a multi-value handler signature by @avrabe in #316
test: spec test suite cleanup by @guybedford in #313
ModuleProducers fields by @daxpedda in #314Full Changelog: 0.26.1...0.26.2
Remove producer section from test checks by @logan-gatlin in #307
Full Changelog: 0.26.0...0.26.1
feat: Full support for GC extension by @logan-gatlin in #304
Full Changelog: 0.25.2...0.26.0
Fix imported memory serialization to preserve flags
Fix imported memory serialization to preserve flags (#303)
Downgrade gimli from 0.33 to 0.32 by @guybedford in #302
Full Changelog: 0.25.0...0.25.1
fix: dfs_pre_order_mut not visiting inside catch and catchall blocks by @logan-gatlin in #297
i64.atomic.rmw8.xchg_u (fixes #299) by @aaronmunsters in #300Full Changelog: 0.24.4...0.25.0
Nothing published for this version
fix: trytable visit implementaiton by @guybedford in #295
Full Changelog: 0.24.3...0.24.4
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Added support for typed select instructions.
Released 2020-02-03.
select instructions.--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
Added support for multi-value Wasm!
Released 2019-09-10.
Added support for multi-value Wasm!
Added ModuleExports::get_exported_{func, table, memory, global} helper
functions to get an export by the id of the thing that it is exporting (if
any).
Added fuzz testing with libFuzzer and cargo fuzz.
No longer using the "derive" feature from failure, which should result in
slimmer dependency graphs and faster builds.
Module::emit_wasm is no longer fallible. It never actually did ever return
an Err and now the type signature reflects that.
walrus::Module::write_graphviz_dot: You can now render a whole Wasm module as a GraphViz Dot file (previously you could only do one function at a time
Released 2019-08-13.
walrus::Module::write_graphviz_dot: You can now render a whole Wasm module
as a GraphViz Dot file (previously you could only do one function at a time)
and it will also show the relationships between all the various Wasm
structures (previously it only showed the relationships between instructions).The intermediate representation for instructions (walrus::ir::*) has been
overhauled. Expr has been renamed to Instr, and an operator no longer
points to its operands as nested children in the AST. Instead of representing
every instruction as a node in an AST, now there is a tree of instruction
sequences. An instruction sequence is a vector of Instrs that relate to each
other implicitly via their effect on the stack. A nested block ... end,
loop ... end, or if ... else ... end form new nested instruction
sequences.
The Visitor and VisitorMut traits and traversing the IR has also been
overhauled:
Visitors are no longer recursive, and should never recursively call
self.visit_foo() from inside self.visit_bar(). Not in the default
provided trait methods and not in any user-written overrides of those
trait methods.
There are now traversal functions which take a visitor, a
LocalFunction, and a start InstrSeqId, and then perform some kind of
traversal over the function's IR from the given start sequence. These
traversal functions are not recursive, and are implemented with explicit
work lists and while loops. This avoids blowing the stack on deeply nested
Wasm inputs. Although we can still OOM, we leave fixing that to future
PRs. Right now there are only two traversals, because that is all we've
needed so far: an in-order DFS for immutable visitors (needs to be
in-order so we can encode instructions in the right order) and a pre-order
DFS for mutable visitors (pre-order is the easiest traversal to implement
iteratively). We can add more traversals as we need them.
The Dot trait has been made internal. Use the new
walrus::Module::write_graphviz_dot method instead.
The Visit trait is no longer exported in the public API, and has been made
internal. Use the new traversal functions instead (walrus::ir::dfs_in_order
and walrus::ir::dfs_pre_order_mut).
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
Added ModuleExports::iter_mut for iterating over exclusive references to a module's exports.
Released 2019-06-05.
Added ModuleExports::iter_mut for iterating over exclusive references to a
module's exports.
Added a ModuleConfig::on_parse hook, which has access to a map from indices
in the original Wasm binary to the newly assigned walrus IDs. This is a good
time to parse custom sections that reference functions or types or whatever by
index.
The TableKind enum now has various unwrap_* helpers to get a particular
variant's inner data or else panic.
Added ModuleFunctions::by_name to get a function ID by function name.
CustomSection::data trait method now has a new parameter: a map from
walrus IDs to their indices in the new wasm binary we are emitting. This is
useful for custom sections that reference functions or types or whatever by
index.Added the walrus::ModuleCustomSections API for working with arbitrary custom sections, including and especially custom sections that walrus itself has
Released 2019-05-17.
Added the walrus::ModuleCustomSections API for working with arbitrary custom
sections, including and especially custom sections that walrus itself has no
special knowledge of. This is exposed as the customs field of a
walrus::Module.
Added the Module::with_config constructor method to create a default, empty
module that uses the given configuration.
walrus::Module::custom vector of raw custom modules has been removed and
is superceded by the new walrus::ModuleCustomSections API. If you were using
this and the old CustomSection type, switch to use the RawCustomSection
type with ModuleCustomSections.Nothing published for this version
ModuleConfig::parse_file and Module::parse_file_with_config helper functions to easily parse a Wasm file from disk with a given configuration.
Released 2019-05-02.
ModuleConfig::parse_file and Module::parse_file_with_config helper
functions to easily parse a Wasm file from disk with a given configuration.ModuleConfig::parse takes &self instead of &mut self now. This was just
an oversight / copy-past error before.--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
Added support for the reference types wasm proposal. #50
Released 2019-02-19.
FunctionBuilder with the relevant &mut parts of a module,
rather than a whole &mut Module. This is useful when some parts of the
module are mutably borrowed
elsewhere. #56FunctionBuilder from an existing LocalFunction so you can build
new expressions for the
function. #54id getter for
Imports. #59WithSideEffects expression variant can have arbitrary stack-neutral side
effects before its value now, in addition to after its
value. #55Added configuration options for controlling emission of the producers section
Released 2019-02-14.
Added configuration options for controlling emission of the DWARF and name custom sections.
Released 2019-02-14.
Released 2019-02-12. ### Added * Initial release!
Released 2019-02-12.
Your coding agent can read these notes before it upgrades. Set up the MCP server →