diff options
-rw-r--r-- | src/wasm/wasm-emscripten.cpp | 14 | ||||
-rw-r--r-- | test/lit/wasm-emscripten-finalize/em_js.wat | 28 |
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) + ) +) |