diff options
Diffstat (limited to 'src/tools/wasm-emscripten-finalize.cpp')
-rw-r--r-- | src/tools/wasm-emscripten-finalize.cpp | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/src/tools/wasm-emscripten-finalize.cpp b/src/tools/wasm-emscripten-finalize.cpp index 2aa5de46f..180383a90 100644 --- a/src/tools/wasm-emscripten-finalize.cpp +++ b/src/tools/wasm-emscripten-finalize.cpp @@ -46,6 +46,7 @@ int main(int argc, const char *argv[]) { std::string dataSegmentFile; bool emitBinary = true; bool debugInfo = false; + bool isSideModule = false; bool legalizeJavaScriptFFI = true; uint64_t globalBase = INVALID_BASE; uint64_t initialStackPointer = INVALID_BASE; @@ -79,7 +80,11 @@ int main(int argc, const char *argv[]) { [&initialStackPointer](Options*, const std::string&argument ) { initialStackPointer = std::stoull(argument); }) - + .add("--side-module", "", "Input is an emscripten side module", + Options::Arguments::Zero, + [&isSideModule](Options *o, const std::string& argument) { + isSideModule = true; + }) .add("--input-source-map", "-ism", "Consume source map from the specified file", Options::Arguments::One, [&inputSourceMapFilename](Options *o, const std::string& argument) { inputSourceMapFilename = argument; }) @@ -130,7 +135,6 @@ int main(int argc, const char *argv[]) { WasmPrinter::printModule(&wasm, std::cerr); } - bool isSideModule = false; for (const UserSection& section : wasm.userSections) { if (section.name == BinaryConsts::UserSections::Dylink) { isSideModule = true; @@ -166,12 +170,6 @@ int main(int argc, const char *argv[]) { std::vector<Name> initializerFunctions; - // The names of standard imports/exports used by lld doesn't quite match that - // expected by emscripten. - // TODO(sbc): Unify these - if (Export* ex = wasm.getExportOrNull("__wasm_call_ctors")) { - ex->name = "__post_instantiate"; - } if (wasm.table.imported()) { if (wasm.table.base != "table") wasm.table.base = Name("table"); } @@ -182,14 +180,17 @@ int main(int argc, const char *argv[]) { if (isSideModule) { generator.replaceStackPointerGlobal(); + generator.generatePostInstantiateFunction(); } else { generator.generateRuntimeFunctions(); generator.generateMemoryGrowthFunction(); generator.generateStackInitialization(initialStackPointer); - // emscripten calls this by default for side libraries so we only need - // to include in as a static ctor for main module case. - if (wasm.getExportOrNull("__post_instantiate")) { - initializerFunctions.push_back("__post_instantiate"); + // For side modules these gets called via __post_instantiate + if (Function* F = generator.generateAssignGOTEntriesFunction()) { + initializerFunctions.push_back(F->name); + } + if (auto* e = wasm.getExportOrNull(WASM_CALL_CTORS)) { + initializerFunctions.push_back(e->value); } } |