summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/wasm/wasm-emscripten.cpp14
-rw-r--r--test/lit/wasm-emscripten-finalize/em_js.wat28
2 files changed, 33 insertions, 9 deletions
diff --git a/src/wasm/wasm-emscripten.cpp b/src/wasm/wasm-emscripten.cpp
index 8f0d4f9c8..96263f527 100644
--- a/src/wasm/wasm-emscripten.cpp
+++ b/src/wasm/wasm-emscripten.cpp
@@ -374,6 +374,7 @@ static AsmConstWalker fixEmAsmConstsAndReturnWalker(Module& wasm,
struct EmJsWalker : public PostWalker<EmJsWalker> {
Module& wasm;
std::vector<Address> segmentOffsets; // segment index => address offset
+ std::vector<Export> toRemove;
std::map<std::string, std::string> codeByName;
@@ -387,6 +388,7 @@ struct EmJsWalker : public PostWalker<EmJsWalker> {
if (!curr->name.startsWith(EM_JS_PREFIX.str)) {
return;
}
+ toRemove.push_back(*curr);
auto* func = wasm.getFunction(curr->value);
auto funcName = std::string(curr->name.stripPrefix(EM_JS_PREFIX.str));
// An EM_JS has a single const in the body. Typically it is just returned,
@@ -407,15 +409,9 @@ EmJsWalker fixEmJsFuncsAndReturnWalker(Module& wasm) {
EmJsWalker walker(wasm);
walker.walkModule(&wasm);
- std::vector<Name> toRemove;
- for (auto& func : wasm.functions) {
- if (func->name.startsWith(EM_JS_PREFIX.str)) {
- toRemove.push_back(func->name);
- }
- }
- for (auto funcName : toRemove) {
- wasm.removeFunction(funcName);
- wasm.removeExport(funcName);
+ for (const Export& exp : walker.toRemove) {
+ wasm.removeExport(exp.name);
+ wasm.removeFunction(exp.value);
}
return walker;
}
diff --git a/test/lit/wasm-emscripten-finalize/em_js.wat b/test/lit/wasm-emscripten-finalize/em_js.wat
new file mode 100644
index 000000000..c2dd4c17d
--- /dev/null
+++ b/test/lit/wasm-emscripten-finalize/em_js.wat
@@ -0,0 +1,28 @@
+;; Test that funcions exported with __em_js are correctly removed
+;; once they strings they return are extracted.
+
+;; RUN: wasm-emscripten-finalize %s -S | filecheck %s
+
+;; Both functions should be stripped from the binary
+;; CHECK-NOT: (func
+
+;; CHECK: "emJsFuncs": {
+;; CHECK-NEXT: "bar": "more JS string dara",
+;; CHECK-NEXT: "foo": "some JS string"
+;; CHECK-NEXT: },
+
+(module
+ (memory 1 1)
+ (data (i32.const 1024) "some JS string\00")
+ (data (i32.const 2048) "more JS string dara\00")
+ (export "__em_js__foo" (func $__em_js__foo))
+ (export "__em_js__bar" (func $bar))
+ ;; Name matches export name
+ (func $__em_js__foo (result i32)
+ (i32.const 1024)
+ )
+ ;; Name does not match export name
+ (func $bar (result i32)
+ (i32.const 2048)
+ )
+)