summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSam Clegg <sbc@chromium.org>2018-12-14 18:52:15 -0800
committerGitHub <noreply@github.com>2018-12-14 18:52:15 -0800
commitc300e05873da1c8cafb654285f31959af1b3b9fc (patch)
tree523ae78dc5d00e214f0316f4dea4129c78a4be8e /src
parent6cc598496a62ff4dbdb680b400ca26a9b1059e7c (diff)
downloadbinaryen-c300e05873da1c8cafb654285f31959af1b3b9fc.tar.gz
binaryen-c300e05873da1c8cafb654285f31959af1b3b9fc.tar.bz2
binaryen-c300e05873da1c8cafb654285f31959af1b3b9fc.zip
wasm-emscripten-finalize: Delay function creation until after module walk (#1828)
This fixes a crash where startSave/stackRestore could be created while iterating through `module.functions`.
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.