This document describes changes between tagged Binaryen versions.
To browse or download snapshots of old tagged versions, visit https://github.com/WebAssembly/binaryen/releases.
Not all changes are documented here. In particular, new features, user-oriented fixes, options, command-line parameters, usage changes, deprecations, significant internal modifications and optimizations etc. generally deserve a mention. To examine the full set of changes between versions, visit the link to full changeset diff at the end of each section.
- Add extra
memory64argument forBinaryenSetMemoryand newBinaryenMemoryIs64C-API method to determine 64-bit memory. (#4963) TypeBuilderSetSubTypenow takes a supertype as the second argument.call_refnow takes a mandatory signature type immediate.- If
THROW_ON_FATALis defined at compile-time, then fatal errors will throw astd::runtime_errorinstead of terminating the process. This may be used by embedders of Binaryen to recover from errors. - Implemented bottom heap types:
none,nofunc, andnoextern. RefNull expressions and nullLiterals must now have typenullref,nullfuncref, ornullexternref. - The C-API's
BinaryenTypeI31refandBinaryenTypeDatarefnow return nullable types. - The
sign-extensionandmutable-globalsfeatures are now both enabled by default in all tools. This is in order to match llvm's defaults (See https://reviews.llvm.org/D125728). - Add a pass to lower sign-extension operations to MVP.
- Add support for non-nullable locals in wasm GC. (#4959)
- Add support for multiple memories. (#4811)
- Add support for the wasm Strings proposal. (see PRs with [Strings] in name)
- Add a new flag to Directize,
--pass-arg=directize-initial-contents-immutablewhich indicates the initial table contents are immutable. That is the case for LLVM, for example, and it allows us to optimize more indirect calls to direct ones. (#4942) - Change constant values of some reference types in the C and JS APIs. This is
only observable if you hardcode specific values instead of calling the
relevant methods (like
BinaryenTypeDataref()). (#4755) BinaryenModulePrintStackIR,BinaryenModuleWriteStackIRandBinaryenModuleAllocateAndWriteStackIRnow have an extra boolean argumentoptimize. (#4832)- Remove support for the
letinstruction that has been removed from the typed function references spec. - HeapType::ext has been restored but is no longer a subtype of HeapType::any to match the latest updates in the GC spec. (#4898)
i31refanddatarefare now nullable to match the latest GC spec. (#4843)- Add support for
extern.externalizeandextern.internalize. (#4975)
- Add Global Struct Inference pass (#4659) (#4714)
- Restore and fix SpillPointers pass (#4570)
- Update relaxed SIMD instructions to latest spec
- Add CMake flag BUILD_TOOLS to control building tools (#4655)
- Add CMake flag JS_OF_OCAML for js_of_ocaml (#4637)
- Remove externref (#4633)
- Update the wasm GC type section binary format (#4625, #4631)
- Lift the restriction in liveness-traversal.h on max 65535 locals (#4567)
- Switch to nominal fuzzing by default (#4610)
- Refactor Feature::All to match FeatureSet.setAll() (#4557)
- New Signature Pruning pass (#4545)
- Add support for extended-const proposal (#4529)
- Add BUILD_TESTS CMake option to make gtest dependency optional.
- Updated tests to use filecheck 0.0.22 (#4537). Updating is required to
successfully run the lit tests. This can be done with
pip3 install -r requirements-dev.txt.
- [wasm2js] Support exports of Globals (#4523)
- MergeSimilarFunctions optimization pass (#4414)
- Various wasm-ctor-eval improvements, including support for GC.
- This release contains binaries for ARM64 MacOS devices (#4397)
- Otherwise, mostly bug fixes and incremental optimization improvements.
- Bugfixes only, release created due to incorrect github release artifacts in v103 release (#4398).
- The EffectAnalyzer now takes advantage of immutability of globals. To achieve
that it must have access to the module. That is already the case in the C++
API, but the JS API allowed one to optionally not add a module when calling
getSideEffects(). It is now mandatory to pass in the module. - JS and Wasm builds now emit ECMAScript modules. New usage is:
import Binaryen from "path/to/binaryen.js"; const binaryen = await Binaryen(); ...
- CallIndirect changed from storing a Signature to storing a HeapType
-
Add
BinaryenUpdateMapsto the C API. -
Adds a TrapsNeverHappen mode (#4059). This has many of the benefits of IgnoreImplicitTraps, but can be used safely in more cases. IgnoreImplicitTraps is now deprecated.
-
Adds type argument for BinaryenAddTable method (#4107). For the binaryen.js api this parameter is optional and by default is set to funcref type.
-
Replace
BinaryenExpressionGetSideEffects's features parameter with a module parameter. -
OptimizeInstructions now lifts identical code in
select/ifarms (#3828). This may cause directBinaryenTupleExtract(BinaryenTupleMake(...))to use multivalue types.
BinaryenSetFunctionTableandmodule.setFunctionTablehave been removed in favor ofBinaryenAddTableandmodule.addTablerespectively.BinaryenIsFunctionTableImportedis removed.- A new type
BinaryenElementSegmentRefhas been added to the C API with new apis in both C & JS:BinaryenAddActiveElementSegmentBinaryenAddPassiveElementSegmentBinaryenRemoveElementSegmentBinaryenGetElementSegmentBinaryenGetElementSegmentByIndexBinaryenElementSegmentGetNameBinaryenElementSegmentSetNameBinaryenElementSegmentGetTableBinaryenElementSegmentSetTableBinayenElementSegmentIsPassivemodule.addActiveElementSegmentmodule.addPassiveElementSegmentmodule.removeElementSegmentmodule.getElementSegmentmodule.getElementSegmentByIndexmodule.getTableSegmentsmodule.getNumElementSegmentsbinaryen.getElementSegmentInfo
BinaryenAddTableandmodule.addTableno longer take offset and function names.BinaryenGetNumFunctionTableSegmentsis replaced withBinaryenGetNumElementSegments.BinaryenGetFunctionTableSegmentOffsetis replaced withBinaryenElementSegmentGetOffset.BinaryenGetFunctionTableSegmentLengthis replaced withBinaryenElementSegmentGetLength.BinaryenGetFunctionTableSegmentDatais replaced withBinaryenElementSegmentGetData.- Boolean values in the C API now should use
boolinstead ofint. - Experimental SIMD instructions have been removed and the names and opcodes of the standard instructions have been updated to match the final spec.
wasm-disnow supports options to enable or disable Wasm features.- Reference types support has been improved by allowing multiple tables in a module.
call_indirectandreturn_call_indirectnow take an additional table name parameter. This is necessary for reference types support.- New getter/setter methods have been introduced for
call_indirecttable name:BinaryenCallIndirectGetTableBinaryenCallIndirectSetTable- JS API
CallIndirect.table
- New APIs have been added to add and manipulate multiple tables in a module:
BinaryenAddTableBinaryenRemoveTableBinaryenGetNumTablesBinaryenGetTableBinaryenGetTableByIndexBinaryenTableGetNameBinaryenTableGetInitialBinaryenTableHasMaxBinaryenTableGetMaxBinaryenTableImportGetModuleBinaryenTableImportGetBasemodule.addTablemodule.removeTablemodule.getTablemodule.getTableByIndexmodule.getNumTablesbinaryen.getTableInfo
- Fix optimization behavior on assuming memory is zero-filled. We made that
assumption before, but it is incorrect in general, which caused problems.
The fixed behavior is to not assume it, but require the user to pass it in as
a flag,
--zero-filled-memory. Large binaries with lots of empty bytes in the data section may regress without that flag. Toolchains like Emscripten can pass the flag automatically for users if they know it is right to assume, which can avoid any regressions. (#3306) RefFuncC and JS API constructors (BinaryenRefFuncandref.funcrespectively) now take an extratypeparameter, similar toRefNull. This is necessary for typed function references support.- JS API functions for atomic notify/wait instructions are renamed.
module.atomic.notify->module.memory.atomic.notifymodule.i32.atomic.wait->module.memory.atomic.wait32module.i64.atomic.wait->module.memory.atomic.wait64
- Remove old/broken SpollPointers pass. This pass: Spills values that might be pointers to the C stack. This allows Boehm-style GC to see them properly. This can be revived if needed from git history (#3261).
- Make
NUM_PARAMSinFuncCastEmulationa runtime configuration option namedmax-func-params. This defaults to the original value of 16. BinaryenGetFunction,BinaryenGetGlobalandBinaryenGetEventnow returnNULLinstead of aborting when the respective element does not yet exist.
- Add
--fast-mathmode. (#3155) - Initial implementation of "Memory64" proposal (#3130)
- Lots of changes in support of GC proposal
- Remove asm2wasm, which supported Emscripten's fastcomp backend, after fastcomp was removed.
- The new feature flag
--enable-anyrefenables just theanyreftype incl. basic subtyping ofexternref,funcrefandexnref(if enabled). - Enabling the exception handling or anyref features without also enabling reference types is a validation error now.
- The
Hostexpression and its respective APIs have been refactored into separateMemorySizeandMemoryGrowexpressions to align with other memory instructions.
- Fuzzing: Compare wasm2js to the interpreter (#3026)
- Fix CountLeadingZeroes on MSVC, which lead to bad optimizations (#3028)
- Asyncify verbose option (#3022)
- wasm2js: Add an "Export" scope for name resolution, avoids annoying warnings (#2998)
- Extend the C- and JS-APIs (#2586)
- Add Asyncify "add list" that adds to the list of functions to be instrumented. Rename old lists to be clearer and more consistent with that, so now there is "remove list" to remove, "add list" to add, and "only list" which if set means that only those functions should be instrumented and nothing else.
- Renamed various ambiguous C-API functions for consistency:
BinaryenBlockGetChildtoBinaryenBlockGetChildAtBinaryenSwitchGetNametoBinaryenSwitchGetNameAtBinaryenCallGetOperandtoBinaryenCallGetOperandAtBinaryenCallIndirectGetOperandtoBinaryenCallIndirectGetOperandAtBinaryenHostGetOperandtoBinaryenHostGetOperandAtBinaryenThrowGetOperandtoBinaryenThrowGetOperandAtBinaryenTupleMakeGetOperandtoBinaryenTupleMakeGetOperandAt
- The C-API's
BinaryenSetAPITracingand the JS-API'ssetAPITracinghave been removed because this feature was not very useful anymore and had a significant maintainance cost. - wasm-emscripten-finalize will no longer generate
stackSave,stackAlloc,stackRestorefunction. It not expects them to be included in the input file.
- First release with binaries built with github actions.
- The
multivaluefeature has been added. It allows functions and control flow structures to return tuples and for locals and globals to have tuple types. Tuples are created with the newtuple.makepseudoinstruction and their elements are retrieved with the newtuple.extractpseudoinstruction. - The internal type interner has been rewritten to avoid taking locks in far more situations. Depending on the workload, this may result in large speedups and increased parallelism.
- Represent the
dylinksection in Binaryen IR, so we can read, write, and update it.
BinaryenExpressionGetSideEffects(C API) andgetSideEffects(JS API) now takes an additionalfeaturesparameter.- Reference type support is added. Supported instructions are
ref.null,ref.is_null,ref.func, and typedselect. Table instructions are not supported yet. For typedselect, C/JS API can take an additional 'type' parameter.
local.tee's C/Binaryen.js API now takes an additional type parameter for its local type, likelocal.get. This is required to handle subtypes.- Added load_splat SIMD instructions
- Binaryen.js instruction API changes:
notify->atomic.notifyi32.wait/i64.wait->i32.atomic.wait/i64.atomic.wait
- Binaryen.js:
flagsargument insetMemoryfunction is removed. atomic.fenceinstruction support is added.- wasm-emscripten-finalize: Don't rely on name section being present in the input. Use the exported names for things instead.
- Added
mutableparameter to BinaryenAddGlobalImport. - Replace BinaryenSIMDBitselect* with BinaryenSIMDTernary* in the C API and add qfma/qfms instructions.
- Added
offsetparameter to BinaryenSetFunctionTable. - Add the ability to create multivalue Types in the C and JS APIs.
- Remove named function types. They are replaced by
paramsandresultstypes local to each function. - Binaryen.js can now be compiled to Wasm using the
binaryen_wasmtarget. Unlike the JS variant, the Wasm variant requires asynchronously awaiting the Wasm blob's instantiation and initialization before being usable, using thebinaryen.readypromise, e.g.binaryen.ready.then(() => ...). - Binaryen.js now uses
binaryen(wasBinaryen) as its global name to align with the npm package. - Binaryen.js: The result of
getMemorySegmentInfoByIndexnow has the same structure as the respective inputs on creation (byteOffset->offset).
- wasm-emscripten-finalize: For -pie binaries that import a mutable stack pointer we internalize this an import it as immutable.
- The
tail-callfeature including thereturn_callandreturn_call_indirectinstructions is ready to use.
- Rename Bysyncify => Asyncify
- The --initial-stack-pointer argument to wasm-emscripten-finalize no longer has any effect. It will be removed completely in future release.
- Wast file parsing rules now don't allow a few invalid formats for typeuses
that were previously allowed. Typeuse entries should follow this format,
meaning they should have (type) -> (param) -> (result) order if more than one
of them exist.
Also, all (local) nodes in function definition should be after all typeuse elements.
typeuse ::= (type index|name)+ | (type index|name)+ (param ..)* (result ..)* | (param ..)* (result ..)* - Removed APIs related to deprecated instruction names in Binaryen.js:
get_local/getLocalset_local/setLocaltee_local/teeLocalget_global/getGlobalset_global/setGlobalcurrent_memory/currentMemorygrow_memory/growMemoryThey are now available as their new instruction names:local.get,local.set,local.tee,global.get,global.set,memory.size, andmemory.grow.
- Add feature handling to the C/JS API with no feature enabled by default.
- Generate dynCall thunks for any signatures used in "invoke" calls.
- Fix AsmConstWalker handling of string address in arg0 with -fPIC code
- Change default feature set in the absence of a target features section from all features to MVP.
- Improve support for side modules
- Add
namedGlobalsto metadata output of wasm-emscripten-finalize - Add support for llvm PIC code.
- Add --side-module option to wasm-emscripten-finalize.
- Add
segmentPassiveargument toBinaryenSetMemoryfor marking segments passive. - Make
-o -print to stdout instead of a file named "-".
- Remove wasm-merge tool.
- Remove jsCall generation from wasm-emscripten-finalize. This is not needed as of emscripten-core/emscripten#8255.
RelooperCreatein the C API now has a Module parameter, andRelooperRenderAndDisposedoes not.- The JS API now has the
Relooperconstructor receive theModule.
- The JS API now has the
- Relooper: Condition properties on Branches must not have side effects.
-
BinaryenSetFunctionTablein the C API no longer accepts an array of functions, instead it accepts an array of function names,const char** funcNames. Previously, you could not include imported functions because they are of typeBinaryenImportRefinstead ofBinaryenFunctionRef. #1650 -
BinaryenSetFunctionTablein the C API now expects the initial and maximum table size as additional parameters, likeBinaryenSetMemorydoes for pages, so tables can be grown dynamically. #1687 -
Add
sharedparameters toBinaryenAddMemoryImportandBinaryenSetMemory, to support a shared memory. #1686