diff options
-rw-r--r-- | src/tools/wasm-emscripten-finalize.cpp | 3 | ||||
-rw-r--r-- | src/wasm-emscripten.h | 6 | ||||
-rw-r--r-- | src/wasm/wasm-emscripten.cpp | 18 |
3 files changed, 26 insertions, 1 deletions
diff --git a/src/tools/wasm-emscripten-finalize.cpp b/src/tools/wasm-emscripten-finalize.cpp index f7de3af3f..c01fb00bf 100644 --- a/src/tools/wasm-emscripten-finalize.cpp +++ b/src/tools/wasm-emscripten-finalize.cpp @@ -277,6 +277,9 @@ int main(int argc, const char* argv[]) { } else { // If not standalone wasm then JS is relevant and we need dynCalls. generator.generateDynCallThunks(); + // This is also not needed in standalone mode since standalone mode uses + // crt1.c to invoke the main and is aware of __main_argc_argv mangling. + generator.renameMainArgcArgv(); } // Legalize the wasm, if BigInts don't make that moot. diff --git a/src/wasm-emscripten.h b/src/wasm-emscripten.h index 0fca27056..6343c13d7 100644 --- a/src/wasm-emscripten.h +++ b/src/wasm-emscripten.h @@ -60,6 +60,12 @@ public: void enforceStackLimit(); + // clang uses name mangling to rename the argc/argv form of main to + // __main_argc_argv. Emscripten in non-standalone mode expects that function + // to be exported as main. This function renames __main_argc_argv to main + // as expected by emscripten. + void renameMainArgcArgv(); + void exportWasiStart(); // Emits the data segments to a file. The file contains data from address base diff --git a/src/wasm/wasm-emscripten.cpp b/src/wasm/wasm-emscripten.cpp index 1d58699ec..c2cace488 100644 --- a/src/wasm/wasm-emscripten.cpp +++ b/src/wasm/wasm-emscripten.cpp @@ -1225,7 +1225,11 @@ std::string EmscriptenGlueGenerator::generateEmscriptenMetadata( meta << "\n ],\n"; auto mainReadsParams = false; - if (auto* exp = wasm.getExportOrNull("main")) { + auto* exp = wasm.getExportOrNull("main"); + if (!exp) { + exp = wasm.getExportOrNull("__main_argc_argv"); + } + if (exp) { if (exp->kind == ExternalKind::Function) { auto* main = wasm.getFunction(exp->value); mainReadsParams = true; @@ -1268,6 +1272,18 @@ void EmscriptenGlueGenerator::separateDataSegments(Output* outfile, wasm.memory.segments.clear(); } +void EmscriptenGlueGenerator::renameMainArgcArgv() { + // If an export call ed __main_argc_argv exists rename it to main + Export* ex = wasm.getExportOrNull("__main_argc_argv"); + if (!ex) { + BYN_TRACE("renameMain: __main_argc_argv not found\n"); + return; + } + ex->name = "main"; + wasm.updateMaps(); + ModuleUtils::renameFunction(wasm, "__main_argc_argv", "main"); +} + void EmscriptenGlueGenerator::exportWasiStart() { // If main exists, export a function to call it per the wasi standard. Name main = "main"; |