summaryrefslogtreecommitdiff
path: root/src/tools/asm2wasm.cpp
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2017-03-07 13:56:35 -0800
committerGitHub <noreply@github.com>2017-03-07 13:56:35 -0800
commit71804e2bfd1ba49b7dd4ce82b6ad26ba13f1bca8 (patch)
tree7a91f560708b5017cf795850db94267f2cb58f62 /src/tools/asm2wasm.cpp
parenta452f92aeb96e9617a20146503720cd5acb64f29 (diff)
downloadbinaryen-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.cpp22
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