From 129d0b01ef0caf018a0d6803389be5098230c2f1 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 5 May 2026 15:41:30 -0700 Subject: [PATCH 1/4] go --- src/passes/RemoveExports.cpp | 18 +++++++++-- test/lit/passes/remove-exports-file.txt | 2 ++ test/lit/passes/remove-exports-file.wast | 40 +++++++++++++++++++++++ test/lit/passes/remove-exports-list.wast | 41 ++++++++++++++++++++++++ 4 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 test/lit/passes/remove-exports-file.txt create mode 100644 test/lit/passes/remove-exports-file.wast create mode 100644 test/lit/passes/remove-exports-list.wast diff --git a/src/passes/RemoveExports.cpp b/src/passes/RemoveExports.cpp index 99cd0ff641d..ca5b4fc5ab0 100644 --- a/src/passes/RemoveExports.cpp +++ b/src/passes/RemoveExports.cpp @@ -21,8 +21,12 @@ // // That will remove all exports with names like "__foo" and "__bar". // +// Exports can also be specified as a comma-separated list, and can be a +// response file. +// #include "pass.h" +#include "support/file.h" #include "support/string.h" #include "wasm.h" @@ -32,13 +36,21 @@ namespace { struct RemoveExports : public Pass { void run(Module* module) override { - std::string pattern = + std::string param = getArgument(name, "Usage usage: wasm-opt --" + name + "=WILDCARD"); + param = String::trim(read_possible_response_file(param)); + + String::Split patterns(param, String::Split::NewLineOr(",")); + patterns = handleBracketingOperators(patterns); + std::vector toRemove; for (auto& exp : module->exports) { - if (String::wildcardMatch(pattern, exp->name.toString())) { - toRemove.push_back(exp->name); + for (auto& pattern : patterns) { + if (String::wildcardMatch(pattern, exp->name.toString())) { + toRemove.push_back(exp->name); + break; + } } } diff --git a/test/lit/passes/remove-exports-file.txt b/test/lit/passes/remove-exports-file.txt new file mode 100644 index 00000000000..3bd1f0e2974 --- /dev/null +++ b/test/lit/passes/remove-exports-file.txt @@ -0,0 +1,2 @@ +foo +bar diff --git a/test/lit/passes/remove-exports-file.wast b/test/lit/passes/remove-exports-file.wast new file mode 100644 index 00000000000..5ff6eb95534 --- /dev/null +++ b/test/lit/passes/remove-exports-file.wast @@ -0,0 +1,40 @@ +;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. +;; NOTE: This test was ported using port_passes_tests_to_lit.py and could be cleaned up. + +;; RUN: foreach %s %t wasm-opt --remove-exports=@%S/remove-exports-file.txt -all -S -o - | filecheck %s + +;; Test a response file as the input to this pass. foo and bar will be removed. +(module + ;; CHECK: (type $0 (func)) + + ;; CHECK: (export "foo" (func $foo)) + + ;; CHECK: (export "bar" (func $bar)) + + ;; CHECK: (func $foo (type $0) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $foo (export "foo") + (drop (i32.const 1)) + ) + + ;; CHECK: (func $bar (type $0) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $bar (export "bar") + (drop (i32.const 2)) + ) + + ;; CHECK: (func $__bar (type $0) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $keep (export "keep") + (drop (i32.const 3)) + ) +) diff --git a/test/lit/passes/remove-exports-list.wast b/test/lit/passes/remove-exports-list.wast new file mode 100644 index 00000000000..4284ed6838a --- /dev/null +++ b/test/lit/passes/remove-exports-list.wast @@ -0,0 +1,41 @@ +;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. +;; NOTE: This test was ported using port_passes_tests_to_lit.py and could be cleaned up. + +;; RUN: foreach %s %t wasm-opt --remove-exports=foo,bar" -all -S -o - | filecheck %s + +;; The two exports mentioned will be removed (note the handling of comma +;; separation, taking into account bracketing). The other will remain. +(module + ;; CHECK: (type $0 (func)) + + ;; CHECK: (export "foo" (func $foo)) + + ;; CHECK: (export "bar" (func $bar)) + + ;; CHECK: (func $foo (type $0) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $foo (export "foo") + (drop (i32.const 1)) + ) + + ;; CHECK: (func $bar (type $0) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $bar (export "bar") + (drop (i32.const 2)) + ) + + ;; CHECK: (func $__bar (type $0) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $keep (export "keep") + (drop (i32.const 3)) + ) +) From db4b35fb6766f804160d80eb2ca522174d1c2b50 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 5 May 2026 15:44:25 -0700 Subject: [PATCH 2/4] finish --- test/lit/passes/remove-exports-file.wast | 12 +++++------- test/lit/passes/remove-exports-list.wast | 16 +++++++--------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/test/lit/passes/remove-exports-file.wast b/test/lit/passes/remove-exports-file.wast index 5ff6eb95534..e4f4171da23 100644 --- a/test/lit/passes/remove-exports-file.wast +++ b/test/lit/passes/remove-exports-file.wast @@ -7,31 +7,29 @@ (module ;; CHECK: (type $0 (func)) - ;; CHECK: (export "foo" (func $foo)) - - ;; CHECK: (export "bar" (func $bar)) + ;; CHECK: (export "keep" (func $keep)) ;; CHECK: (func $foo (type $0) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - (func $foo (export "foo") + (func $foo (export "foo") (drop (i32.const 1)) ) ;; CHECK: (func $bar (type $0) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $bar (export "bar") (drop (i32.const 2)) ) - ;; CHECK: (func $__bar (type $0) + ;; CHECK: (func $keep (type $0) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $keep (export "keep") diff --git a/test/lit/passes/remove-exports-list.wast b/test/lit/passes/remove-exports-list.wast index 4284ed6838a..07e60d1992d 100644 --- a/test/lit/passes/remove-exports-list.wast +++ b/test/lit/passes/remove-exports-list.wast @@ -1,38 +1,36 @@ ;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. ;; NOTE: This test was ported using port_passes_tests_to_lit.py and could be cleaned up. -;; RUN: foreach %s %t wasm-opt --remove-exports=foo,bar" -all -S -o - | filecheck %s +;; RUN: foreach %s %t wasm-opt "--remove-exports=foo,bar" -all -S -o - | filecheck %s ;; The two exports mentioned will be removed (note the handling of comma ;; separation, taking into account bracketing). The other will remain. (module ;; CHECK: (type $0 (func)) - ;; CHECK: (export "foo" (func $foo)) + ;; CHECK: (export "keep" (func $keep)) - ;; CHECK: (export "bar" (func $bar)) - - ;; CHECK: (func $foo (type $0) + ;; CHECK: (func $"foo" (type $0) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.const 1) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) - (func $foo (export "foo") + (func $"foo" (export "foo") (drop (i32.const 1)) ) ;; CHECK: (func $bar (type $0) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: (i32.const 2) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $bar (export "bar") (drop (i32.const 2)) ) - ;; CHECK: (func $__bar (type $0) + ;; CHECK: (func $keep (type $0) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: (i32.const 3) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $keep (export "keep") From dddc8f2723cf198127475cdb34ae8dfdbafb6616 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Tue, 5 May 2026 15:47:42 -0700 Subject: [PATCH 3/4] remove copypasta comments --- test/lit/passes/remove-exports-file.wast | 1 - test/lit/passes/remove-exports-list.wast | 1 - test/lit/passes/remove-exports.wast | 1 - 3 files changed, 3 deletions(-) diff --git a/test/lit/passes/remove-exports-file.wast b/test/lit/passes/remove-exports-file.wast index e4f4171da23..b333ff20038 100644 --- a/test/lit/passes/remove-exports-file.wast +++ b/test/lit/passes/remove-exports-file.wast @@ -1,5 +1,4 @@ ;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. -;; NOTE: This test was ported using port_passes_tests_to_lit.py and could be cleaned up. ;; RUN: foreach %s %t wasm-opt --remove-exports=@%S/remove-exports-file.txt -all -S -o - | filecheck %s diff --git a/test/lit/passes/remove-exports-list.wast b/test/lit/passes/remove-exports-list.wast index 07e60d1992d..7f850ee59fa 100644 --- a/test/lit/passes/remove-exports-list.wast +++ b/test/lit/passes/remove-exports-list.wast @@ -1,5 +1,4 @@ ;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. -;; NOTE: This test was ported using port_passes_tests_to_lit.py and could be cleaned up. ;; RUN: foreach %s %t wasm-opt "--remove-exports=foo,bar" -all -S -o - | filecheck %s diff --git a/test/lit/passes/remove-exports.wast b/test/lit/passes/remove-exports.wast index 0a5af581346..7629afa38f7 100644 --- a/test/lit/passes/remove-exports.wast +++ b/test/lit/passes/remove-exports.wast @@ -1,5 +1,4 @@ ;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. -;; NOTE: This test was ported using port_passes_tests_to_lit.py and could be cleaned up. ;; RUN: foreach %s %t wasm-opt "--remove-exports=__*" -all -S -o - | filecheck %s From a48014b10205d136c9f7523f32d3fe24e8739539 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Wed, 6 May 2026 09:31:38 -0700 Subject: [PATCH 4/4] avoid confusion by clarifying that this is one particular example --- src/passes/RemoveExports.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/passes/RemoveExports.cpp b/src/passes/RemoveExports.cpp index ca5b4fc5ab0..5207a6f2e1a 100644 --- a/src/passes/RemoveExports.cpp +++ b/src/passes/RemoveExports.cpp @@ -19,7 +19,7 @@ // // --remove-exports=__* // -// That will remove all exports with names like "__foo" and "__bar". +// In this case we will remove all exports with names like "__foo" and "__bar". // // Exports can also be specified as a comma-separated list, and can be a // response file.