================================================================================
wasm-reduce INFILE
Reduce a wasm file to a smaller one with the same behavior on a given command.
Typical usage:
wasm-reduce orig.wasm '--command=bash a.sh' --test t.wasm --working w.wasm
The original file orig.wasm is where we begin. We then repeatedly test a small
reduction of it by writing that modification to the 'test file' (specified by
'--test'), and we run the command, in this example 'bash a.sh'. That command
should use the test file (and not the original file or any other one). Whenever
the reduction works, we write that new smaller file to the 'working file'
(specified by '--working'). The reduction 'works' if it correctly preserves the
behavior of the command on the original input, specifically, that it has the
same stdout and the result return code. Each time reduction works we continue to
reduce from that point (and each time it fails, we go back and try something
else).
As mentioned above, the command should run on the test file. That is, the first
thing that wasm-reduce does on the example above is, effectively,
cp orig.wasm t.wasm
bash a.sh
In other words, it copies the original to the test file, and runs the command.
Whatever the command does, we will preserve as we copy progressively smaller
files to t.wasm. As we make progress, the smallest file will be written to
the working file, w.wasm, and when reduction is done you will find the final
result there.
Comparison to creduce:
1. creduce requires the command to return 0. wasm-reduce is often used to reduce
crashes, which have non-zero return codes, so it is natural to allow any
return code. As mentioned above, we preserve the return code as we reduce.
2. creduce ignores stdout. wasm-reduce preserves stdout as it reduces, as part
of the principle of preserving the original behavior of the command (if your
stdout varies in uninteresting ways, your command can be a script that runs
the real command and captures stdout to /dev/null, or filters it).
3. creduce tramples the original input file as it reduces. wasm-reduce never
modifies the input (to avoid mistakes that cause data loss). Instead,
when reductions work we write to the 'working file' as mentioned above, and
the final reduction will be there.
4. creduce runs the command in a temp directory. That is safer in general, but
it is not how the original command ran, and in particular forces additional
work if you have multiple files (which, for wasm-reduce, is common, e.g. if
the testcase is a combination of JavaScript and wasm). wasm-reduce runs the
command in the current directory (of course, your command can be a script
that changes directory to anywhere else).
More documentation can be found at
https://github.com/WebAssembly/binaryen/wiki/Fuzzing#reducing
================================================================================
wasm-reduce options:
--------------------
--command,-cmd The command to run on the test, that we
want to reduce while keeping the
command's output identical. We look at
the command's return code and stdout here
(TODO: stderr), and we reduce while
keeping those unchanged.
--test,-t Test file (this will be written to test,
the given command should read it when we
call it)
--working,-w Working file (this will contain the
current good state while doing temporary
computations, and will contain the final
best result at the end)
--binaries,-b binaryen binaries location (bin/
directory)
--text,-S Emit intermediate files as text, instead
of binary (also make sure the test and
working files have a .wat or .wast
suffix)
--denan Avoid nans when reducing
--verbose,-v Verbose output mode
--debugInfo,-g Keep debug info in binaries
--force,-f Force the reduction attempt, ignoring
problems that imply it is unlikely to
succeed
--timeout,-to A timeout to apply to each execution of
the command, in seconds (default: 2)
--extra-flags,-ef Extra commandline flags to pass to
wasm-opt while reducing. (default:
--enable-all)
--save-all-working,-saw Save all intermediate working files, as
$WORKING.0, .1, .2 etc
Tool options:
-------------
--mvp-features,-mvp Disable all non-MVP features
--all-features,-all Enable all features
--detect-features (deprecated - this flag does nothing)
--quiet,-q Emit less verbose output and hide trivial
warnings.
--experimental-poppy Parse wast files as Poppy IR for testing
purposes.
--emit-module-names Emit module names, even if not emitting
the rest of the names section.
--enable-sign-ext Enable sign extension operations
--disable-sign-ext Disable sign extension operations
--enable-threads Enable atomic operations
--disable-threads Disable atomic operations
--enable-mutable-globals Enable mutable globals
--disable-mutable-globals Disable mutable globals
--enable-nontrapping-float-to-int Enable nontrapping float-to-int
operations
--disable-nontrapping-float-to-int Disable nontrapping float-to-int
operations
--enable-simd Enable SIMD operations and types
--disable-simd Disable SIMD operations and types
--enable-bulk-memory Enable bulk memory operations
--disable-bulk-memory Disable bulk memory operations
--enable-bulk-memory-opt Enable memory.copy and memory.fill
--disable-bulk-memory-opt Disable memory.copy and memory.fill
--enable-call-indirect-overlong Enable LEB encoding of call-indirect
(Ignored for compatibility as it has no
effect on Binaryen)
--disable-call-indirect-overlong Disable LEB encoding of call-indirect
(Ignored for compatibility as it has no
effect on Binaryen)
--enable-exception-handling Enable exception handling operations
--disable-exception-handling Disable exception handling operations
--enable-tail-call Enable tail call operations
--disable-tail-call Disable tail call operations
--enable-reference-types Enable reference types
--disable-reference-types Disable reference types
--enable-multivalue Enable multivalue functions
--disable-multivalue Disable multivalue functions
--enable-gc Enable garbage collection
--disable-gc Disable garbage collection
--enable-memory64 Enable memory64
--disable-memory64 Disable memory64
--enable-relaxed-simd Enable relaxed SIMD
--disable-relaxed-simd Disable relaxed SIMD
--enable-extended-const Enable extended const expressions
--disable-extended-const Disable extended const expressions
--enable-strings Enable strings
--disable-strings Disable strings
--enable-multimemory Enable multimemory
--disable-multimemory Disable multimemory
--enable-stack-switching Enable stack switching
--disable-stack-switching Disable stack switching
--enable-shared-everything Enable shared-everything threads
--disable-shared-everything Disable shared-everything threads
--enable-fp16 Enable float 16 operations
--disable-fp16 Disable float 16 operations
--enable-custom-descriptors Enable custom descriptors (RTTs) and
exact references
--disable-custom-descriptors Disable custom descriptors (RTTs) and
exact references
--enable-multibyte Enable multibyte array loads and stores
--disable-multibyte Disable multibyte array loads and stores
--enable-acquire-release-atomics Enable acquire/release atomic memory
operations
--disable-acquire-release-atomics Disable acquire/release atomic memory
operations
--enable-custom-page-sizes Enable custom page sizes
--disable-custom-page-sizes Disable custom page sizes
--enable-wide-arithmetic Enable wide arithmetic
--disable-wide-arithmetic Disable wide arithmetic
--enable-compact-imports Enable compact import section
--disable-compact-imports Disable compact import section
--enable-relaxed-atomics Enable relaxed atomic memory operations
--disable-relaxed-atomics Disable relaxed atomic memory operations
--enable-typed-function-references Deprecated compatibility flag
--disable-typed-function-references Deprecated compatibility flag
--no-validation,-n Disables validation, assumes inputs are
correct
--pass-arg,-pa An argument passed along to optimization
passes being run. Must be in the form
KEY@VALUE. If KEY is the name of a pass
then it applies to the closest instance
of that pass before us. If KEY is not the
name of a pass then it is a global option
that applies to all pass instances that
read it.
--closed-world,-cw Assume code outside of the module does
not inspect or interact with GC and
function references, even if they are
passed out. The outside may hold on to
them and pass them back in, but not
inspect their contents or call them.
--preserve-type-order Preserve the order of types from the
input (useful for debugging and testing)
--generate-stack-ir generate StackIR during writing
--optimize-stack-ir optimize StackIR during writing
--print-stack-ir print StackIR during writing
General options:
----------------
--version Output version information and exit
--help,-h Show this help message and exit
--debug,-d Print debug information to stderr
Options (86)
| Option | Description | Source |
|---|---|---|
--command, -cmd | The command to run on the test, that we want to reduce while keeping the command's output identical. | help |
--test, -t | Test file (this will be written to test, the given command should read it when we call it) | help |
--working, -w | Working file (this will contain the current good state while doing temporary computations, and will contain the final best result at the end) | help |
--binaries, -b | binaryen binaries location (bin/ directory) | help |
--text, -S | Emit intermediate files as text, instead of binary (also make sure the test and working files have a .wat or .wast suffix) | help |
--denan | Avoid nans when reducing | help |
--verbose, -v | Verbose output mode | help |
--debugInfo, -g | Keep debug info in binaries | help |
--force, -f | Force the reduction attempt, ignoring problems that imply it is unlikely to succeed | help |
--timeout, -to | A timeout to apply to each execution of the command, in seconds (default: 2) | help |
--extra-flags, -ef | Extra commandline flags to pass to wasm-opt while reducing. | help |
--save-all-working, -saw | Save all intermediate working files, as $WORKING.0, .1, .2 etc | help |
--mvp-features, -mvp | Disable all non-MVP features | help |
--all-features, -all | Enable all features | help |
--detect-features | (deprecated - this flag does nothing) | help |
--quiet, -q | Emit less verbose output and hide trivial warnings. | help |
--experimental-poppy | Parse wast files as Poppy IR for testing purposes. | help |
--emit-module-names | Emit module names, even if not emitting the rest of the names section. | help |
--enable-sign-ext | Enable sign extension operations | help |
--disable-sign-ext | Disable sign extension operations | help |
--enable-threads | Enable atomic operations | help |
--disable-threads | Disable atomic operations | help |
--enable-mutable-globals | Enable mutable globals | help |
--disable-mutable-globals | Disable mutable globals | help |
--enable-nontrapping-float-to-int | Enable nontrapping float-to-int operations | help |
--disable-nontrapping-float-to-int | Disable nontrapping float-to-int operations | help |
--enable-simd | Enable SIMD operations and types | help |
--disable-simd | Disable SIMD operations and types | help |
--enable-bulk-memory | Enable bulk memory operations | help |
--disable-bulk-memory | Disable bulk memory operations | help |
--enable-bulk-memory-opt | Enable memory.copy and memory.fill | help |
--disable-bulk-memory-opt | Disable memory.copy and memory.fill | help |
--enable-call-indirect-overlong | Enable LEB encoding of call-indirect (Ignored for compatibility as it has no effect on Binaryen) | help |
--disable-call-indirect-overlong | Disable LEB encoding of call-indirect (Ignored for compatibility as it has no effect on Binaryen) | help |
--enable-exception-handling | Enable exception handling operations | help |
--disable-exception-handling | Disable exception handling operations | help |
--enable-tail-call | Enable tail call operations | help |
--disable-tail-call | Disable tail call operations | help |
--enable-reference-types | Enable reference types | help |
--disable-reference-types | Disable reference types | help |
--enable-multivalue | Enable multivalue functions | help |
--disable-multivalue | Disable multivalue functions | help |
--enable-gc | Enable garbage collection | help |
--disable-gc | Disable garbage collection | help |
--enable-memory64 | Enable memory64 | help |
--disable-memory64 | Disable memory64 | help |
--enable-relaxed-simd | Enable relaxed SIMD | help |
--disable-relaxed-simd | Disable relaxed SIMD | help |
--enable-extended-const | Enable extended const expressions | help |
--disable-extended-const | Disable extended const expressions | help |
--enable-strings | Enable strings | help |
--disable-strings | Disable strings | help |
--enable-multimemory | Enable multimemory | help |
--disable-multimemory | Disable multimemory | help |
--enable-stack-switching | Enable stack switching | help |
--disable-stack-switching | Disable stack switching | help |
--enable-shared-everything | Enable shared-everything threads | help |
--disable-shared-everything | Disable shared-everything threads | help |
--enable-fp16 | Enable float 16 operations | help |
--disable-fp16 | Disable float 16 operations | help |
--enable-custom-descriptors | Enable custom descriptors (RTTs) and exact references | help |
--disable-custom-descriptors | Disable custom descriptors (RTTs) and exact references | help |
--enable-multibyte | Enable multibyte array loads and stores | help |
--disable-multibyte | Disable multibyte array loads and stores | help |
--enable-acquire-release-atomics | Enable acquire/release atomic memory operations | help |
--disable-acquire-release-atomics | Disable acquire/release atomic memory operations | help |
--enable-custom-page-sizes | Enable custom page sizes | help |
--disable-custom-page-sizes | Disable custom page sizes | help |
--enable-wide-arithmetic | Enable wide arithmetic | help |
--disable-wide-arithmetic | Disable wide arithmetic | help |
--enable-compact-imports | Enable compact import section | help |
--disable-compact-imports | Disable compact import section | help |
--enable-relaxed-atomics | Enable relaxed atomic memory operations | help |
--disable-relaxed-atomics | Disable relaxed atomic memory operations | help |
--enable-typed-function-references | Deprecated compatibility flag | help |
--disable-typed-function-references | Deprecated compatibility flag | help |
--no-validation, -n | Disables validation, assumes inputs are correct | help |
--pass-arg, -pa | An argument passed along to optimization passes being run. | help |
--closed-world, -cw | Assume code outside of the module does not inspect or interact with GC and function references, even if they are passed out. | help |
--preserve-type-order | Preserve the order of types from the input (useful for debugging and testing) | help |
--generate-stack-ir | generate StackIR during writing | help |
--optimize-stack-ir | optimize StackIR during writing | help |
--print-stack-ir | print StackIR during writing | help |
--version | Output version information and exit | help |
--help, -h | Show this help message and exit | help |
--debug, -d | Print debug information to stderr | help |