summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/passes/PostEmscripten.cpp31
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