summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2018-04-09 11:25:28 -0700
committerGitHub <noreply@github.com>2018-04-09 11:25:28 -0700
commit27517701d611ad7de5b467eaee2f0d589180465f (patch)
treed5a91529fe24d4f5d5578a05a58250e71cc6c323
parente42e1e3d4a5c67c0c066fe397b456ab8d41a78fd (diff)
downloadbinaryen-27517701d611ad7de5b467eaee2f0d589180465f.tar.gz
binaryen-27517701d611ad7de5b467eaee2f0d589180465f.tar.bz2
binaryen-27517701d611ad7de5b467eaee2f0d589180465f.zip
add a --no-validation option to the commandline tools. disabling validation makes loading large wasm files more than twice as fast (#1496)
-rwxr-xr-xcheck.py11
-rw-r--r--src/pass.h1
-rw-r--r--src/tools/asm2wasm.cpp8
-rw-r--r--src/tools/optimization-options.h5
-rw-r--r--src/tools/wasm-opt.cpp38
5 files changed, 40 insertions, 23 deletions
diff --git a/check.py b/check.py
index 4b6e94ba2..38ee6c591 100755
--- a/check.py
+++ b/check.py
@@ -73,11 +73,12 @@ def run_help_tests():
def run_wasm_opt_tests():
print '\n[ checking wasm-opt -o notation... ]\n'
- wast = os.path.join(options.binaryen_test, 'hello_world.wast')
- delete_from_orbit('a.wast')
- cmd = WASM_OPT + [wast, '-o', 'a.wast', '-S']
- run_command(cmd)
- fail_if_not_identical_to_file(open('a.wast').read(), wast)
+ for extra_args in [[], ['--no-validation']]:
+ wast = os.path.join(options.binaryen_test, 'hello_world.wast')
+ delete_from_orbit('a.wast')
+ cmd = WASM_OPT + [wast, '-o', 'a.wast', '-S'] + extra_args
+ run_command(cmd)
+ fail_if_not_identical_to_file(open('a.wast').read(), wast)
print '\n[ checking wasm-opt binary reading/writing... ]\n'
diff --git a/src/pass.h b/src/pass.h
index 59f0d3dcb..b4db3e706 100644
--- a/src/pass.h
+++ b/src/pass.h
@@ -57,6 +57,7 @@ private:
struct PassOptions {
bool debug = false; // run passes in debug mode, doing extra validation and timing checks
+ bool validate = true; // whether to run the validator to check for errors
bool validateGlobally = false; // when validating validate globally and not just locally
int optimizeLevel = 0; // 0, 1, 2 correspond to -O0, -O1, -O2, etc.
int shrinkLevel = 0; // 0, 1, 2 correspond to -O0, -Os, -Oz
diff --git a/src/tools/asm2wasm.cpp b/src/tools/asm2wasm.cpp
index 63367f0f7..986e50c50 100644
--- a/src/tools/asm2wasm.cpp
+++ b/src/tools/asm2wasm.cpp
@@ -215,9 +215,11 @@ int main(int argc, const char *argv[]) {
}
}
- if (!WasmValidator().validate(wasm, options.passOptions.features)) {
- WasmPrinter::printModule(&wasm);
- Fatal() << "error in validating output";
+ if (options.passOptions.validate) {
+ if (!WasmValidator().validate(wasm, options.passOptions.features)) {
+ WasmPrinter::printModule(&wasm);
+ Fatal() << "error in validating output";
+ }
}
if (options.debug) std::cerr << "emitting..." << std::endl;
diff --git a/src/tools/optimization-options.h b/src/tools/optimization-options.h
index 14ce6aa04..9fbba88cb 100644
--- a/src/tools/optimization-options.h
+++ b/src/tools/optimization-options.h
@@ -87,6 +87,11 @@ struct OptimizationOptions : public Options {
[this](Options* o, const std::string& argument) {
passOptions.shrinkLevel = atoi(argument.c_str());
})
+ .add("--no-validation", "-n", "Disables validation, assumes inputs are correct",
+ Options::Arguments::Zero,
+ [this](Options* o, const std::string& argument) {
+ passOptions.validate = false;
+ })
.add("--ignore-implicit-traps", "-iit", "Optimize under the helpful assumption that no surprising traps occur (from load, div/mod, etc.)",
Options::Arguments::Zero,
[this](Options*, const std::string&) {
diff --git a/src/tools/wasm-opt.cpp b/src/tools/wasm-opt.cpp
index d2189e616..d6ce53c26 100644
--- a/src/tools/wasm-opt.cpp
+++ b/src/tools/wasm-opt.cpp
@@ -132,9 +132,11 @@ int main(int argc, const char* argv[]) {
Fatal() << "error in building module, std::bad_alloc (possibly invalid request for silly amounts of memory)";
}
- if (!WasmValidator().validate(wasm, features)) {
- WasmPrinter::printModule(&wasm);
- Fatal() << "error in validating input";
+ if (options.passOptions.validate) {
+ if (!WasmValidator().validate(wasm, features)) {
+ WasmPrinter::printModule(&wasm);
+ Fatal() << "error in validating input";
+ }
}
} else {
// translate-to-fuzz
@@ -143,10 +145,12 @@ int main(int argc, const char* argv[]) {
reader.pickPasses(options);
}
reader.build();
- if (!WasmValidator().validate(wasm, features)) {
- WasmPrinter::printModule(&wasm);
- std::cerr << "translate-to-fuzz must always generate a valid module";
- abort();
+ if (options.passOptions.validate) {
+ if (!WasmValidator().validate(wasm, features)) {
+ WasmPrinter::printModule(&wasm);
+ std::cerr << "translate-to-fuzz must always generate a valid module";
+ abort();
+ }
}
}
@@ -194,22 +198,26 @@ int main(int argc, const char* argv[]) {
auto input = buffer.getAsChars();
WasmBinaryBuilder parser(other, input, false);
parser.read();
- bool valid = WasmValidator().validate(other, features);
- if (!valid) {
- WasmPrinter::printModule(&other);
+ if (options.passOptions.validate) {
+ bool valid = WasmValidator().validate(other, features);
+ if (!valid) {
+ WasmPrinter::printModule(&other);
+ }
+ assert(valid);
}
- assert(valid);
curr = &other;
}
if (options.runningPasses()) {
if (options.debug) std::cerr << "running passes...\n";
options.runPasses(*curr);
- bool valid = WasmValidator().validate(*curr, features);
- if (!valid) {
- WasmPrinter::printModule(&*curr);
+ if (options.passOptions.validate) {
+ bool valid = WasmValidator().validate(*curr, features);
+ if (!valid) {
+ WasmPrinter::printModule(&*curr);
+ }
+ assert(valid);
}
- assert(valid);
}
if (fuzzExec) {