From a191d66fce93829e7365f7f2f4be2799c62a1ee4 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Thu, 30 Nov 2023 11:52:57 -0800 Subject: [PATCH] wasm-metadce: Improve name deduplication (#6138) Avoid adding suffixes when we don't need them to keep names unique. As background, the suffixes are not used by emcc at all, so they are just for internal use in the tool. How that works is that metadce gets as input the list of things the user cares about, with names for them, so it knows the proper names to give imports and exports, and makes up names for other things. Those made up names will not be read by the user, so we can make them prettier as this PR does without breaking anything. The main benefit of this PR is to make debugging easier. --- src/tools/wasm-metadce.cpp | 7 +++++-- test/metadce/corners.wast.dced.stdout | 2 +- test/metadce/name_collision.wast | 18 ++++++++++++++++++ test/metadce/name_collision.wast.dced | 7 +++++++ test/metadce/name_collision.wast.dced.stdout | 1 + test/metadce/name_collision.wast.graph.txt | 7 +++++++ test/metadce/no-outside.wast.dced.stdout | 8 ++++---- test/metadce/outside.wast.dced.stdout | 6 +++--- test/metadce/rooted-export.wast.dced.stdout | 8 ++++---- .../spanning_cycle_unrooted.wast.dced.stdout | 2 +- .../metadce/threaded_unrooted.wast.dced.stdout | 8 ++++---- .../threaded_unrooted_cycle.wast.dced.stdout | 8 ++++---- 12 files changed, 59 insertions(+), 23 deletions(-) create mode 100644 test/metadce/name_collision.wast create mode 100644 test/metadce/name_collision.wast.dced create mode 100644 test/metadce/name_collision.wast.dced.stdout create mode 100644 test/metadce/name_collision.wast.graph.txt diff --git a/src/tools/wasm-metadce.cpp b/src/tools/wasm-metadce.cpp index d81054d324f..73d7c06918f 100644 --- a/src/tools/wasm-metadce.cpp +++ b/src/tools/wasm-metadce.cpp @@ -307,9 +307,12 @@ struct MetaDCEGraph { private: // gets a unique name for the graph Name getName(std::string prefix1, std::string prefix2) { + auto base = prefix1 + '$' + prefix2; + if (nodes.find(base) == nodes.end()) { + return base; + } while (1) { - auto curr = - Name(prefix1 + '$' + prefix2 + '$' + std::to_string(nameIndex++)); + Name curr = base + '$' + std::to_string(nameIndex++); if (nodes.find(curr) == nodes.end()) { return curr; } diff --git a/test/metadce/corners.wast.dced.stdout b/test/metadce/corners.wast.dced.stdout index 2c8983d24b1..3ab50a5150e 100644 --- a/test/metadce/corners.wast.dced.stdout +++ b/test/metadce/corners.wast.dced.stdout @@ -1,2 +1,2 @@ -unused: global$UNUSEDTOP$2 +unused: global$UNUSEDTOP unused: ignorable import diff --git a/test/metadce/name_collision.wast b/test/metadce/name_collision.wast new file mode 100644 index 00000000000..62d11c6975c --- /dev/null +++ b/test/metadce/name_collision.wast @@ -0,0 +1,18 @@ +(module + ;; This export is given the name "func$other" in the graph.text file, which + ;; collides with the internal name we give the function $other. A unique name + ;; should be generated for the function in the stdout that mentions it is + ;; unused, specifically + ;; + ;; unused: func$other$0 + ;; + ;; (the $0 suffix keeps it unique). + (export "test" (func $test)) + + ;; This function is used by the export. + (func $test) + + ;; This function is not used, and as mentioned above it will be called + ;; func$other$0 in the output. + (func $other) +) diff --git a/test/metadce/name_collision.wast.dced b/test/metadce/name_collision.wast.dced new file mode 100644 index 00000000000..50e7010dc45 --- /dev/null +++ b/test/metadce/name_collision.wast.dced @@ -0,0 +1,7 @@ +(module + (type $0 (func)) + (export "test" (func $test)) + (func $test (type $0) + (nop) + ) +) diff --git a/test/metadce/name_collision.wast.dced.stdout b/test/metadce/name_collision.wast.dced.stdout new file mode 100644 index 00000000000..6fd8130277b --- /dev/null +++ b/test/metadce/name_collision.wast.dced.stdout @@ -0,0 +1 @@ +unused: func$other$0 diff --git a/test/metadce/name_collision.wast.graph.txt b/test/metadce/name_collision.wast.graph.txt new file mode 100644 index 00000000000..591f82d76ec --- /dev/null +++ b/test/metadce/name_collision.wast.graph.txt @@ -0,0 +1,7 @@ +[ + { + "name": "func$other", + "root": true, + "export": "test" + } +] diff --git a/test/metadce/no-outside.wast.dced.stdout b/test/metadce/no-outside.wast.dced.stdout index cb849efbb58..22dffe9c820 100644 --- a/test/metadce/no-outside.wast.dced.stdout +++ b/test/metadce/no-outside.wast.dced.stdout @@ -1,4 +1,4 @@ -unused: export$wasm_func$4 -unused: export$wasm_func_unused$5 -unused: func$a_wasm_func$0 -unused: func$an_unused_wasm_func$1 +unused: export$wasm_func +unused: export$wasm_func_unused +unused: func$a_wasm_func +unused: func$an_unused_wasm_func diff --git a/test/metadce/outside.wast.dced.stdout b/test/metadce/outside.wast.dced.stdout index d7ab8af726b..3e2ea225161 100644 --- a/test/metadce/outside.wast.dced.stdout +++ b/test/metadce/outside.wast.dced.stdout @@ -1,3 +1,3 @@ -unused: export$wasm_func_unused$10 -unused: func$an_unused_wasm_func$1 -unused: global$__THREW__unused$4 +unused: export$wasm_func_unused +unused: func$an_unused_wasm_func +unused: global$__THREW__unused diff --git a/test/metadce/rooted-export.wast.dced.stdout b/test/metadce/rooted-export.wast.dced.stdout index 583f248d62b..d6b97d555c3 100644 --- a/test/metadce/rooted-export.wast.dced.stdout +++ b/test/metadce/rooted-export.wast.dced.stdout @@ -1,4 +1,4 @@ -unused: export$wasm_func_a$4 -unused: export$wasm_tag_a$5 -unused: func$a_wasm_func$0 -unused: tag$a_wasm_tag$2 +unused: export$wasm_func_a +unused: export$wasm_tag_a +unused: func$a_wasm_func +unused: tag$a_wasm_tag diff --git a/test/metadce/spanning_cycle_unrooted.wast.dced.stdout b/test/metadce/spanning_cycle_unrooted.wast.dced.stdout index 240c77b9590..74701c9c9b8 100644 --- a/test/metadce/spanning_cycle_unrooted.wast.dced.stdout +++ b/test/metadce/spanning_cycle_unrooted.wast.dced.stdout @@ -1,3 +1,3 @@ -unused: func$a_wasm_func$0 +unused: func$a_wasm_func unused: outside_js_function unused: wasm_export diff --git a/test/metadce/threaded_unrooted.wast.dced.stdout b/test/metadce/threaded_unrooted.wast.dced.stdout index 0080ac5ae9b..b89392974be 100644 --- a/test/metadce/threaded_unrooted.wast.dced.stdout +++ b/test/metadce/threaded_unrooted.wast.dced.stdout @@ -1,7 +1,7 @@ -unused: func$wasm_func_1$0 -unused: func$wasm_func_2$1 -unused: func$wasm_func_3$2 -unused: func$wasm_func_4$3 +unused: func$wasm_func_1 +unused: func$wasm_func_2 +unused: func$wasm_func_3 +unused: func$wasm_func_4 unused: outside_js_function1 unused: outside_js_function2 unused: outside_js_function3 diff --git a/test/metadce/threaded_unrooted_cycle.wast.dced.stdout b/test/metadce/threaded_unrooted_cycle.wast.dced.stdout index 0080ac5ae9b..b89392974be 100644 --- a/test/metadce/threaded_unrooted_cycle.wast.dced.stdout +++ b/test/metadce/threaded_unrooted_cycle.wast.dced.stdout @@ -1,7 +1,7 @@ -unused: func$wasm_func_1$0 -unused: func$wasm_func_2$1 -unused: func$wasm_func_3$2 -unused: func$wasm_func_4$3 +unused: func$wasm_func_1 +unused: func$wasm_func_2 +unused: func$wasm_func_3 +unused: func$wasm_func_4 unused: outside_js_function1 unused: outside_js_function2 unused: outside_js_function3