summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <azakai@google.com>2023-11-30 11:52:57 -0800
committerGitHub <noreply@github.com>2023-11-30 11:52:57 -0800
commita191d66fce93829e7365f7f2f4be2799c62a1ee4 (patch)
tree82e1767542f4eda786928b1681774df238e588c3
parent71b9cc0b50b119988b7ad3a5f5d2feec4d6c4a95 (diff)
downloadbinaryen-a191d66fce93829e7365f7f2f4be2799c62a1ee4.tar.gz
binaryen-a191d66fce93829e7365f7f2f4be2799c62a1ee4.tar.bz2
binaryen-a191d66fce93829e7365f7f2f4be2799c62a1ee4.zip
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.
-rw-r--r--src/tools/wasm-metadce.cpp7
-rw-r--r--test/metadce/corners.wast.dced.stdout2
-rw-r--r--test/metadce/name_collision.wast18
-rw-r--r--test/metadce/name_collision.wast.dced7
-rw-r--r--test/metadce/name_collision.wast.dced.stdout1
-rw-r--r--test/metadce/name_collision.wast.graph.txt7
-rw-r--r--test/metadce/no-outside.wast.dced.stdout8
-rw-r--r--test/metadce/outside.wast.dced.stdout6
-rw-r--r--test/metadce/rooted-export.wast.dced.stdout8
-rw-r--r--test/metadce/spanning_cycle_unrooted.wast.dced.stdout2
-rw-r--r--test/metadce/threaded_unrooted.wast.dced.stdout8
-rw-r--r--test/metadce/threaded_unrooted_cycle.wast.dced.stdout8
12 files changed, 59 insertions, 23 deletions
diff --git a/src/tools/wasm-metadce.cpp b/src/tools/wasm-metadce.cpp
index d81054d32..73d7c0691 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 2c8983d24..3ab50a515 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 000000000..62d11c697
--- /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 000000000..50e7010dc
--- /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 000000000..6fd813027
--- /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 000000000..591f82d76
--- /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 cb849efbb..22dffe9c8 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 d7ab8af72..3e2ea2251 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 583f248d6..d6b97d555 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 240c77b95..74701c9c9 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 0080ac5ae..b89392974 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 0080ac5ae..b89392974 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