summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/binaryen-c.cpp21
-rw-r--r--src/binaryen-c.h3
-rw-r--r--src/js/binaryen.js-post.js7
-rw-r--r--src/wasm-js.cpp2
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);
}