diff options
author | Alon Zakai <azakai@google.com> | 2019-07-22 18:00:52 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-07-22 18:00:52 -0700 |
commit | ff2b10bd641039e2cf4eb00b767ac5139a41583e (patch) | |
tree | 1d5b392d8708e90ea48cccb6e0a20a424aa198f7 | |
parent | c8101d1b67ffcce38718f07ba560ce56ddb3f240 (diff) | |
download | binaryen-ff2b10bd641039e2cf4eb00b767ac5139a41583e.tar.gz binaryen-ff2b10bd641039e2cf4eb00b767ac5139a41583e.tar.bz2 binaryen-ff2b10bd641039e2cf4eb00b767ac5139a41583e.zip |
wasm-emscripten-finalize: Add mainReadsParams metadata (#2247)
The new flag indicates whether main reads the argc/argv parameters. If it does not, we can avoid emitting code to generate those arguments in the JS, which is not trivial in small programs - it requires some string conversion code.
Nicely the existing test inputs were enough for testing this (see outputs).
This depends on an emscripten change to land first, as emscripten.py asserts on metadata fields it doesn't recognize.
-rw-r--r-- | src/wasm/wasm-emscripten.cpp | 18 | ||||
-rw-r--r-- | test/lld/duplicate_imports.wast.out | 3 | ||||
-rw-r--r-- | test/lld/em_asm.wast.mem.out | 3 | ||||
-rw-r--r-- | test/lld/em_asm.wast.out | 3 | ||||
-rw-r--r-- | test/lld/em_asm_O0.wast.out | 3 | ||||
-rw-r--r-- | test/lld/em_asm_shared.wast.out | 3 | ||||
-rw-r--r-- | test/lld/em_asm_table.wast.out | 3 | ||||
-rw-r--r-- | test/lld/em_js_O0.wast.out | 3 | ||||
-rw-r--r-- | test/lld/hello_world.passive.wast.out | 3 | ||||
-rw-r--r-- | test/lld/hello_world.wast.mem.out | 3 | ||||
-rw-r--r-- | test/lld/hello_world.wast.out | 3 | ||||
-rw-r--r-- | test/lld/init.wast.out | 3 | ||||
-rw-r--r-- | test/lld/recursive.wast.out | 3 | ||||
-rw-r--r-- | test/lld/reserved_func_ptr.wast.out | 3 | ||||
-rw-r--r-- | test/lld/shared.wast.out | 3 |
15 files changed, 45 insertions, 15 deletions
diff --git a/src/wasm/wasm-emscripten.cpp b/src/wasm/wasm-emscripten.cpp index a3433bf9f..3ee3e4424 100644 --- a/src/wasm/wasm-emscripten.cpp +++ b/src/wasm/wasm-emscripten.cpp @@ -1042,7 +1042,23 @@ std::string EmscriptenGlueGenerator::generateEmscriptenMetadata( wasm.features.iterFeatures([&](FeatureSet::Feature f) { meta << nextElement() << "\"--enable-" << FeatureSet::toString(f) << '"'; }); - meta << "\n ]\n"; + meta << "\n ],\n"; + + auto mainReadsParams = false; + if (auto* exp = wasm.getExportOrNull("main")) { + if (exp->kind == ExternalKind::Function) { + auto* main = wasm.getFunction(exp->value); + mainReadsParams = true; + // If main does not read its parameters, it will just be a stub that + // calls __original_main (which has no parameters). + if (auto* call = main->body->dynCast<Call>()) { + if (call->operands.empty()) { + mainReadsParams = false; + } + } + } + } + meta << " \"mainReadsParams\": " << int(mainReadsParams) << '\n'; meta << "}\n"; diff --git a/test/lld/duplicate_imports.wast.out b/test/lld/duplicate_imports.wast.out index 7aebdca50..323365711 100644 --- a/test/lld/duplicate_imports.wast.out +++ b/test/lld/duplicate_imports.wast.out @@ -115,7 +115,8 @@ "invoke_ffd" ], "features": [ - ] + ], + "mainReadsParams": 1 } -- END METADATA -- ;) diff --git a/test/lld/em_asm.wast.mem.out b/test/lld/em_asm.wast.mem.out index 90b3560ce..13d289f46 100644 --- a/test/lld/em_asm.wast.mem.out +++ b/test/lld/em_asm.wast.mem.out @@ -262,7 +262,8 @@ "invokeFuncs": [ ], "features": [ - ] + ], + "mainReadsParams": 0 } -- END METADATA -- ;) diff --git a/test/lld/em_asm.wast.out b/test/lld/em_asm.wast.out index 6cb47ac93..f0c38792d 100644 --- a/test/lld/em_asm.wast.out +++ b/test/lld/em_asm.wast.out @@ -263,7 +263,8 @@ "invokeFuncs": [ ], "features": [ - ] + ], + "mainReadsParams": 0 } -- END METADATA -- ;) diff --git a/test/lld/em_asm_O0.wast.out b/test/lld/em_asm_O0.wast.out index 2426f3829..10c293a0b 100644 --- a/test/lld/em_asm_O0.wast.out +++ b/test/lld/em_asm_O0.wast.out @@ -123,7 +123,8 @@ "invokeFuncs": [ ], "features": [ - ] + ], + "mainReadsParams": 1 } -- END METADATA -- ;) diff --git a/test/lld/em_asm_shared.wast.out b/test/lld/em_asm_shared.wast.out index a76906028..5b984f7ae 100644 --- a/test/lld/em_asm_shared.wast.out +++ b/test/lld/em_asm_shared.wast.out @@ -244,7 +244,8 @@ "invokeFuncs": [ ], "features": [ - ] + ], + "mainReadsParams": 0 } -- END METADATA -- ;) diff --git a/test/lld/em_asm_table.wast.out b/test/lld/em_asm_table.wast.out index ed821cd18..48d02d208 100644 --- a/test/lld/em_asm_table.wast.out +++ b/test/lld/em_asm_table.wast.out @@ -93,7 +93,8 @@ "invokeFuncs": [ ], "features": [ - ] + ], + "mainReadsParams": 0 } -- END METADATA -- ;) diff --git a/test/lld/em_js_O0.wast.out b/test/lld/em_js_O0.wast.out index fb647ffde..6e141975d 100644 --- a/test/lld/em_js_O0.wast.out +++ b/test/lld/em_js_O0.wast.out @@ -73,7 +73,8 @@ "invokeFuncs": [ ], "features": [ - ] + ], + "mainReadsParams": 0 } -- END METADATA -- ;) diff --git a/test/lld/hello_world.passive.wast.out b/test/lld/hello_world.passive.wast.out index 88a06c1f3..6c9fd4ef7 100644 --- a/test/lld/hello_world.passive.wast.out +++ b/test/lld/hello_world.passive.wast.out @@ -105,7 +105,8 @@ "invokeFuncs": [ ], "features": [ - ] + ], + "mainReadsParams": 0 } -- END METADATA -- ;) diff --git a/test/lld/hello_world.wast.mem.out b/test/lld/hello_world.wast.mem.out index 49a441772..c8891f6d9 100644 --- a/test/lld/hello_world.wast.mem.out +++ b/test/lld/hello_world.wast.mem.out @@ -97,7 +97,8 @@ "invokeFuncs": [ ], "features": [ - ] + ], + "mainReadsParams": 0 } -- END METADATA -- ;) diff --git a/test/lld/hello_world.wast.out b/test/lld/hello_world.wast.out index 6b2870e14..9e01def20 100644 --- a/test/lld/hello_world.wast.out +++ b/test/lld/hello_world.wast.out @@ -98,7 +98,8 @@ "invokeFuncs": [ ], "features": [ - ] + ], + "mainReadsParams": 0 } -- END METADATA -- ;) diff --git a/test/lld/init.wast.out b/test/lld/init.wast.out index fc95468e0..273e0d6aa 100644 --- a/test/lld/init.wast.out +++ b/test/lld/init.wast.out @@ -110,7 +110,8 @@ "invokeFuncs": [ ], "features": [ - ] + ], + "mainReadsParams": 0 } -- END METADATA -- ;) diff --git a/test/lld/recursive.wast.out b/test/lld/recursive.wast.out index a7c7bd85c..24868211d 100644 --- a/test/lld/recursive.wast.out +++ b/test/lld/recursive.wast.out @@ -155,7 +155,8 @@ "invokeFuncs": [ ], "features": [ - ] + ], + "mainReadsParams": 0 } -- END METADATA -- ;) diff --git a/test/lld/reserved_func_ptr.wast.out b/test/lld/reserved_func_ptr.wast.out index a05faf2b9..613802f6a 100644 --- a/test/lld/reserved_func_ptr.wast.out +++ b/test/lld/reserved_func_ptr.wast.out @@ -192,7 +192,8 @@ "invokeFuncs": [ ], "features": [ - ] + ], + "mainReadsParams": 1 } -- END METADATA -- ;) diff --git a/test/lld/shared.wast.out b/test/lld/shared.wast.out index 1e2ab04eb..4931092d6 100644 --- a/test/lld/shared.wast.out +++ b/test/lld/shared.wast.out @@ -124,7 +124,8 @@ "invokeFuncs": [ ], "features": [ - ] + ], + "mainReadsParams": 0 } -- END METADATA -- ;) |