[CodeAnnotations] Copy function-level annotations, fixing wasm-merge (#8345)
We copied expression annotations but not function ones. As a result,
wasm-merge would copy functions between modules and drop their
hints.
diff --git a/src/ir/metadata.cpp b/src/ir/metadata.cpp
index 61c5da9..32d5e0a 100644
--- a/src/ir/metadata.cpp
+++ b/src/ir/metadata.cpp
@@ -74,6 +74,12 @@
}
}
}
+
+ // Also copy function-level annotations, if any.
+ auto iter = originAnnotations.find(nullptr);
+ if (iter != originAnnotations.end()) {
+ copyAnnotations[nullptr] = iter->second;
+ }
}
#pragma GCC diagnostic push
diff --git a/test/lit/merge/annotations.wat b/test/lit/merge/annotations.wat
new file mode 100644
index 0000000..52bdc49
--- /dev/null
+++ b/test/lit/merge/annotations.wat
@@ -0,0 +1,46 @@
+;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited.
+
+;; RUN: wasm-merge %s first %s.second second -all -S -o - | filecheck %s
+
+;; Test that we handle code annotations properly. Both the first and second
+;; wasm files have annotations that should be preserved.
+
+(module
+ ;; CHECK: (type $0 (func))
+
+ ;; CHECK: (export "first" (func $first))
+
+ ;; CHECK: (export "second" (func $second))
+
+ ;; CHECK: (@binaryen.js.called)
+ ;; CHECK-NEXT: (func $first (type $0)
+ ;; CHECK-NEXT: (@metadata.code.branch_hint "\00")
+ ;; CHECK-NEXT: (if
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (then
+ ;; CHECK-NEXT: (return)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (@binaryen.js.called)
+ (func $first (export "first")
+ (@metadata.code.branch_hint "\00")
+ (if
+ (i32.const 0)
+ (then
+ (return)
+ )
+ )
+ )
+)
+
+;; CHECK: (@binaryen.js.called)
+;; CHECK-NEXT: (func $second (type $0)
+;; CHECK-NEXT: (@metadata.code.branch_hint "\01")
+;; CHECK-NEXT: (if
+;; CHECK-NEXT: (i32.const 0)
+;; CHECK-NEXT: (then
+;; CHECK-NEXT: (return)
+;; CHECK-NEXT: )
+;; CHECK-NEXT: )
+;; CHECK-NEXT: )
diff --git a/test/lit/merge/annotations.wat.second b/test/lit/merge/annotations.wat.second
new file mode 100644
index 0000000..39cccc4
--- /dev/null
+++ b/test/lit/merge/annotations.wat.second
@@ -0,0 +1,13 @@
+(module
+ (@binaryen.js.called)
+ (func $second (export "second")
+ (@metadata.code.branch_hint "\01")
+ (if
+ (i32.const 0)
+ (then
+ (return)
+ )
+ )
+ )
+)
+