diff options
Diffstat (limited to 'src/asm2wasm.h')
-rw-r--r-- | src/asm2wasm.h | 49 |
1 files changed, 33 insertions, 16 deletions
diff --git a/src/asm2wasm.h b/src/asm2wasm.h index 4231fcc9a..5f6cee558 100644 --- a/src/asm2wasm.h +++ b/src/asm2wasm.h @@ -30,7 +30,8 @@ #include "pass.h" #include "ast_utils.h" #include "wasm-builder.h" -#include <wasm-validator.h> +#include "wasm-validator.h" +#include "wasm-module-building.h" namespace wasm { @@ -136,6 +137,8 @@ class Asm2WasmBuilder { Builder builder; + std::unique_ptr<OptimizingIncrementalModuleBuilder> optimizingBuilder; + // globals unsigned nextGlobal; // next place to put a global @@ -156,6 +159,7 @@ class Asm2WasmBuilder { bool memoryGrowth; bool debug; bool imprecise; + bool optimize; public: std::map<IString, MappedGlobal> mappedGlobals; @@ -267,7 +271,7 @@ private: } public: - Asm2WasmBuilder(Module& wasm, bool memoryGrowth, bool debug, bool imprecise) + Asm2WasmBuilder(Module& wasm, bool memoryGrowth, bool debug, bool imprecise, bool optimize) : wasm(wasm), allocator(wasm.allocator), builder(wasm), @@ -275,10 +279,10 @@ public: maxGlobal(1000), memoryGrowth(memoryGrowth), debug(debug), - imprecise(imprecise) {} + imprecise(imprecise), + optimize(optimize) {} void processAsm(Ref ast); - void optimize(); private: AsmType detectAsmType(Ref ast, AsmData *data) { @@ -523,6 +527,16 @@ void Asm2WasmBuilder::processAsm(Ref ast) { IString Int8Array, Int16Array, Int32Array, UInt8Array, UInt16Array, UInt32Array, Float32Array, Float64Array; + // set up optimization + + if (optimize) { + Index numFunctions = 0; + for (unsigned i = 1; i < body->size(); i++) { + if (body[i][0] == DEFUN) numFunctions++; + } + optimizingBuilder = std::unique_ptr<OptimizingIncrementalModuleBuilder>(new OptimizingIncrementalModuleBuilder(&wasm, numFunctions)); + } + // first pass - do almost everything, but function imports and indirect calls for (unsigned i = 1; i < body->size(); i++) { @@ -655,7 +669,12 @@ void Asm2WasmBuilder::processAsm(Ref ast) { } } else if (curr[0] == DEFUN) { // function - wasm.addFunction(processFunction(curr)); + auto* func = processFunction(curr); + if (optimize) { + optimizingBuilder->addFunction(func); + } else { + wasm.addFunction(func); + } } else if (curr[0] == RETURN) { // exports Ref object = curr[1]; @@ -690,6 +709,15 @@ void Asm2WasmBuilder::processAsm(Ref ast) { } } + if (optimize) { + optimizingBuilder->finish(); + if (maxGlobal < 1024) { + PassRunner passRunner(&wasm); + passRunner.add("post-emscripten"); + passRunner.run(); + } + } + // second pass. first, function imports std::vector<IString> toErase; @@ -1726,17 +1754,6 @@ Function* Asm2WasmBuilder::processFunction(Ref ast) { return function; } -void Asm2WasmBuilder::optimize() { - PassRunner passRunner(&wasm); - passRunner.addDefaultOptimizationPasses(); - if (maxGlobal < 1024) { - passRunner.add("post-emscripten"); - } - passRunner.run(); - - assert(WasmValidator().validate(wasm)); -} - } // namespace wasm #endif // wasm_asm2wasm_h |