diff options
author | Alon Zakai <alonzakai@gmail.com> | 2017-03-07 13:56:35 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-03-07 13:56:35 -0800 |
commit | 71804e2bfd1ba49b7dd4ce82b6ad26ba13f1bca8 (patch) | |
tree | 7a91f560708b5017cf795850db94267f2cb58f62 /src/tools/asm2wasm.cpp | |
parent | a452f92aeb96e9617a20146503720cd5acb64f29 (diff) | |
download | binaryen-71804e2bfd1ba49b7dd4ce82b6ad26ba13f1bca8.tar.gz binaryen-71804e2bfd1ba49b7dd4ce82b6ad26ba13f1bca8.tar.bz2 binaryen-71804e2bfd1ba49b7dd4ce82b6ad26ba13f1bca8.zip |
Use 3 modes for potentially trapping ops in asm2wasm (#929)
* use 3 modes for potentially trapping ops in asm2wasm: allow (just emit a potentially trapping op), js (do exactly what js does, even if it takes a slow ffi to do it), and clamp (avoid the trap by clamping as necessary)
Diffstat (limited to 'src/tools/asm2wasm.cpp')
-rw-r--r-- | src/tools/asm2wasm.cpp | 22 |
1 files changed, 17 insertions, 5 deletions
diff --git a/src/tools/asm2wasm.cpp b/src/tools/asm2wasm.cpp index 01602c8b7..0679ad3f5 100644 --- a/src/tools/asm2wasm.cpp +++ b/src/tools/asm2wasm.cpp @@ -33,7 +33,7 @@ using namespace wasm; int main(int argc, const char *argv[]) { PassOptions passOptions; bool runOptimizationPasses = false; - bool imprecise = false; + Asm2WasmBuilder::TrapMode trapMode = Asm2WasmBuilder::TrapMode::JS; bool wasmOnly = false; bool debugInfo = false; std::string symbolMap; @@ -76,9 +76,21 @@ int main(int argc, const char *argv[]) { [](Options *o, const std::string &) { std::cerr << "--no-opts is deprecated (use -O0, etc.)\n"; }) - .add("--imprecise", "-i", "Imprecise optimizations", Options::Arguments::Zero, - [&imprecise](Options *o, const std::string &) { - imprecise = true; + .add("--emit-potential-traps", "-i", "Emit instructions that might trap, like div/rem of 0", Options::Arguments::Zero, + [&trapMode](Options *o, const std::string &) { + trapMode = Asm2WasmBuilder::TrapMode::Allow; + }) + .add("--emit-clamped-potential-traps", "-i", "Clamp instructions that might trap, like float => int", Options::Arguments::Zero, + [&trapMode](Options *o, const std::string &) { + trapMode = Asm2WasmBuilder::TrapMode::Clamp; + }) + .add("--emit-jsified-potential-traps", "-i", "Avoid instructions that might trap, handling them exactly like JS would", Options::Arguments::Zero, + [&trapMode](Options *o, const std::string &) { + trapMode = Asm2WasmBuilder::TrapMode::JS; + }) + .add("--imprecise", "-i", "Imprecise optimizations (old name for --emit-potential-traps)", Options::Arguments::Zero, + [&trapMode](Options *o, const std::string &) { + trapMode = Asm2WasmBuilder::TrapMode::Allow; }) .add("--wasm-only", "-w", "Input is in WebAssembly-only format, and not actually valid asm.js", Options::Arguments::Zero, [&wasmOnly](Options *o, const std::string &) { @@ -128,7 +140,7 @@ int main(int argc, const char *argv[]) { if (options.debug) std::cerr << "wasming..." << std::endl; Module wasm; wasm.memory.initial = wasm.memory.max = totalMemory / Memory::kPageSize; - Asm2WasmBuilder asm2wasm(wasm, pre, options.debug, imprecise, passOptions, runOptimizationPasses, wasmOnly); + Asm2WasmBuilder asm2wasm(wasm, pre, options.debug, trapMode, passOptions, runOptimizationPasses, wasmOnly); asm2wasm.processAsm(asmjs); // import mem init file, if provided |