diff options
author | Alon Zakai <alonzakai@gmail.com> | 2018-04-09 11:25:28 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-09 11:25:28 -0700 |
commit | 27517701d611ad7de5b467eaee2f0d589180465f (patch) | |
tree | d5a91529fe24d4f5d5578a05a58250e71cc6c323 | |
parent | e42e1e3d4a5c67c0c066fe397b456ab8d41a78fd (diff) | |
download | binaryen-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-x | check.py | 11 | ||||
-rw-r--r-- | src/pass.h | 1 | ||||
-rw-r--r-- | src/tools/asm2wasm.cpp | 8 | ||||
-rw-r--r-- | src/tools/optimization-options.h | 5 | ||||
-rw-r--r-- | src/tools/wasm-opt.cpp | 38 |
5 files changed, 40 insertions, 23 deletions
@@ -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) { |