summaryrefslogtreecommitdiff
path: root/src/tools
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools')
-rw-r--r--src/tools/asm2wasm.cpp11
-rw-r--r--src/tools/s2wasm.cpp27
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;