6.0.3

emscripten-core/emscripten6.0.3Jul 13, 2026by emscripten-bot

Upgrading?

Release notes summary

This release addresses critical bug fixes for string handling and coverage mapping, introduces support for FMA intrinsics, and refactors the async I/O system. It also includes a new configuration option for self-initializing ES modules.

Key Highlights

  • Added support for compiling FMA intrinsics (32 variants) with `-msimd128 -mfma`
  • New `AUTO_INIT` setting to opt ES modules into self-initialization via top-level await
  • Refactored async `poll()`/`select()` implementation onto a per-inode readiness wait-queue
  • Fixed `UTF8ToString` with `GROWABLE_ARRAYBUFFERS` set for resizable heap buffers
  • Updated compiler-rt and libunwind to LLVM 22.1.8

Breaking Changes

  • The `stream_ops.poll` FS-backend handler signature changed from `poll(stream, timeout)` to `poll(stream)`
  • The `AUTO_INIT` setting disables `INCOMING_MODULE_JS_API` as module-level configuration is unavailable

New Features

  • FMA intrinsics support (32 variants)
  • AUTO_INIT setting for ES modules
  • Async I/O readiness wait-queue implementation

Full Release Notes

## What's Changed
- Fixed `UTF8ToString` with `GROWABLE_ARRAYBUFFERS` set. String decoding now
  copies the data when the heap buffer is resizable, just like it does in
  the shared memory case. (#27242)
- Added support for compiling FMA intrinsics. All 32 FMA intrinsics are
  supported, with 256-bit variants emulated via two 128-bit operations. Pass
  ``-msimd128 -mfma`` to enable. With ``-mrelaxed-simd -mfma``, Wasm relaxed
  SIMD FMA is used. (#27183)
- New `AUTO_INIT` setting to opt an instance ES module (`MODULARIZE=instance` or
  `WASM_ESM_INTEGRATION`) into self-initialization via top-level await on import,
  rather than exporting a default `init` function. Since there is no
  init/moduleArg, module-level configuration is unavailable:
  `INCOMING_MODULE_JS_API` is disabled and passing a non-empty one is an error.
- The async `poll()`/`select()` implementation was refactored onto a per-inode
  readiness wait-queue. As part of this, the (undocumented) `stream_ops.poll`
  FS-backend handler signature changed from `poll(stream, timeout)` to
  `poll(stream)` returning the current readiness mask; out-of-tree custom FS
  backends with a `poll` handler must update. (#27226)
- compiler-rt and libunwind were updated to LLVM 22.1.8. (#27245, #27246)
- `-fcoverage-mapping` is currently broken due to a mismatch between the version
  of LLVM used and the imported version of compiler-rt.  We hope to fix this
  in the next release. (#27261)
- The default value for `GROWABLE_ARRAYBUFFERS` was reverted to `0` since we
  found issues with Web API compatibility. (#27260)


## Contributors
Thanks to the following contributors: @sbc100 (38) @guybedford (11) @aheejin (7) @brendandahl (4) @kleisauke (3) @tlively (2) @duerrbaby (1) @fanchenkong1 (1) @heyparth1 (1) @hoodmane (1) @JAicewizard (1) @pavelsavara (1) @tomayac (1) @WebCoder49 (1) @Young-Lord (1)

## New Contributors
* @fanchenkong1 made their first contribution in https://github.com/emscripten-core/emscripten/pull/27183
* @duerrbaby made their first contribution in https://github.com/emscripten-core/emscripten/pull/27073
* @Young-Lord made their first contribution in https://github.com/emscripten-core/emscripten/pull/27256
* @heyparth1 made their first contribution in https://github.com/emscripten-core/emscripten/pull/27242
* @WebCoder49 made their first contribution in https://github.com/emscripten-core/emscripten/pull/27326

**Full Changelog**: https://github.com/emscripten-core/emscripten/compare/6.0.2...6.0.3

Related Repositories