summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/wasm/wasm-emscripten.cpp13
1 files changed, 11 insertions, 2 deletions
diff --git a/src/wasm/wasm-emscripten.cpp b/src/wasm/wasm-emscripten.cpp
index 3653d7109..b18fe0c76 100644
--- a/src/wasm/wasm-emscripten.cpp
+++ b/src/wasm/wasm-emscripten.cpp
@@ -247,7 +247,7 @@ struct RemoveStackPointer : public PostWalker<RemoveStackPointer> {
void visitGetGlobal(GetGlobal* curr) {
if (getModule()->getGlobalOrNull(curr->name) == stackPointer) {
- ensureFunctionImport(getModule(), STACK_SAVE, "i");
+ needStackSave = true;
if (!builder) builder = make_unique<Builder>(*getModule());
replaceCurrent(builder->makeCall(STACK_SAVE, {}, i32));
}
@@ -255,12 +255,15 @@ struct RemoveStackPointer : public PostWalker<RemoveStackPointer> {
void visitSetGlobal(SetGlobal* curr) {
if (getModule()->getGlobalOrNull(curr->name) == stackPointer) {
- ensureFunctionImport(getModule(), STACK_RESTORE, "vi");
+ needStackRestore = true;
if (!builder) builder = make_unique<Builder>(*getModule());
replaceCurrent(builder->makeCall(STACK_RESTORE, {curr->value}, none));
}
}
+ bool needStackSave = false;
+ bool needStackRestore = false;
+
private:
std::unique_ptr<Builder> builder;
Global* stackPointer;
@@ -272,6 +275,12 @@ void EmscriptenGlueGenerator::replaceStackPointerGlobal() {
// Replace all uses of stack pointer global
RemoveStackPointer walker(stackPointer);
walker.walkModule(&wasm);
+ if (walker.needStackSave) {
+ ensureFunctionImport(&wasm, STACK_SAVE, "i");
+ }
+ if (walker.needStackRestore) {
+ ensureFunctionImport(&wasm, STACK_RESTORE, "vi");
+ }
// Finally remove the stack pointer global itself. This avoids importing
// a mutable global.