Skip to content

Commit

Permalink
Redesign Wasmtime's CLI (#6925)
Browse files Browse the repository at this point in the history
* Redesign Wasmtime's CLI

This commit follows through on discussion from #6741 to redesign the
flags that the `wasmtime` binary accepts on the CLI. Almost all flags
have been renamed/moved and will require callers to update. The main
motivation here is to cut down on the forest of options in `wasmtime -h`
which are difficult to mentally group together and understand.

The main change implemented here is to move options behind "option
groups" which are intended to be abbreviated with a single letter:

* `-O foo` - an optimization or performance-tuning related option
* `-C foo` - a codegen option affecting the compilation process.
* `-D foo` - a debug-related option
* `-W foo` - a wasm-related option, for example changing wasm semantics
* `-S foo` - a WASI-related option, configuring various proposals for example

Each option group can be explored by passing `help`, for example `-O
help`. This will print all options within the group along with their
help message. Additionally `-O help-long` can be passed to print the
full comment for each option if desired.

Option groups can be specified multiple times on the command line, for
example `-Wrelaxed-simd -Wthreads`. They can also be combined together
with commas as `-Wrelaxed-simd,threads`. Configuration works as a "last
option wins" so `-Ccache,cache=n` would end up with a compilation
cache disabled.

Boolean options can be specified as `-C foo` to enable `foo`, or they
can be specified with `-Cfoo=$val` with any of `y`, `n`, `yes`, `no`,
`true`, or `false`. All other options require a `=foo` value to be
passed and the parsing depends on the type.

This commit additionally applies a few small refactorings to the CLI as
well. For example the help text no longer prints information about wasm
features after printing the option help. This is still available via
`-Whelp` as all wasm features have moved from `--wasm-features` to `-W`.
Additionally flags are no longer conditionally compiled in, but instead
all flags are always supported. A runtime error is returned if support
for a flag is not compiled in. Additionally the "experimental" name of
WASI proposals has been dropped in favor of just the name of the
proposal, for example `--wasi nn` instead of `--wasi-modules
experimental-wasi-nn`. This is intended to mirror how wasm proposals
don't have "experimental" in the name and an opt-in is required
regardless.

A full listing of flags and how they have changed is:

