diff options
author | Sam Clegg <sbc@chromium.org> | 2018-12-14 18:52:15 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-14 18:52:15 -0800 |
commit | c300e05873da1c8cafb654285f31959af1b3b9fc (patch) | |
tree | 523ae78dc5d00e214f0316f4dea4129c78a4be8e /src | |
parent | 6cc598496a62ff4dbdb680b400ca26a9b1059e7c (diff) | |
download | binaryen-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.cpp | 13 |
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. |