diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/wasm/wasm-emscripten.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/wasm/wasm-emscripten.cpp b/src/wasm/wasm-emscripten.cpp index a21c45476..ea24b945d 100644 --- a/src/wasm/wasm-emscripten.cpp +++ b/src/wasm/wasm-emscripten.cpp @@ -47,10 +47,15 @@ void addExportedFunction(Module& wasm, Function* function) { } Global* EmscriptenGlueGenerator::getStackPointerGlobal() { - // Assumption: first global is __stack_pointer - // TODO(sbc): Once mutable globals are a thing we shouldn't need this - // at all since we can simply export __stack_pointer. - return wasm.globals[0].get(); + // Assumption: The first non-imported global is global is __stack_pointer + // TODO(sbc): Find a better way to discover the stack pointer. Perhaps the + // linker could export it by name? + for (auto& g : wasm.globals) { + if (!g->imported()) { + return g.get(); + } + } + Fatal() << "stack pointer global not found"; } Expression* EmscriptenGlueGenerator::generateLoadStackPointer() { @@ -157,6 +162,9 @@ Function* EmscriptenGlueGenerator::generateMemoryGrowthFunction() { void EmscriptenGlueGenerator::generateStackInitialization(Address addr) { auto* stackPointer = getStackPointerGlobal(); + assert(!stackPointer->imported()); + if (!stackPointer->init || !stackPointer->init->is<Const>()) + Fatal() << "stack pointer global is not assignable"; stackPointer->init->cast<Const>()->value = Literal(int32_t(addr)); } |