Changelog
=========

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.

Current Trunk
-------------
 - The emscripten build of binaryen no longer targets pure JS (via wasm2js) by
   default.  This allows us to enable WASM_BIGINT and other features that
   wasm2js does not support.  There is now just a single binaryen_js target.  It
   should still be possible to inject `-sWASM=0` as a linker flag but this is
   not officially supported. (#7995)
 - As part of enabling the `WASM_BIGINT` in the emscripten build the JS API for
   manipulating 64-bit values was changed.  These APIs, such as `i64.const`
   and `setValueI64`, previously took a hi/low pair but now take a single value
   which can be bigint or a number. Passing two values to these APIs will now
   trigger an assertion. (#7984)

v126
----

 - New intrinsic: `@binaryen.removable.if.unused`. (#8268)
 - New intrinsic: `@binaryen.js.called`. (#8324)
 - Add a pass to remove toolchain annotations, `--strip-toolchain-annotations`,
   for the above two intrinsics and future ones. (#8301)
 - Add a pass to remove relaxed SIMD instructions, `--remove-relaxed-simd`
   (#8300)
 - JS API: Throw useful exceptions on parse errors in binaryen.js, rather than
   fatally error and shut down the entire process. (#8264)
 - Implement function-level inlining hints (previously we only supported this
   annotation on calls, not functions themselves). (#8265)
 - Update C and JS libraries with relaxed atomics support (#8248)
 - wasm-split: Export/Import only necessary elements, avoiding bloat. (#8221)
 - Use `std::quick_exit` in `wasm-opt` etc. tools, to skip cleanup. (#8212)
 - The C API now has separate functions for `CallRef` and `ReturnCallRef`
   matching the semantics of `Call` and `ReturnCall` (#8121).
 - Breaking changes to the C and JS APIs related to atomic operations, in order
   to support the relaxed atomics proposal (currently a part of the [shared
   everything threads proposal](https://github.com/WebAssembly/shared-everything-threads)) (#8248).
   - `setAtomic` on atomic loads/stores is removed in favor of `setMemoryOrder`.
     `BinaryenLoadSetAtomic(expr, false)` / `load.setAtomic(false)` may be
     replaced with `BinaryenLoadSetMemoryOrder(expr,
     BinaryenMemoryOrderUnordered())`, `BinaryenLoadSetAtomic(expr, true)` /
     `load.setAtomic(true)` may be replaced with
     `BinaryenLoadSetMemoryOrder(expr, BinaryenMemoryOrderSeqCst())`, and
     likewise for `Store`s. In addition to Unordered and SeqCst, these functions
     support AcqRel which implements acquire/release semantics.
   - Likewise `BinaryenAtomicLoad`, `BinaryenAtomicStore`, `BinaryenAtomicRMW`,
     and `BinaryenAtomicCmpxchg` are updated with an additional
     `BinaryenMemoryOrder` param. The functions formerly implicitly used
     `BinaryenMemoryOrderSeqCst()`. In JS this param is optional and thus not
     breaking.

v125
----

 - Add a ReorderTypes pass (#7879).
 - C and JS APIs now assume RefFuncs are created after imported functions (non-
   imported functions can still be created later). This is necessary because
   imported function types can vary (due to Custom Descriptors), and we need to
   look up that type at RefFunc creation time. (#7993)
 - The --mod-asyncify-never-unwind and --mod-asyncify-always-and-only-unwind
   passed were deleted.  They only existed to support the lazy code loading
   support in emscripten that was removed. (#7893)
 - The cost modeling of calls was increased to a high number. That cost is
   usually not something you can notice (as calls have effects that make
   removing/replacing them impossible), but you may notice this when using
   call.without.effects (calls will no longer be assumed to be cheap enough to
   run unconditionally) or monomorphize (which inputs a cost factor as a
   number). (#8047)
 - Cross-module fuzzing: Add support generate and fuzz two linked files (#7947,
   #7949, etc.)

v124
----

 - Add Custom Descriptors support. (Fuzzing: #7796)
 - Add Stack Switching support. (Fuzzing: #7834)
 - Add Compilation Hints + Branch Hinting support. (Fuzzing #7704)
 - Build mimalloc with `MI_NO_OPT_ARCH` to fix Raspberry Pi 4 on Arm64. (#7837)
 - `wasm-split`'s `--multi-split` mode now supports more options:
   `--no-placeholders`, `--import-namespace`, `--emit-module-names`,
   `--emit-text`, `--symbolmap`, and `--placeholdermap`. Because
   `--no-placeholders` is false by default and until now `--multi-split` didn't
   use placeholders at all, this is a breaking change. If you want to continue
   to do multi-split without placeholders, you need to explicitly specify
   `--no-placeholders`. (#7781, #7789, #7792)
 - InstrumentMemory: Allow filtering by instruction, and instrument memory.grow.
   (#7388)
 - Add support for more source map fields, "sourcesContent", "file", and
   "sourceRoot". (#7473)
 - [GC] Add a TypeRefiningGUFA pass. (#7433)
 - [C/JS APIs] Allow JS and C to read the start function of a module (#7424)
 - Add a `--string-lifting` pass that raises imported string operations and
   constants into stringref in Binaryen IR (which can then be fully optimized,
   and typically lowered back down with `--string-lowering`). (#7389)
 - Fuzzer: Improve handling of small inputs and their debugging using a new
   `BINARYEN_FUZZER_MAX_BYTES` env var. (#7832)

v123
----

 - We now support "exact" references from the custom descriptors proposal,
   and emit such references when the feature is enabled. As a result, using
   `-all` will enable that feature (among all others), and cause GC-using
   binaries to use that feature, which most VMs do not yet support. To avoid
   such VM errors, either enable only the features you want, or disable it:
   `-all --disable-custom-descriptors`.
 - Use mimalloc allocator for Linux static builds, making our official release
   binaries a lot faster. (#7378)
 - Add an option to preserve imports and exports in the fuzzer (for fuzzer
   harnesses where they only want Binaryen to modify their given testcases, not
   generate new things in them). (#7300)
 - `string` is now a subtype of `ext` (rather than `any`). This allows better
   transformations for strings, like an inverse of StringLowering, but will
   error on codebases that depend on being able to pass strings into anyrefs.
   (#7373)
 - Require the type of RefFunc expressions to match the type of the referenced
   function. It is no longer valid to type them as funcref in the IR. (#7376)
 - The C and JS APIs for creating RefFunc expressions now take a HeapType
   instead of a Type.
 - MergeSimilarFunctions: Do a return_call when possible (necessary for
   correctness in wasm files that depend on calls for control flow). (#7350)

v122
----

 - The heap type associated with a tag is now preserved through optimization.
   (#7220)
 - The "typed-continuations" features is renamed "stack-switching" and the
   latest instructions are experimentally supported. (#7041)
 - WasmGC branches that send extra values can now be parsed via lowering to use
   scratch locals. (#7202)
 - Add experimental support for atomic struct get and set (#7155) and RMW
   (#7225) operations.

v121
----

 - BinaryenSelect no longer takes a type parameter. (#7097)
 - AutoDrop APIs have been removed. (#7106)
 - bulk-memory-opt and call-indirect-overlong features are added for parity with
   LLVM. (#7139)
 - WasmGC optimizations now run significantly faster and scale better with
   available threads. (#7142)
 - Binaryen now supports parsing control flow structures with parameter types by
   lowering them away in the parsers. (#7149)

v120
----

 - Remove closed world validation checks. These checks were causing more harm
   than good. All valid code will now validate with `--closed-world` (but also
   it now provides fewer warnings to users that enable closed world on code
   which does not conform to the requirements of that mode, which can lead to
   changes in runtime behavior; for the long-term plans, see #6965). (#7019)
 - Many compile time speedups were implemented (2x overall improvement), see
   https://github.com/WebAssembly/binaryen/issues/4165#issuecomment-2372548271
 - Several `exnref` (newest version of Wasm EH) optimizations: #7013, #6996,
   #6997, #6983, #6980
 - Source Maps: Support 5 segment mappings. (#6795)
 - [wasm-split] Add a multi-split mode. (#6943)
 - Add a `--preserve-type-order` option that minimizes text format changes in
   type ordering. (#6916)
 - Add a J2CL specific pass that moves itable entries to vtables. (#6888)

v119
----

 - Passes can now receive individual pass arguments, that is --foo=A --foo=B for
   a pass foo will run the pass twice (which was possible before) and will now
   run it first with argument A and second with B. --pass-arg=foo@BAR will now
   apply to the most recent --foo pass on the commandline, if foo is a pass
   (while global pass arguments - that are not the name of a pass - remain, as
   before, global for all passes). (#6687)
 - The Metrics pass now takes an optional argument to use as the title,
   `--metrics=text` will show that text before the metrics. Each instance of
   Metrics can have unique text, `--metrics=before -O3 --metrics=after`. (#6792)
 - Add C and JS APIs to control more pass options (trapsNeverHappen,
   closedWorld, generateStackIR, optimizeStackIR, and the list of skipped
   passes). (#6713)
 - A C APIs for getting/setting the type of Functions (#6721).
 - Allow using `--skip-pass` on the commandline multiple times (#6714).
 - The instructions relaxed_fma and relaxed_fnma have been renamed to
   relaxed_madd and relaxed_nmadd.
 - Add a new `--heap-store-optimization` pass. (#6882)
 - Add a pass for minimizing recursion groups. (#6832)


v118
----

 - StackIR is now handled entirely during binary writing (#6568). This is
   mostly not noticeable, except that:
   - Text output no longer notes `(; has Stack IR ;)` (as Stack IR only exists
     during binary writing).
   - `--generate-stack-ir`, `--optimize-stack-ir`, and `--print-stack-ir` are
     now flags and not passes. That means the order of operations may seem
     different, as they apply during binary writing (or, if no binary is written
     but we were still asked to print StackIR, `wasm-opt` does it at the very
     end).
   - Whether to generate, optimize, and print StackIR is now noted as part of
     the PassOptions. As a result `BinaryenModulePrintStackIR` and similar APIs
     do not receive an `optimize` flag, as they read the PassOption
     `optimizeStackIR` instead.
 - The new, standards-compliant text parser is now the default.
 - Source map comments on `else` branches must now be placed above the
   instruction inside the `else` branch rather than on the `else` branch itself.
 - Source map locations from instructions are no longer automatically propagated
   to function epilogues.
 - Add a new `BinaryenModuleReadWithFeatures` function to the C API that allows
   to configure which features to enable in the parser. (#6380)
 - The build-time option to use legacy WasmGC opcodes is removed. (#5874)
 - The strings in `string.const` instructions must now be valid WTF-8.
 - The `TraverseCalls` flag for `ExpressionRunner` is removed.
 - C API: Support adding data segments individually (#6346)
 - Add sourcemap support to wasm-metadce and wasm-merge (#6372).
 - Fix semantics of return calls (#6448, #6451, #6464, #6470, #6474).
 - Add table64 lowering pass (#6595).
 - Add TraceCalls instrumentation pass (#6619).

v117
----

 - Add a WebAssembly build to release (#6351)
 - Add Linux aarch64 build to release (#6334).
 - The text format for tuple instructions now requires immediates. For example,
   to make a tuple of two elements, use `tuple.make 2` (#6169) (#6172) (#6170).
 - The text format for `if` expressions now requires `then` and `else` to
   introduce the two branch arms, matching the spec (#6201).
 - Fuzzer: Remove --emit-js-shell logic and reuse fuzz_shell.js instead (#6310).
 - [EH] Add --experimental-new-eh option to wasm-opt (#6270) (#6210).
 - Add StringLowering pass, from stringref to imported-strings (#6271).
 - C API: Add BinaryenFunctionAppendVar (#6213).
 - Add J2CL optimization pass (#6151).
 - Add no-inline IR annotation, and passes to set it based on function name
   (#6146).
 - C API: Add BinaryenTableGetType and BinaryenTableSetType (#6137).
 - Add an Unsubtyping optimization (#5982).
 - Compute full transitive closure in GlobalEffects (#5992).
 - Add passes to finalize or unfinalize types (#5944).
 - Add a tuple optimization pass (#5937).

v116
----

 - "I31New" changed to "RefI31" everywhere it appears in the C API and similarly
   "i31.new" has been replaced with "ref.i31" in the JS API and in printed
   output (#5930, #3931).
 - The standard WasmGC opcodes are now on by default (#5873).

v115
----

- The nonstandard, experimental gc-nn-locals feature has been removed now that
  standard non-nullable locals are supported. (#5080)
- Print all debug annotations when `BINARYEN_PRINT_FULL`. (#5904)
- Use the standard text format for WasmGC now that things are stable there.
  (#5894, #5889, #5852, #5801)
- Rename multimemory flag to `--multimemory` to match its naming in LLVM.
  (#5890)
- Allow opting into standard GC encodings at compile time. (#5868)
- Remove legacy WasmGC instructions. (#5861)
- GUFA: Infer using TrapsNeverHappen. (#5850)
- Add a pass to reorder functions by name, which can be useful for debugging
  (e.g. comparisons after optimizations), `--reorder-functions-by-name`. (#5811)
- C API: Add `BinaryenAddFunctionWithHeapType` which is like
  `BinaryenAddFunction` but takes a heap type. The old function is kept for
  backwards compatibility and as a convenience. (#5829)
- Work on new optimization framework using lattices. (#5784, #5794, #5800,
  #5817, #5831, #5849)
- Heap types are now final by default and openness must be opted into both in
  the text and binary formats as well as in the TypeBuilder API. (#5918)

v114
----

- Fix a bug where e.g. -O3 -Oz ran the -O3 with the opt levels of -Oz, which
  could inhibit inlining, for example. While this is a bugfix, it affects how
  commandline options are interpreted, so if you depended on the old behavior
  this may be a breaking change. That is, the old behavior made -O3 -Oz run the
  first -O3 with -Oz's opt levels, and the new behavior is to run -O3 with the
  proper (-O3) opt levels. This is a followup to #5333 from a previous release.
  (#5787)
- Add pass to remove Exception Handling instructions (#5770).


v113
----

- Add a `wasm-merge` tool. This is a full rewrite of the previous `wasm-merge`
  tool that was removed from the tree in the past. The new version is much
  simpler after recent improvements to multi-memory and multi-table. The
  rewrite was motivated by new use cases for merging modules in the context of
  WasmGC.
- Some C and JS API functions now refer to data and element segments by name
  instead of index.
- The `--nominal` and `--hybrid` command line options and related API functions
  have been removed. The only supported type system is now the standard
  isorecursive (i.e. hybrid) type system. (#5672)
- Add a "mayNotReturn" effect (#5711).
- Disable the memory64 feature in Memory64Lowering.cpp (#5679).
- Disable sign extension in SignExtLowering.cpp (#5676).

v112
----

- Add AbstractTypeRefining pass (#5461)
- Add a mechanism to skip a pass by name (#5448)
- Add TypeMerging pass (#5321)
- Add TypeSSA pass  (#5299)
- Optimization sequences like `-O3 -Os` now do the expected thing and run `-O3`
  followed by `-Os`. Previously the last of them set the defaults that were used
  by all executions, so `-O3 -Os` was equivalent to `-Os -Os`. (There is no
  change to the default optimization level that other passes can see. For
  example, `--precompute-propagate -O2 -O1` will run `--precompute-propagate`
  at opt level `1`, as the global default is set to `2` and then overridden to
  `1`. The only change is that the passes run by `-O2` will actually run `-O2`
  now, while before they'd use the global default which made them do `-O1`.)
- Add `--closed-world` flag. This enables more optimizations in GC mode as it
  lets us assume that we can change types inside the module.
- The isorecursive WasmGC type system (i.e. --hybrid) is now the default to
  match the spec and the old default equirecursive (i.e. --structural) system
  has been removed.
- `ref.is_func`, `ref.is_data`, and `ref.is_i31` have been removed from the C
  and JS APIs and `RefIs` has been replaced with `RefIsNull`.
- Types `Data` and `Dataref` have been replaced with types `Struct` and
  `Structref` in the C and JS APIs.
* `BinaryenStringNew` now takes an additional last argument, `try_`, indicating
  whether the instruction is one of `string.new_utf8_try` respectively
  `string.new_utf8_array_try`.
* `BinaryenStringEq` now takes an additional second argument, `op`, that is
  either `BinaryenStringEqEqual()` if the instruction is `string.eq` or
  `BinaryenStringEqCompare()` if the instruction is `string.compare`.

v111
----

- Add extra `memory64` argument for `BinaryenSetMemory` and new
  `BinaryenMemoryIs64` C-API method to determine 64-bit memory. (#4963)
- `TypeBuilderSetSubType` now takes a supertype as the second argument.
- `call_ref` now takes a mandatory signature type immediate.
- If `THROW_ON_FATAL` is defined at compile-time, then fatal errors will throw a
  `std::runtime_error` instead of terminating the process. This may be used by
  embedders of Binaryen to recover from errors.
- Implemented bottom heap types: `none`, `nofunc`, and `noextern`. RefNull
  expressions and null `Literal`s must now have type `nullref`, `nullfuncref`,
  or `nullexternref`.
- The C-API's `BinaryenTypeI31ref` and `BinaryenTypeDataref` now return nullable
  types.
- The `sign-extension` and `mutable-globals` features 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.

v110
----

- 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-immutable`
  which 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`, `BinaryenModuleWriteStackIR` and
  `BinaryenModuleAllocateAndWriteStackIR` now have an extra boolean
  argument `optimize`. (#4832)
- Remove support for the `let` instruction 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)
- `i31ref` and `dataref` are now nullable to match the latest GC spec. (#4843)
- Add support for `extern.externalize` and `extern.internalize`. (#4975)

v109
----

- Add Global Struct Inference pass (#4659) (#4714)
- Restore and fix SpillPointers pass (#4570)
- Update relaxed SIMD instructions to latest spec

v108
----

- Add CMake flag BUILD_TOOLS to control building tools (#4655)
- Add CMake flag JS_OF_OCAML for js_of_ocaml (#4637)
- Remove externref (#4633)

v107
----

- 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`.

v106
----

- [wasm2js] Support exports of Globals (#4523)
- MergeSimilarFunctions optimization pass (#4414)
- Various wasm-ctor-eval improvements, including support for GC.

v105
----

- This release contains binaries for ARM64 MacOS devices (#4397)
- Otherwise, mostly bug fixes and incremental optimization improvements.

v104
----

- Bugfixes only, release created due to incorrect github release artifacts in
  v103 release (#4398).

v103
----

- 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:
  ```js
  import Binaryen from "path/to/binaryen.js";
  const binaryen = await Binaryen();
  ...
  ```
- CallIndirect changed from storing a Signature to storing a HeapType

v102
----

- Add `BinaryenUpdateMaps` to 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`/`if` arms (#3828). This may cause direct `BinaryenTupleExtract(BinaryenTupleMake(...))` to [use multivalue types](https://github.com/grain-lang/grain/pull/1158).

v101
----

- `BinaryenSetFunctionTable` and `module.setFunctionTable` have been removed
  in favor of `BinaryenAddTable` and `module.addTable` respectively.
- `BinaryenIsFunctionTableImported` is removed.
- A new type `BinaryenElementSegmentRef` has been added to the C API with
  new apis in both C & JS:
  - `BinaryenAddActiveElementSegment`
  - `BinaryenAddPassiveElementSegment`
  - `BinaryenRemoveElementSegment`
  - `BinaryenGetElementSegment`
  - `BinaryenGetElementSegmentByIndex`
  - `BinaryenElementSegmentGetName`
  - `BinaryenElementSegmentSetName`
  - `BinaryenElementSegmentGetTable`
  - `BinaryenElementSegmentSetTable`
  - `BinayenElementSegmentIsPassive`
  - `module.addActiveElementSegment`
  - `module.addPassiveElementSegment`
  - `module.removeElementSegment`
  - `module.getElementSegment`
  - `module.getElementSegmentByIndex`
  - `module.getTableSegments`
  - `module.getNumElementSegments`
  - `binaryen.getElementSegmentInfo`
- `BinaryenAddTable` and `module.addTable` no longer take offset and function
    names.
- `BinaryenGetNumFunctionTableSegments` is replaced with
  `BinaryenGetNumElementSegments`.
- `BinaryenGetFunctionTableSegmentOffset` is replaced with
  `BinaryenElementSegmentGetOffset`.
- `BinaryenGetFunctionTableSegmentLength` is replaced with
  `BinaryenElementSegmentGetLength`.
- `BinaryenGetFunctionTableSegmentData` is replaced with
  `BinaryenElementSegmentGetData`.
- Boolean values in the C API now should use `bool` instead of `int`.
- Experimental SIMD instructions have been removed and the names and opcodes of
  the standard instructions have been updated to match the final spec.

v100
----

- `wasm-dis` now supports options to enable or disable Wasm features.
- Reference types support has been improved by allowing multiple tables in a
  module.
- `call_indirect` and `return_call_indirect` now take an additional table name
  parameter. This is necessary for reference types support.
- New getter/setter methods have been introduced for `call_indirect` table name:
  - `BinaryenCallIndirectGetTable`
  - `BinaryenCallIndirectSetTable`
  - JS API `CallIndirect.table`
- New APIs have been added to add and manipulate multiple tables in a module:
  - `BinaryenAddTable`
  - `BinaryenRemoveTable`
  - `BinaryenGetNumTables`
  - `BinaryenGetTable`
  - `BinaryenGetTableByIndex`
  - `BinaryenTableGetName`
  - `BinaryenTableGetInitial`
  - `BinaryenTableHasMax`
  - `BinaryenTableGetMax`
  - `BinaryenTableImportGetModule`
  - `BinaryenTableImportGetBase`
  - `module.addTable`
  - `module.removeTable`
  - `module.getTable`
  - `module.getTableByIndex`
  - `module.getNumTables`
  - `binaryen.getTableInfo`

v99
---

- 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)
- `RefFunc` C and JS API constructors (`BinaryenRefFunc` and `ref.func`
  respectively) now take an extra `type` parameter, similar to `RefNull`. This
  is necessary for typed function references support.
- JS API functions for atomic notify/wait instructions are renamed.
  - `module.atomic.notify` -> `module.memory.atomic.notify`
  - `module.i32.atomic.wait` -> `module.memory.atomic.wait32`
  - `module.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_PARAMS` in `FuncCastEmulation` a runtime configuration option named
  `max-func-params`. This defaults to the original value of 16.
- `BinaryenGetFunction`, `BinaryenGetGlobal` and `BinaryenGetEvent` now return
  `NULL` instead of aborting when the respective element does not yet exist.

v98
---

- Add `--fast-math` mode. (#3155)
- Initial implementation of "Memory64" proposal (#3130)
- Lots of changes in support of GC proposal

v97
---

- Remove asm2wasm, which supported Emscripten's fastcomp backend, after fastcomp
  was removed.
- The new feature flag `--enable-anyref` enables just the `anyref` type incl.
  basic subtyping of `externref`, `funcref` and `exnref` (if enabled).
- Enabling the exception handling or anyref features without also enabling
  reference types is a validation error now.
- The `Host` expression and its respective APIs have been refactored into
  separate `MemorySize` and `MemoryGrow` expressions to align with other memory
  instructions.

v96
---

- 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)

v95
---

- 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:
  - `BinaryenBlockGetChild` to `BinaryenBlockGetChildAt`
  - `BinaryenSwitchGetName` to `BinaryenSwitchGetNameAt`
  - `BinaryenCallGetOperand` to `BinaryenCallGetOperandAt`
  - `BinaryenCallIndirectGetOperand` to `BinaryenCallIndirectGetOperandAt`
  - `BinaryenHostGetOperand` to `BinaryenHostGetOperandAt`
  - `BinaryenThrowGetOperand` to `BinaryenThrowGetOperandAt`
  - `BinaryenTupleMakeGetOperand` to `BinaryenTupleMakeGetOperandAt`

v94
---

- The C-API's `BinaryenSetAPITracing` and the JS-API's `setAPITracing` have 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`,
  `stackRestore` function.  It not expects them to be included in the input
  file.

v93
---

- First release with binaries built with github actions.


v92
---

- The `multivalue` feature 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 new `tuple.make` pseudoinstruction and their
  elements are retrieved with the new `tuple.extract` pseudoinstruction.
- 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 `dylink` section in Binaryen IR, so we can read, write, and
  update it.

v91
---

- `BinaryenExpressionGetSideEffects` (C API) and `getSideEffects` (JS API) now
  takes an additional `features` parameter.
- Reference type support is added. Supported instructions are `ref.null`,
  `ref.is_null`, `ref.func`, and typed `select`. Table instructions are not
  supported yet. For typed `select`, C/JS API can take an additional 'type'
  parameter.

v90
---

- `local.tee`'s C/Binaryen.js API now takes an additional type parameter for its
  local type, like `local.get`. This is required to handle subtypes.
- Added load_splat SIMD instructions
- Binaryen.js instruction API changes:
  - `notify` -> `atomic.notify`
  - `i32.wait` / `i64.wait` -> `i32.atomic.wait` / `i64.atomic.wait`
- Binaryen.js: `flags` argument in `setMemory` function is removed.
- `atomic.fence` instruction 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 `mutable` parameter to BinaryenAddGlobalImport.
- Replace BinaryenSIMDBitselect* with BinaryenSIMDTernary* in the C API and add
  qfma/qfms instructions.
- Added `offset` parameter to BinaryenSetFunctionTable.
- Add the ability to create multivalue Types in the C and JS APIs.
- Remove named function types. They are replaced by `params` and `results` types
  local to each function.
- Binaryen.js can now be compiled to Wasm using the `binaryen_wasm` target.
  Unlike the JS variant, the Wasm variant requires asynchronously awaiting the
  Wasm blob's instantiation and initialization before being usable, using the
  `binaryen.ready` promise, e.g. `binaryen.ready.then(() => ...)`.
- Binaryen.js now uses `binaryen` (was `Binaryen`) as its global name to align
  with the npm package.
- Binaryen.js: The result of `getMemorySegmentInfoByIndex` now has the same
  structure as the respective inputs on creation (`byteOffset` -> `offset`).

v88
---

- wasm-emscripten-finalize: For -pie binaries that import a mutable stack
  pointer we internalize this an import it as immutable.
- The `tail-call` feature including the `return_call` and `return_call_indirect`
  instructions is ready to use.

v87
---

- Rename Bysyncify => Asyncify

v86
---

- The --initial-stack-pointer argument to wasm-emscripten-finalize no longer
  has any effect.  It will be removed completely in future release.

v85
---

- 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.
  ```
  typeuse ::= (type index|name)+ |
              (type index|name)+ (param ..)* (result ..)* |
              (param ..)* (result ..)*
  ```
  Also, all (local) nodes in function definition should be after all typeuse
  elements.
- Removed APIs related to deprecated instruction names in Binaryen.js:
  - `get_local` / `getLocal`
  - `set_local` / `setLocal`
  - `tee_local` / `teeLocal`
  - `get_global` / `getGlobal`
  - `set_global` / `setGlobal`
  - `current_memory` / `currentMemory`
  - `grow_memory` / `growMemory`
  They are now available as their new instruction names:
  `local.get`, `local.set`, `local.tee`, `global.get`, `global.set`,
  `memory.size`, and `memory.grow`.
- Add feature handling to the C/JS API with no feature enabled by default.

v84
---

- Generate dynCall thunks for any signatures used in "invoke" calls.

v81
---

- Fix AsmConstWalker handling of string address in arg0 with -fPIC code

v80
---

- Change default feature set in the absence of a target features section from
  all features to MVP.

v79
---

- Improve support for side modules

v78
---

- Add `namedGlobals` to metadata output of wasm-emscripten-finalize
- Add support for llvm PIC code.
- Add --side-module option to wasm-emscripten-finalize.
- Add `segmentPassive` argument to `BinaryenSetMemory` for marking segments
  passive.
- Make `-o -` print to stdout instead of a file named "-".

v73
---

- Remove wasm-merge tool.

v73
---

- Remove jsCall generation from wasm-emscripten-finalize.  This is not needed
  as of https://github.com/emscripten-core/emscripten/pull/8255.

v55
---

- `RelooperCreate` in the C API now has a Module parameter, and
  `RelooperRenderAndDispose` does not.
  - The JS API now has the `Relooper` constructor receive the `Module`.
- Relooper: Condition properties on Branches must not have side effects.

older
-----

- `BinaryenSetFunctionTable` in 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 type `BinaryenImportRef` instead of `BinaryenFunctionRef`. #1650

- `BinaryenSetFunctionTable` in the C API now expects the initial and maximum
  table size as additional parameters, like `BinaryenSetMemory` does for pages,
  so tables can be grown dynamically. #1687

- Add `shared` parameters to `BinaryenAddMemoryImport` and `BinaryenSetMemory`,
  to support a shared memory. #1686
