diff options
Diffstat (limited to 'src/tools')
-rw-r--r-- | src/tools/asm2wasm.cpp | 11 | ||||
-rw-r--r-- | src/tools/s2wasm.cpp | 27 |
2 files changed, 33 insertions, 5 deletions
diff --git a/src/tools/asm2wasm.cpp b/src/tools/asm2wasm.cpp index 3fa97d981..cbc3c486b 100644 --- a/src/tools/asm2wasm.cpp +++ b/src/tools/asm2wasm.cpp @@ -18,6 +18,7 @@ // asm2wasm console tool // +#include "ast/trapping.h" #include "support/colors.h" #include "support/command-line.h" #include "support/file.h" @@ -34,7 +35,7 @@ using namespace wasm; int main(int argc, const char *argv[]) { bool legalizeJavaScriptFFI = true; - Asm2WasmBuilder::TrapMode trapMode = Asm2WasmBuilder::TrapMode::JS; + TrapMode trapMode = TrapMode::JS; bool wasmOnly = false; std::string sourceMapFilename; std::string sourceMapUrl; @@ -79,19 +80,19 @@ int main(int argc, const char *argv[]) { }) .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; + trapMode = 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; + trapMode = 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; + trapMode = 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; + trapMode = 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 &) { diff --git a/src/tools/s2wasm.cpp b/src/tools/s2wasm.cpp index a35783479..559188d1f 100644 --- a/src/tools/s2wasm.cpp +++ b/src/tools/s2wasm.cpp @@ -18,6 +18,7 @@ // wasm2asm console tool // +#include "ast/trapping.h" #include "support/colors.h" #include "support/command-line.h" #include "support/file.h" @@ -37,6 +38,7 @@ int main(int argc, const char *argv[]) { bool importMemory = false; std::string startFunction; std::vector<std::string> archiveLibraries; + TrapMode trapMode = TrapMode::Allow; Options options("s2wasm", "Link .s file into .wast"); options.extra["validate"] = "wasm"; options @@ -81,6 +83,24 @@ int main(int argc, const char *argv[]) { [&allowMemoryGrowth](Options *, const std::string &) { allowMemoryGrowth = true; }) + .add("--emit-potential-traps", "", + "Emit instructions that might trap, like div/rem of 0", + Options::Arguments::Zero, + [&trapMode](Options *o, const std::string &) { + trapMode = TrapMode::Allow; + }) + .add("--emit-clamped-potential-traps", "", + "Clamp instructions that might trap, like float => int", + Options::Arguments::Zero, + [&trapMode](Options *o, const std::string &) { + trapMode = TrapMode::Clamp; + }) + .add("--emit-jsified-potential-traps", "", + "Avoid instructions that might trap, handling them exactly like JS would", + Options::Arguments::Zero, + [&trapMode](Options *o, const std::string &) { + trapMode = TrapMode::JS; + }) .add("--emscripten-glue", "-e", "Generate emscripten glue", Options::Arguments::Zero, [&generateEmscriptenGlue](Options *, const std::string &) { @@ -144,6 +164,13 @@ int main(int argc, const char *argv[]) { S2WasmBuilder mainbuilder(input.c_str(), options.debug); linker.linkObject(mainbuilder); + if (trapMode != TrapMode::Allow) { + Module* wasm = &(linker.getOutput().wasm); + PassRunner runner(wasm); + addTrapModePass(runner, trapMode); + runner.run(); + } + for (const auto& m : archiveLibraries) { auto archiveFile(read_file<std::vector<char>>(m, Flags::Binary, debugFlag)); bool error; |