summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/tools/wasm-emscripten-finalize.cpp3
-rw-r--r--src/wasm-emscripten.h6
-rw-r--r--src/wasm/wasm-emscripten.cpp18
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";