diff options
author | Daniel Wirtz <dcode@dcode.io> | 2017-10-30 19:27:31 +0100 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2017-10-30 11:27:31 -0700 |
commit | 7a4c47e7d4e70404249af4a9ac4ffcbe23d2cd67 (patch) | |
tree | cdc39bf0db7d76318e56c41ecd633a8ced877e01 /src | |
parent | da871deea05366006a3942cebb61e8463c1c4100 (diff) | |
download | binaryen-7a4c47e7d4e70404249af4a9ac4ffcbe23d2cd67.tar.gz binaryen-7a4c47e7d4e70404249af4a9ac4ffcbe23d2cd67.tar.bz2 binaryen-7a4c47e7d4e70404249af4a9ac4ffcbe23d2cd67.zip |
Added the ability to run specific optimization passes to binaryen-c/.js (#1252)
Diffstat (limited to 'src')
-rw-r--r-- | src/binaryen-c.cpp | 21 | ||||
-rw-r--r-- | src/binaryen-c.h | 3 | ||||
-rw-r--r-- | src/js/binaryen.js-post.js | 7 | ||||
-rw-r--r-- | src/wasm-js.cpp | 2 |
4 files changed, 32 insertions, 1 deletions
diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index 15635c940..7901f46d3 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -969,6 +969,27 @@ void BinaryenModuleOptimize(BinaryenModuleRef module) { passRunner.run(); } +void BinaryenModuleRunPasses(BinaryenModuleRef module, const char **passes, BinaryenIndex numPasses) { + if (tracing) { + std::cout << " {\n"; + std::cout << " const char* passes[] = { "; + for (BinaryenIndex i = 0; i < numPasses; i++) { + if (i > 0) std::cout << ", "; + std::cout << "\"" << passes[i] << "\""; + } + std::cout << " };\n"; + std::cout << " BinaryenModuleRunPasses(the_module, passes, " << numPasses << ");\n"; + std::cout << " }\n"; + } + + Module* wasm = (Module*)module; + PassRunner passRunner(wasm); + for (BinaryenIndex i = 0; i < numPasses; i++) { + passRunner.add(passes[i]); + } + passRunner.run(); +} + void BinaryenModuleAutoDrop(BinaryenModuleRef module) { if (tracing) { std::cout << " BinaryenModuleAutoDrop(the_module);\n"; diff --git a/src/binaryen-c.h b/src/binaryen-c.h index d6e420546..0b3f5cc85 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -391,6 +391,9 @@ int BinaryenModuleValidate(BinaryenModuleRef module); // Run the standard optimization passes on the module. void BinaryenModuleOptimize(BinaryenModuleRef module); +// Runs the specified passes on the module. +void BinaryenModuleRunPasses(BinaryenModuleRef module, const char **passes, BinaryenIndex numPasses); + // Auto-generate drop() operations where needed. This lets you generate code without // worrying about where they are needed. (It is more efficient to do it yourself, // but simpler to use autodrop). diff --git a/src/js/binaryen.js-post.js b/src/js/binaryen.js-post.js index 985691494..d4e2cbf80 100644 --- a/src/js/binaryen.js-post.js +++ b/src/js/binaryen.js-post.js @@ -847,6 +847,13 @@ this['optimize'] = function() { return Module['_BinaryenModuleOptimize'](module); }; + this['runPasses'] = function(passes) { + return preserveStack(function() { + return Module['_BinaryenModuleRunPasses'](module, i32sToStack( + passes.map(strToStack) + ), passes.length); + }); + } this['autoDrop'] = function() { return Module['_BinaryenModuleAutoDrop'](module); }; diff --git a/src/wasm-js.cpp b/src/wasm-js.cpp index efc316a22..0a0961066 100644 --- a/src/wasm-js.cpp +++ b/src/wasm-js.cpp @@ -80,7 +80,7 @@ extern "C" void EMSCRIPTEN_KEEPALIVE load_asm2wasm(char *input) { module->memory.max = pre.memoryGrowth ? Address(Memory::kMaxSize) : module->memory.initial; if (wasmJSDebug) std::cerr << "wasming...\n"; - asm2wasm = new Asm2WasmBuilder(*module, pre, debug, Asm2WasmBuilder::TrapMode::JS, PassOptions(), true /* runJSFFIPass */, false /* TODO: support optimizing? */, false /* TODO: support asm2wasm-i64? */); + asm2wasm = new Asm2WasmBuilder(*module, pre, debug, TrapMode::JS, PassOptions(), true /* runJSFFIPass */, false /* TODO: support optimizing? */, false /* TODO: support asm2wasm-i64? */); asm2wasm->processAsm(asmjs); } |