diff options
Diffstat (limited to 'src/tools/s2wasm.cpp')
-rw-r--r-- | src/tools/s2wasm.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
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; |