Skip to content

Latest commit

 

History

History
728 lines (537 loc) · 34.7 KB

CHANGELOG.md

File metadata and controls

728 lines (537 loc) · 34.7 KB

Changelog

All notable changes to this project will be documented in this file.

The format is loosely based on Keep a Changelog, and this project adheres to Semantic Versioning. Additionally we have an Internal section for changes that are of interest to developers.

Dates in this file are formattes as YYYY-MM-DD.

[0.31.1] - 2023-12-01

Fixes

  • Fixed a bug, in the wasmi engine executor, that causes an out of bounds buffer write when calling or resuming a Wasm function with a high number of parameters from the host side.

[0.31.0] - 2023-07-31

Added

  • Added ResourceLimiter API known from Wasmtime. (wasmi-labs#737)
    • This API allows to limit growable Wasm resources such as Wasm tables and linear memories.
    • Special thanks to Graydon Hoare for contributing this feature!

Fixes

  • Fixed a bug were Module::len_globals internal API returned length of linear memories instead. (wasmi-labs#741)

Changed

  • Removed intx crate dependency. (wasmi-labs#727)
    • The dependence on the intx crate was accidental and not really required at any time.
  • Optimized f64.const instructions for f64 constant values that can losslessly be encoded as 32-bit f32 value. (wasmi-labs#746)

Dev. Note

  • We now publish and record graphs of benchmarks over time. (wasmi-labs#740)
    • This allows wasmi developers to better inspect performance changes over longer periods of time.
  • Updated dev. dependencies:
    • criterion 0.4.0 -> 0.5.0
    • wast 0.52.0 -> 0.62.0

[0.30.0] - 2023-05-28

Changed

  • Optimized wasmi bytecode memory consumption. (wasmi-labs#718)
    • This reduced the memory consumption of wasmi bytecode by organizing the instructions into so-called instruction words, effectively reducing the amount of bytes required per wasmi instruction 16 bytes to 8 bytes. There was an experiment with 4 bytes but experiments confirmed that 8 bytes per instruction word was the sweetspot for wasmi execution and translation performance.
    • This did not affect execution performance too much but we saw performance improvements for translation from Wasm to wasmi bytecode by roughly 15-20%.
  • Optimized call and return_call for Wasm module internal calls. (wasmi-labs#724)
    • wasmi bytecode now differentiates between calls to Wasm module internal functions and imported functions which allows the wasmi bytecode executor to perform the common internal calls more efficiently.
    • This led to an execution performance improvement across the board but especially for call intense workloads of up to 30% in some test cases.

[0.29.0] - 2023-03-20

Added

  • Added support for extended-const Wasm proposal. (wasmi-labs#707)
  • Added fuel consumption modes. (wasmi-labs#706)
    • This allows eager and lazy fuel consumption modes to be used which mainly affects bulk operations such as table.copy and memory.grow. Eager fuel consumption always consumes fuel before a bulk operation for the total amount independent of success or failure of the operation whereras lazy fuel consumption only consumes fuel for successful executions.

Changed

  • Normalize fuel costs of all instructions. (wasmi-labs#705)
    • With this change most instructions cost roughly 1 fuel upon execution. This is more similar to how Wasmtime deals with fuel metered instruction costs. Before this change wasmi tried to have fuel costs that more closely mirror the computation intensity of the respective instruction according to benchmarks.

[0.28.0] - 2023-03-01

Added

  • Added support for the tail-call Wasm proposal. (wasmi-labs#683)
  • Added support for Linker defined host functions. (wasmi-labs#692)
    • Apparently this PR introduced some performance wins for the Wasm target according to our tests. This information shall be taken with a grain of salt since we are not sure why those performance improvement occured since the PR's functionality is orthogonal to Wasm engine performance.
    • Required precursor refactoring PR: wasmi-labs#681

Changed

  • The wasmi_wasi crate now more closely mirrors the wasmtime_wasi crate API. (wasmi-labs#700)

Internal

  • Refactor the wasmi Wasm engine to handle Wasm calls and returns in its core. (#694)
    • This improved performance of Wasm function calls significantly at the cost of host function call performance.
    • Also this seemed to have impacts Wasm target performance quite positively, too.
  • The Store now handles Wasm functions and host functions separately. (wasmi-labs#686)
    • This allows to store Wasm functions into the StoreInner type which was an important step towards the major refactoring in (#694)
    • It was expected that host function call performance would degrade by this PR but our tests actually showed that the opposite was true and Wasm target performance was improved overall.
  • Introduce ValueStackPtr abstraction for the wasmi engine core. (wasmi-labs#688)
    • This change significantly improved performance especially on the Wasm target according to our tests.
  • Optimize memory.{load,store} when reading or writing single bytes. (wasmi-labs#689)
    • The performance wins were more modest than we hoped but still measurable.
  • Use StoreContextMut<T> instead of impl AsContextMut in the wasmi engine core. (wasmi-labs#685)
    • This is a simple refactoring with the goal to make the Rust compiler have a simpler job at optimizing certain functions in the engine's inner workings since StoreContextMut provides more information to the compiler.

[0.27.0] - 2023-02-14

Added

  • Added support for fuel metering in the wasmi CLI. (wasmi-labs#679)
    • Users can now specify an amount of fuel via --fuel N to commit for the execution. Upon success the wasmi CLI will display the total amount of consumed and remaining fuel.

Fixed

Changed

  • Defer charging fuel for costly bulk memory and bulk table operations. (wasmi-labs#676)
    • Note that the check to assert that enough fuel is provided for these costly operation is still happening before the actual computation and only the charging is deferred to after a successful run. The reason behind this is that all the affected operations fail fast and therefore should not cost lots of fuel in case of failure.

[0.26.1] - 2023-02-13

Fixed

  • Fixed a bug where resuming a resumable function from a host function with more outputs than inputs could lead to incorrect behavior or runtime panics. (wasmi-labs#671)

[0.26.0] - 2023-02-11

Added

  • wasmi CLI: Add WASI support. (wasmi-labs#597)
  • Add built-in support for fuel metering. (wasmi-labs#653)
    • This allows to control the runtime of Wasm executions in a deterministic fasion effectively avoiding the halting problem by charging for executed instructions. Not using the feature will not affect the execution efficiency of wasmi for users.
  • Add Pages::checked_sub method. (wasmi-labs#660)
  • Add Func::new constructor. (wasmi-labs#662)
    • This allows to create Func instances from closures without statically known types.

Changed

Internal

[0.25.0] - 2023-02-04

Added

  • Added Config::floats option to enable or disable Wasm float operators during Wasm validation.
  • Trap::downcast_mut and Trap::downcast methods. (wasmi-labs#650)
    • This helps users to downcast into T: HostError.
  • Added WasmType impls for FuncRef and ExternRef types. (wasmi-labs#642)
    • This allows FuncRef and ExternRef instances to be used in TypedFunc parameters and results.

Removed

  • Removed from From impls from wasmparser-nostd types to wasmi types.
    • For example From<wasmparser::FuncType> for wasmi::FuncType got removed.

Changed

Internal

[0.24.0] - 2023-01-31

Added

Fixed

  • Fix a bug with Table and Memory imports not respecting the current size. (wasmi-labs#635)
    • This sometimes led to the problem that valid Table and Memory imports could incorrectly be rejected for having an invalid size for the subtype check.
    • This has been fixed as part of the reference-types Wasm proposal implementation.

Changed

  • Use more references in places to provide the compiler with more optimization opportunities. (wasmi-labs#634)
    • This led to a speed-up across the board for Wasm targets of about 15-20%.
  • Move the Value type from wasmi_core to wasmi. (wasmi-labs#636)
    • This change was necessary in order to support the reference-types Wasm proposal.
  • There has been some consequences from implementing the reference-types Wasm proposal which are listed below:
    • The Value type no longer implements Copy and PartialEq.
    • The From<&Value> for UntypedValue impl has been removed.
    • Remove some From impls for Value.
    • Moved some Display impls for types like FuncType and Value to the wasmi_cli crate.
    • Remove the try_into API from the Value type.
      • Users should use the new accessor methods as in the Wasmtime API.

Internal

  • Update wast dependency from version 0.44 to 0.52. (wasmi-labs#632)
  • Update the Wasm spec testsuite to the most recent commit: 3a04b2cf9
  • Improve error reporting for the internal Wasm spec testsuite runner.
    • It will now show proper span information in many more cases.

[0.23.0] - 2023-01-19

Note: This is the Wasmtime API Compatibility update.

Added

Changed

  • Removed ModuleError export from crate root. (wasmi-labs#618)
    • Now ModuleError is exported from crate::errors just like all the other error types.
  • Refactor and cleanup traits underlying to IntoFunc. (wasmi-labs#620)
    • This is only the first step in moving closer to the Wasmtime API traits.
  • Mirror Wasmtime API more closely. (wasmi-labs#615, wasmi-labs#616)
    • Renamed Caller::host_data method to Caller::data.
    • Renamed Caller::host_data_mut method to Caller::data_mut.
    • Add Extern::ty method and the ExternType type.
    • Rename ExportItem to ExportType:
      • Rename the ExportItem::kind method to ty and return ExternType instead of ExportItemKind.
      • Remove the no longer used ExportItemKind entirely.
    • The ExportsIter now yields items of the new type Export instead of pairs of (&str, Extern).
    • Rename ModuleImport to ImportType.
      • Rename ImportType::item_type to ty.
      • Rename ImportType::field to name.
      • Properly forward &str lifetimes in ImportType::{module, name}.
      • Replace ModuleImportType by ExternType.
    • Add new convenience methods to Instance:
      • Instance::get_func
      • Instance::get_typed_func
      • Instance::get_global
      • Instance::get_table
      • Instance::get_memory
    • Rename getters for querying types of runtime objects:
      • Func::func_type => Func::ty
      • Global::global_type => Global::ty
      • Table::table_type => Table::ty
      • Memory::memory_type => Memory::ty
      • Value::value_type => Value::ty
    • Remove Global::value_type getter.
      • Use global.ty().content() instead.
    • Remove Global::is_mutable getter.
      • Use global.ty().mutability().is_mut() instead.
    • Rename Mutability::Mutable to Var.
    • Add Mutability::is_mut getter.
      • While this API is not included in Wasmtime it is a useful convenience method.
    • Rename TableType::initial method to minimum.
    • Rename Table::len method to size.
    • Table and TableType now operate on u32 instead of usize just like in Wasmtime.
      • This affects Table::{new, size, set, get, grow} methods and TableType::{new, minimum, maximum} methods and their users.

[0.22.0] - 2023-01-16

Added

  • Add missing TypedFunc::call_resumable API. (wasmi-labs#605)
    • So far resumable calls were only available for the Func type. However, there was no technical reason why it was not implemented for TypedFunc so this mirrored API now exists.
    • This also cleans up rough edges with the Func::call_resumable API.

Changed

  • Clean up the wasmi_core crate API. (wasmi-labs#607, wasmi-labs#608, wasmi-labs#609)
    • This removes plenty of traits from the public interface of the crate which greatly simplifies the API surface for users.
    • The UntypedValue type gained some new methods to replace functionality that was provided in parts by the removed traits.
  • The wasmi crate now follows the Wasmtime API a bit more closely. (wasmi-labs#613)
    • StoreContext new methods:
      • fn engine(&self) -> &Engine
      • fn data(&self) -> &T
    • StoreContextMut new methods:
      • fn engine(&self) -> &Engine
      • fn data(&self) -> &T
      • fn data_mut(&mut self) -> &mut T
    • Renamed Store::state method to Store::data.
    • Renamed Store::state_mut method to Store::data_mut.
    • Renamed Store::into_state method to Store::into_data.

Internal

  • The Store and Engine types are better decoupled from their generic parts. (wasmi-labs#610, wasmi-labs#611)
    • This might reduce binary bloat and may have positive effects on the performance. In fact we measured significant performance improvements on the Wasm target.

[0.21.0] - 2023-01-04

Added

  • Add support for resumable function calls. (wasmi-labs#598)
    • This feature allows to resume a function call upon encountering a host trap.
  • Add support for concurrently running function executions using a single wasmi engine.
    • This feature also allows to call Wasm functions from host functions. (wasmi-labs#590)
  • Add initial naive WASI support for wasmi using the new wasmi_wasi crate. (wasmi-labs#557)
  • Add Module::imports that allows to query Wasm module imports. (wasmi-labs#573, wasmi-labs#583)

Fixed

  • Fix a bug that imported linear memories and tables were initialized twice upon instantiation. (wasmi-labs#593)
  • The wasmi CLI now properly hints for file path arguments. (wasmi-labs#596)

Changed

  • The wasmi::Trap type is now more similar to Wasmtime's Trap type. (wasmi-labs#559)
  • The wasmi::Store type is now Send and Sync as intended. (wasmi-labs#566)
  • The wasmi CLI now prints exported functions names if the function name CLI argument is missing. (wasmi-labs#579)
  • Improve feedback when running a Wasm module without exported function using wasmi CLI. (wasmi-labs#584)

[0.20.0] - 2022-11-04

Added

Removed

  • Removed some deprecated functions in the wasmi_core crate. (wasmi-labs#545)

Fixed

  • Fixed a critical performance regression introduced in Rust 1.65. (wasmi-labs#518)
    • While the PR's main job was to clean up some code it was found out that it also fixes a critical performance regression introduced in Rust 1.65.
    • You can read more about this performance regression in this thread.

Changed

  • Fixed handling of edge cases with respect to Wasm linear memory. (wasmi-labs#449)
    • This allows for wasmi to properly setup and use linear memory instances of up to 4GB.
  • Optimize and improve Wasm instantiation. (wasmi-labs#531)
  • Optimize global.get of immutable non-imported globals. (wasmi-labs#533)

Internal

[0.19.0] - 2022-10-20

Fixed

  • Fixed a potential undefined behavior as reported by the miri tool with respect to its experimental stacked borrows. (wasmi-labs#524)

Changed

  • Optimized Wasm to wasmi translation phase by removing unnecessary Wasm validation type checks. (wasmi-labs#527)
    • Speedups were in the range of 15%.
  • Linker::instantiate now takes &self instead of &mut self. (wasmi-labs#512)
    • This allows users to easily predefine a linker and reused its definitions as shared resource.
  • Fixed a bug were Caller::new was public. (wasmi-labs#514)
    • It is now a private method as it was meant to be.
  • Optimized TypedFunc::call at slight cost of Func::call. (wasmi-labs#522)
    • For many parameters and return values the measured improvements are in the range of 25%. Note that this is only significant for a large amount of host to Wasm calls of small functions.

Internal

[0.18.1] - 2022-10-13

Changed

  • Optimize for common cases for branch and return instructions. (wasmi-labs#493)
    • This led to up to 10% performance improvement according to our benchmarks in some cases.
  • Removed extraneous S: impl AsContext generic parameter from Func::typed method.
  • Make IntoFunc, WasmType and WasmRet traits publicly available.
  • Add missing impl for WasmRet for Result<T, Trap> where T: WasmType.
    • Without this impl it was impossible to provide closures to Func::wrap that returned Result<T, Trap> where T: WasmType, only Result<(), Trap> or Result<(T,), Trap> was possible before.

Internal

[0.18.0] - 2022-10-02

Added

  • Added Contibution Guidelines and Code of Conduct to the repository. (wasmi-labs#485)

Changed

  • Optimized instruction dispatch in the wasmi interpreter. (wasmi-labs#478, wasmi-labs#482)
    • This yielded combined speed-ups of ~20% across the board.
    • As a side effect we also refactored the way we compute branching offsets at Wasm module compilation time which improved performance of Wasm module compilation by roughly 5%.

Internal

  • Our CI now also benchmarks wasmi when ran inside Wasmtime as Wasm. (wasmi-labs#483, wasmi-labs#487)
    • This allows us to optimize wasmi towards Wasm performance more easily in the future.

[0.17.0] - 2022-09-23

Added

  • Added Memory::data_and_store_mut API inspired by Wasmtime's API. (wasmi-labs#448)

Changed

  • Updated wasmparser-nostd dependency from 0.90.0 to 0.91.0.
    • This improved performance of Wasm module compilation by ~10%.
  • Updated wasmi_core from 0.3.0 to 0.4.0.
  • Optimized execution of several Wasm float to int conversion instructions. (wasmi-labs#439)
    • We measured a performance improvement of 6000% or in other words those instructions are now 60 times faster than before.
    • This allowed us to remove the big num-rational dependency from wasmi_core for some nice speed-ups in compilation time of wasmi itself.
  • Optimized global.get and global.set Wasm instruction execution. (wasmi-labs#427)
    • This improved performance of those instructions by up to 17%.
  • Optimized Wasm value stack emulation. (wasmi-labs#459)
    • This improved performance of compute intense workloads by up to 23%.

Internal

  • Added automated continuous benchmarking to wasmi. (wasmi-labs#422)
    • This allows us to have a more consistent overview over the performance of wasmi.
  • Updated criterion benchmarking framework to version 0.4.0.
  • Reuse allocations during Wasm validation and translation:
  • Enabled more useful clippy lints for wasmi and wasmi_core. (wasmi-labs#438)
  • Reorganized the wasmi workspace. (wasmi-labs#466)

[0.16.0] - 2022-08-30

Changed

  • Update wasmparser-nostd dependency from version 0.83.0 -> 0.90.0. Link:
    • This significantly improved wasmi's Wasm parsing, validation and Wasm to wasmi bytecode translation performance.

Internal

  • Transition to the new wasmparser::VisitOperator API. Link
    • This again significantly improved wasmi's Wasm parsing, validation and Wasm to wasmi bytecode translation performance by avoiding many unnecessary unpredictable branches in the process.

[0.15.0] - 2022-08-22

Fixed

  • Fixed bugs found during fuzzing the translation phase of wasmi. Link
  • Fix Read trait implementation for no_std compilations. Link

Changed

  • Update to wasmi_core version 0.3.0.
  • Changed API of wasmi::Config in order to better reflect the API of wasmtime::Config.
  • Refactor Trap type to be of pointer size which resulted in significant performance wins across the board especially for call intense work loads. Link

Removed

  • Removed support for virtual memory based Wasm linear memory. We decided to remove support since benchmarks showed that our current implementation actually regresses performance compared to our naive Vec based implementation. Link

Internal

  • The wasmi::Engine now caches the bytes of the default linear memory for performance wins in memory.store and memory.load intense work loads. Link
  • The wasmi engine internals have been reorganized and modernised to improve performance on function call intense work loads. This resulted in performance improvements across the board. Link
  • The Wasm to wasmi bytecode translation now properly reuses heap allocations across function translation units which improved translation performance by roughly 10%. Link
  • Optimized the wasmi engine Wasm value stack implementation for significant performance wins across the board. Link
  • Shrunk size of some internal identifier types for minor performance wins. Link
  • Added initial naive fuzz testing for Wasm parsing, validation and Wasm to wasmi bytecode translation. Link

[0.14.0] - 2022-07-26

Added

Changed

  • Wasmi has been entirely redesigned and reimplemented. This work resulted in an entirely new API that is heavily inspired by the Wasmtime API, a brand new Wasm execution engine that performs roughly 30-40% better than the previous engine according to our benchmarks, the support of many Wasm proposals and Wasm parsing and validation using the battle tested wasmparser crate by the BytecodeAlliance.

    The new wasmi design allows to reuse the Wasm execution engine resources instead of spinning up a new Wasm execution engine for every function call.

    Note: If you plan to use wasmi it is of critical importance to compile wasmi using the following Cargo profile settings:

    [profile.release]
    lto = "fat"
    codegen-units = 1

    If you do not use these profile settings you might risk regressing performance of wasmi by up to 400%. You can read more about this issue here.

Removed

  • Removed support for resuming function execution. We may consider to add this feature back into the new engine. If you are a user of wasmi and want this feature please feel free to open an issue and provide us with your use case.

[0.13.2] - 2022-09-20

Fixed

[0.13.1] - 2022-09-20

Note: Yanked because of missing wasmi_core bump.

[0.13.0] - 2022-07-25

Note: This is the last major release of the legacy wasmi engine. Future releases are using the new Wasm execution engines that are currently in development. We may consider to publish new major versions of this Wasm engine as wasmi-legacy crate.

Changed

  • Update dependency: wasmi-validation v0.4.2 -> v0.5.0

[0.12.0] - 2022-07-24

Changed

  • wasmi now depends on the wasmi_core crate.
  • Deprecated RuntimeValue::decode_{f32,f64} methods.
    • Reason: These methods expose details about the F32 and F64 types. The RuntimeValue type provides from_bits methods for similar purposes.
    • Replacement: Replace those deprecated methods with F{32,64}::from_bits().into() respectively.
  • Refactor traps in wasmi: PR
    • This change also renames TrapKind to TrapCode.
    • The wasmi crate now properly reuses the TrapCode definitions from the wasmi_core crate.
  • Updated dependency:
    • parity-wasm v0.42 -> v0.45
    • memory_units v0.3.0 -> v0.4.0

Internal

  • Rename RuntimeValue to Value internally.
  • Now uses wat crate dependency instead of wabt for reading .wat files in tests.
  • Updated dev-dependencies:
    • assert_matches: v1.1 -> v1.5
    • rand 0.4.2 -> 0.8.2
  • Fix some clippy warnings.

[0.11.0] - 2022-01-06

Fixed

  • Make wasmi traps more conformant with the Wasm specification. (wasmi-labs#300)
  • Fixed a bug in {f32, f64}_copysign implementations. (wasmi-labs#293)
  • Fixed a bug in {f32, f64}_{min, max} implementations. (wasmi-labs#295)

Changed

  • Optimized Wasm to host calls. (wasmi-labs#291)
    • In some artificial benchmarks we saw improvements of up to 42%!
  • Introduce a more efficient LittleEndianConvert trait. (wasmi-labs#290)

Internal

  • Refactor and clean up benchmarking code and added more benchmarks.
  • Apply some clippy suggestions with respect ot #[must_use]. (wasmi-labs#288)
  • Improve Rust code formatting of imports.
  • Improve debug impl of ValueStack so that only the live parts are printed.

[0.10.0] - 2021-12-14

Added

Changed

  • The wasmi and wasmi-validation crates now both use Rust edition 2021.
  • The README now better teaches how to test and benchmark the crate.
  • Updated num-rational from version 0.2.2 -> 0.4.0.

Deprecated

  • Deprecated MemoryInstance::get method.
    • Users are recommended to use MemoryInstance::get_value or MemoryInstance::get_into methods instead.

Removed

  • Removed support for virtual memory on 32-bit platforms.
    • Note that the existing support was supposedly not more efficient than the Vec based fallback implementation anyways due to technical design.
  • Removed the core crate feature that previously has been required for no_std builds.
    • Now users only have to specify --no-default-features for a no_std build.

Internal

  • Fully deploy GitHub Actions CI and remove deprecated Travis based CI. Added CI jobs for:
    • Testing on Linux, MacOS and Windows
    • Checking docs and dead links in docs.
    • Audit crate dependencies for vulnerabilities.
    • Check Wasm builds.
    • File test coverage reports to codecov.io.

[0.9.1] - 2021-09-23

Changed

  • Added possibility to forward reduced_stack_buffers crate feature to parity-wasm crate.

Internal

  • Added a default rustfmt.toml configuration file.
  • Fixed some warnings associated to Rust edition 2021.
    • Note: The crate itself remains in Rust edition 2018.

[0.9.0] - 2021-05-27

Changed

  • Updated parity-wasm from verion 0.41 to 0.42.
  • Bumped wasmi-validation from version 0.3.1 to 0.4.0.