| old cli flag                                  | new cli flag                                    |
|-----------------------------------------------|-------------------------------------------------|
| `-O, --optimize`                              | removed                                         |
| `--opt-level <LEVEL>`                         | `-O opt-level=N`                                |
| `--dynamic-memory-guard-size <SIZE>`          | `-O dynamic-memory-guard-size=...`              |
| `--static-memory-forced`                      | `-O static-memory-forced`                       |
| `--static-memory-guard-size <SIZE>`           | `-O static-memory-guard-size=N`                 |
| `--static-memory-maximum-size <MAXIMUM>`      | `-O static-memory-maximum-size=N`               |
| `--dynamic-memory-reserved-for-growth <SIZE>` | `-O dynamic-memory-reserved-for-growth=...`     |
| `--pooling-allocator`                         | `-O pooling-allocator`                          |
| `--disable-memory-init-cow`                   | `-O memory-init-cow=no`                         |
| `--compiler <COMPILER>`                       | `-C compiler=..`                                |
| `--enable-cranelift-debug-verifier`           | `-C cranelift-debug-verifier`                   |
| `--cranelift-enable <SETTING>`                | `-C cranelift-NAME`                             |
| `--cranelift-set <NAME=VALUE>`                | `-C cranelift-NAME=VALUE`                       |
| `--config <CONFIG_PATH>`                      | `-C cache-config=..`                            |
| `--disable-cache`                             | `-C cache=no`                                   |
| `--disable-parallel-compilation`              | `-C parallel-compilation=no`                    |
| `-g`                                          | `-D debug-info`                                 |
| `--disable-address-map`                       | `-D address-map=no`                             |
| `--disable-logging`                           | `-D logging=no`                                 |
| `--log-to-files`                              | `-D log-to-files`                               |
| `--coredump-on-trap <PATH>`                   | `-D coredump=..`                                |
| `--wasm-features all`                         | `-W all-proposals`                              |
| `--wasm-features -all`                        | `-W all-proposals=n`                            |
| `--wasm-features bulk-memory`                 | `-W bulk-memory`                                |
| `--wasm-features multi-memory`                | `-W multi-memory`                               |
| `--wasm-features multi-value`                 | `-W multi-value`                                |
| `--wasm-features reference-types`             | `-W reference-types`                            |
| `--wasm-features simd`                        | `-W simd`                                       |
| `--wasm-features tail-call`                   | `-W tail-call`                                  |
| `--wasm-features threads`                     | `-W threads`                                    |
| `--wasm-features memory64`                    | `-W memory64`                                   |
| `--wasm-features copmonent-model`             | `-W component-model`                            |
| `--wasm-features function-references`         | `-W function-references`                        |
| `--relaxed-simd-deterministic`                | `-W relaxed-simd-deterministic`                 |
| `--enable-cranelift-nan-canonicalization`     | `-W nan-canonicalization`                       |
| `--fuel <N>`                                  | `-W fuel=N`                                     |
| `--epoch-interruption`                        | `-W epoch-interruption`                         |
| `--allow-unknown-exports`                     | `-W unknown-exports-allow`                      |
| `--trap-unknown-imports`                      | `-W unknown-imports-trap`                       |
| `--default-values-unknown-imports`            | `-W unknown-imports-default`                    |
| `--max-instances <MAX_INSTANCES>`             | `-W max-instances=N`                            |
| `--max-memories <MAX_MEMORIES>`               | `-W max-memories=N`                             |
| `--max-memory-size <BYTES>`                   | `-W max-memory-size=N`                          |
| `--max-table-elements <MAX_TABLE_ELEMENTS>`   | `-W max-table-elements=N`                       |
| `--max-tables <MAX_TABLES>`                   | `-W max-tables=N`                               |
| `--max-wasm-stack <MAX_WASM_STACK>`           | `-W max-wasm-stack=N`                           |
| `--trap-on-grow-failure`                      | `-W trap-on-grow-failure`                       |
| `--wasm-timeout <TIME>`                       | `-W timeout=N`                                  |
| `--wmemcheck`                                 | `-W wmemcheck`                                  |
| `--wasi-modules default`                      | removed                                         |
| `--wasi-modules -default`                     | removed                                         |
| `--wasi-modules wasi-common`                  | `-S common`                                     |
| `--wasi-modules -wasi-common`                 | `-S common=n`                                   |
| `--wasi-modules experimental-wasi-nn`         | `-S nn`                                         |
| `--wasi-modules experimental-wasi-threads`    | `-S threads`                                    |
| `--wasi-modules experimental-wasi-http`       | `-S http`                                       |
| `--listenfd`                                  | `-S listenfd`                                   |
| `--tcplisten <SOCKET ADDRESS>`                | `-S tcplisten=...`                              |
| `--wasi-nn-graph <FORMAT::HOST>`              | `-S nn-graph=FORMAT::HOST`                      |
| `--preview2`                                  | `-S preview2`                                   |
| `--dir <DIRECTORY>`                           | `--dir ...`                                     |
| `--mapdir <GUEST_DIR::HOST_DIR>`              | `--dir a::b`                                    |

* Be more descriptive with help text

* Document `=val` is optional for `-Ccranelift-xxx`

* Fix compile after rebase

* Fix rebase of `--inherit-network`

* Fix wasi-http test

* Fix compile without pooling allocator support

* Update some flags in docs

* Fix bench-api build

* Update flags for gdb/lldb tests

* Fixup optimization flags

prtest:full
  • Loading branch information
