diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/passes/PostEmscripten.cpp | 31 |
1 files changed, 29 insertions, 2 deletions
diff --git a/src/passes/PostEmscripten.cpp b/src/passes/PostEmscripten.cpp index 9d2b41094..62fd9d845 100644 --- a/src/passes/PostEmscripten.cpp +++ b/src/passes/PostEmscripten.cpp @@ -20,17 +20,21 @@ // #include <asmjs/shared-constants.h> +#include <ir/import-utils.h> #include <ir/localize.h> #include <pass.h> +#include <shared-constants.h> #include <wasm-builder.h> #include <wasm.h> namespace wasm { -struct PostEmscripten : public WalkerPass<PostWalker<PostEmscripten>> { +namespace { + +struct OptimizeCalls : public WalkerPass<PostWalker<OptimizeCalls>> { bool isFunctionParallel() override { return true; } - Pass* create() override { return new PostEmscripten; } + Pass* create() override { return new OptimizeCalls; } void visitCall(Call* curr) { // special asm.js imports can be optimized @@ -60,6 +64,29 @@ struct PostEmscripten : public WalkerPass<PostWalker<PostEmscripten>> { } }; +} // namespace + +struct PostEmscripten : public Pass { + void run(PassRunner* runner, Module* module) override { + // Apply the sbrk ptr, if it was provided. + auto sbrkPtrStr = + runner->options.getArgumentOrDefault("emscripten-sbrk-ptr", ""); + if (sbrkPtrStr != "") { + auto sbrkPtr = std::stoi(sbrkPtrStr); + ImportInfo imports(*module); + auto* func = imports.getImportedFunction(ENV, "emscripten_get_sbrk_ptr"); + if (func) { + Builder builder(*module); + func->body = builder.makeConst(Literal(int32_t(sbrkPtr))); + func->module = func->base = Name(); + } + } + + // Optimize calls + OptimizeCalls().run(runner, module); + } +}; + Pass* createPostEmscriptenPass() { return new PostEmscripten(); } } // namespace wasm |