summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/passes/PostEmscripten.cpp31
-rw-r--r--test/passes/post-emscripten_pass-arg=emscripten-sbrk-ptr@4008.txt8
-rw-r--r--test/passes/post-emscripten_pass-arg=emscripten-sbrk-ptr@4008.wast5
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
+)