summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <azakai@google.com>2019-07-22 18:00:52 -0700
committerGitHub <noreply@github.com>2019-07-22 18:00:52 -0700
commitff2b10bd641039e2cf4eb00b767ac5139a41583e (patch)
tree1d5b392d8708e90ea48cccb6e0a20a424aa198f7
parentc8101d1b67ffcce38718f07ba560ce56ddb3f240 (diff)
downloadbinaryen-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.cpp18
-rw-r--r--test/lld/duplicate_imports.wast.out3
-rw-r--r--test/lld/em_asm.wast.mem.out3
-rw-r--r--test/lld/em_asm.wast.out3
-rw-r--r--test/lld/em_asm_O0.wast.out3
-rw-r--r--test/lld/em_asm_shared.wast.out3
-rw-r--r--test/lld/em_asm_table.wast.out3
-rw-r--r--test/lld/em_js_O0.wast.out3
-rw-r--r--test/lld/hello_world.passive.wast.out3
-rw-r--r--test/lld/hello_world.wast.mem.out3
-rw-r--r--test/lld/hello_world.wast.out3
-rw-r--r--test/lld/init.wast.out3
-rw-r--r--test/lld/recursive.wast.out3
-rw-r--r--test/lld/reserved_func_ptr.wast.out3
-rw-r--r--test/lld/shared.wast.out3
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 --
;)