14 unstable releases (6 breaking)

0.116.1 Mar 31, 2024
0.116.0 Oct 19, 2023
0.114.2 Oct 18, 2023
0.114.0 Jul 31, 2023
0.0.0 Jul 17, 2022

#40 in WebAssembly

Download history 43841/week @ 2024-08-19 54232/week @ 2024-08-26 58910/week @ 2024-09-02 53676/week @ 2024-09-09 50411/week @ 2024-09-16 54819/week @ 2024-09-23 57335/week @ 2024-09-30 56020/week @ 2024-10-07 53787/week @ 2024-10-14 60035/week @ 2024-10-21 49970/week @ 2024-10-28 62425/week @ 2024-11-04 50997/week @ 2024-11-11 52513/week @ 2024-11-18 56225/week @ 2024-11-25 45776/week @ 2024-12-02

207,177 downloads per month
Used in 116 crates (26 directly)

MIT/Apache

6MB
126K SLoC

C++ 102K SLoC // 0.2% comments Bitbake 11K SLoC // 0.0% comments JavaScript 5K SLoC // 0.0% comments Python 4K SLoC // 0.2% comments Rust 2K SLoC // 0.0% comments WebAssembly 1K SLoC // 0.0% comments C 143 SLoC // 0.1% comments Shell 62 SLoC // 0.1% comments

Rust bindings for Binaryen's wasm-opt

wasm-opt is a component of the Binaryen toolkit that optimizes WebAssembly modules. It is written in C++.


lib.rs:

Rust bindings to the wasm-opt WebAssembly optimizer.

wasm-opt is a component of the Binaryen toolkit that optimizes WebAssembly modules. It is written in C++.

This project provides a Rust crate that builds wasm-opt and:

  1. makes its command-line interface installable via cargo install,
  2. provides an API to access it programmatically.

Installing the binary

cargo install wasm-opt --locked

It should behave exactly the same as wasm-opt installed from other sources.

Using the library

The crate provides an OptimizationOptions type that follows the builder pattern, with options that closely mirror the command line options of wasm-opt. Once built, call OptimizationOptions::run to load, optimize, and write the optimized module.

use wasm_opt::OptimizationOptions;

let infile = "hello_world.wasm";
let outfile = "hello_world_optimized.wasm";

OptimizationOptions::new_optimize_for_size()
    .run(infile, outfile)?;

There are constructors for all the typical optimization profiles:

By default, the run method will read either binary wasm or text wat files, inspecting the first few bytes for the binary header and choosing as appropriate, and it will write a binary wasm file. This behavior can be changed with OptimizationOptions::reader_file_type and OptimizationOptions::writer_file_type.

Enabling and disabling WASM features

The WebAssembly specification has optional features, represeted by the Feature enum. The Feature variants link to the relevant specifications of each feature when known. wasm-opt can be configured with support for them individually using the OptimizationOptions::enable_feature and OptimizationOptions::disable_feature methods.

By default Binaryen (and this crate) enables these common features by default:

The original WebAssembly specification with no additional features is known as the MVP specification. To enable only the MVP features call OptimizationOptions::mvp_features_only.

After resetting to MVP features, additional calls to enable_feature will add features to the MVP feature set.

Customizing passes

All Binaryen optimization passes are represented in the Pass enum, and can be added to OptimizationOptions via OptimizationOptions::add_pass. These are added after the default set of passes, which are enabled by most OptimizationOptions constructors. The default passes can be disabled either with the OptimizationOptions::new_opt_level_0 constructor, or by calling OptimizationOptions::add_default_passes with a false argument.

use wasm_opt::{OptimizationOptions, Pass};

let infile = "hello_world.wasm";
let outfile = "hello_world_optimized.wasm";

// Just run the inliner.
OptimizationOptions::new_opt_level_0()
    .add_pass(Pass::InliningOptimizing)
    .run(infile, outfile)?;

Note that while this crate exposes all Binaryen passes some may not make sense to actually use — Binaryen is a command-line oriented tool, and some passes are for debug purposes or print directly to the console.

Integrating with existing tooling

For ease of integration with tools that already use wasm-opt via CLI, this crate provides the integration module, which presents an API that is compatible with stds Command. This allows client code to use mostly the same code path for executing the wasm-opt CLI, and the crate-based API.

Cargo features

Enabled by default, the dwarf feature enables passes related to DWARF debug info. When enabled, this crate includes C++ code from the LLVM project. This can cause duplicate symbol linkage errors when also linking to LLVM. When disabled, this code is not built, so can link successfully to LLVM, but the Binaryen DWARF passes will do nothing.

Dependencies

~2–11MB
~146K SLoC