diff options
-rw-r--r-- | src/passes/PostEmscripten.cpp | 31 | ||||
-rw-r--r-- | test/passes/post-emscripten_pass-arg=emscripten-sbrk-ptr@4008.txt | 8 | ||||
-rw-r--r-- | test/passes/post-emscripten_pass-arg=emscripten-sbrk-ptr@4008.wast | 5 |
3 files changed, 42 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 diff --git a/test/passes/post-emscripten_pass-arg=emscripten-sbrk-ptr@4008.txt b/test/passes/post-emscripten_pass-arg=emscripten-sbrk-ptr@4008.txt new file mode 100644 index 000000000..4b8da86cd --- /dev/null +++ b/test/passes/post-emscripten_pass-arg=emscripten-sbrk-ptr@4008.txt @@ -0,0 +1,8 @@ +(module + (type $FUNCSIG$i (func (result i32))) + (func $internal (; 0 ;) (type $FUNCSIG$i) (result i32) + (i32.const 4008) + ) +) +(module +) diff --git a/test/passes/post-emscripten_pass-arg=emscripten-sbrk-ptr@4008.wast b/test/passes/post-emscripten_pass-arg=emscripten-sbrk-ptr@4008.wast new file mode 100644 index 000000000..8e5a610b2 --- /dev/null +++ b/test/passes/post-emscripten_pass-arg=emscripten-sbrk-ptr@4008.wast @@ -0,0 +1,5 @@ +(module + (import "env" "emscripten_get_sbrk_ptr" (func $internal(result i32))) +) +(module +) |