alexcrichton authored Sep 11, 2023
1 parent 186c3ec commit 8995750
Show file tree
Hide file tree
Showing 22 changed files with 979 additions and 1,078 deletions.
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ wasmtime-runtime = { workspace = true }
clap = { workspace = true, features = ["color", "suggestions", "derive"] }
anyhow = { workspace = true }
target-lexicon = { workspace = true }
humantime = "2.0.0"
once_cell = { workspace = true }
listenfd = "1.0.0"
wat = { workspace = true }
Expand Down
7 changes: 3 additions & 4 deletions ci/run-wasi-nn-example.sh
Original file line number Diff line number Diff line change
Expand Up @@ -39,17 +39,16 @@ pushd $WASMTIME_DIR/crates/wasi-nn/examples/classification-example
cargo build --release --target=wasm32-wasi
cp target/wasm32-wasi/release/wasi-nn-example.wasm $TMP_DIR
popd
cargo run -- run --mapdir fixture::$TMP_DIR \
--wasi-modules=experimental-wasi-nn $TMP_DIR/wasi-nn-example.wasm
cargo run -- run --dir fixture::$TMP_DIR -S nn $TMP_DIR/wasi-nn-example.wasm

# Build and run another example, this time using Wasmtime's graph flag to
# preload the model.
pushd $WASMTIME_DIR/crates/wasi-nn/examples/classification-example-named
cargo build --release --target=wasm32-wasi
cp target/wasm32-wasi/release/wasi-nn-example-named.wasm $TMP_DIR
popd
cargo run -- run --mapdir fixture::$TMP_DIR --wasi-nn-graph openvino::$TMP_DIR \
--wasi-modules=experimental-wasi-nn $TMP_DIR/wasi-nn-example-named.wasm
cargo run -- run --dir fixture::$TMP_DIR -S nn,nn-graph=openvino::$TMP_DIR \
$TMP_DIR/wasi-nn-example-named.wasm

# Clean up the temporary directory only if it was not specified (users may want
# to keep the directory around).
Expand Down
14 changes: 6 additions & 8 deletions crates/bench-api/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ use std::slice;
use std::{env, path::PathBuf};
use target_lexicon::Triple;
use wasmtime::{Engine, Instance, Linker, Module, Store};
use wasmtime_cli_flags::{CommonOptions, WasiModules};
use wasmtime_cli_flags::CommonOptions;
use wasmtime_wasi::{sync::WasiCtxBuilder, I32Exit, WasiCtx};

pub type ExitCode = c_int;
Expand Down Expand Up @@ -423,7 +423,7 @@ struct HostState {

impl BenchState {
fn new(
options: CommonOptions,
mut options: CommonOptions,
compilation_timer: *mut u8,
compilation_start: extern "C" fn(*mut u8),
compilation_end: extern "C" fn(*mut u8),
Expand Down Expand Up @@ -456,17 +456,15 @@ impl BenchState {
Ok(())
})?;

let epoch_interruption = options.epoch_interruption;
let fuel = options.fuel;
let epoch_interruption = options.wasm.epoch_interruption.unwrap_or(false);
let fuel = options.wasm.fuel;

let wasi_modules = options.wasi_modules.unwrap_or(WasiModules::default());

if wasi_modules.wasi_common {
if options.wasi.common != Some(false) {
wasmtime_wasi::add_to_linker(&mut linker, |cx| &mut cx.wasi)?;
}

#[cfg(feature = "wasi-nn")]
if wasi_modules.wasi_nn {
if options.wasi.nn == Some(true) {
wasmtime_wasi_nn::witx::add_to_linker(&mut linker, |cx| &mut cx.wasi_nn)?;
}

Expand Down
1 change: 1 addition & 0 deletions crates/cli-flags/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ file-per-thread-logger = { workspace = true }
pretty_env_logger = { workspace = true }
rayon = "1.5.0"
wasmtime = { workspace = true }
humantime = "2.0.0"

[features]
default = [
Expand Down
Loading

0 comments on commit 8995750

Please sign in to comment.