summaryrefslogtreecommitdiff
path: root/test/spec
diff options
context:
space:
mode:
authorThomas Lively <tlively@google.com>2024-07-17 18:51:40 -0400
committerGitHub <noreply@github.com>2024-07-17 22:51:40 +0000
commit1434591fbd62f611cc530ed024a1b1477e2e7614 (patch)
treef41b2a4f72a104edbfd18dba335f32c92aa678c2 /test/spec
parent1e7be1ea067d3e2f3044d49392637325abcd4a01 (diff)
downloadbinaryen-1434591fbd62f611cc530ed024a1b1477e2e7614.tar.gz
binaryen-1434591fbd62f611cc530ed024a1b1477e2e7614.tar.bz2
binaryen-1434591fbd62f611cc530ed024a1b1477e2e7614.zip
[threads] Fix shared ref.eq and disallow mixed-shareability (#6763)
Update the validator to reject mixed-shareability ref.eq, although this is still under discussion in https://github.com/WebAssembly/shared-everything-threads/issues/76. Fix the implementation of `Literal::operator==` to work properly with shared i31ref.
Diffstat (limited to 'test/spec')
-rw-r--r--test/spec/shared-polymorphism.wast2
-rw-r--r--test/spec/shared-ref_eq.wast202
2 files changed, 202 insertions, 2 deletions
diff --git a/test/spec/shared-polymorphism.wast b/test/spec/shared-polymorphism.wast
index be8b5e467..5c9d905e7 100644
--- a/test/spec/shared-polymorphism.wast
+++ b/test/spec/shared-polymorphism.wast
@@ -2,8 +2,6 @@
;; references.
(module
(func (drop (ref.eq (ref.null (shared none)) (ref.null (shared none)))))
- (func (drop (ref.eq (ref.null (shared none)) (ref.null none))))
- (func (drop (ref.eq (ref.null none) (ref.null (shared none)))))
(func (param (ref null (shared i31))) (drop (i31.get_s (local.get 0))))
(func (param (ref null (shared i31))) (drop (i31.get_u (local.get 0))))
diff --git a/test/spec/shared-ref_eq.wast b/test/spec/shared-ref_eq.wast
new file mode 100644
index 000000000..662138ee6
--- /dev/null
+++ b/test/spec/shared-ref_eq.wast
@@ -0,0 +1,202 @@
+(module
+ (type $st (sub (shared (struct))))
+ (type $st' (sub (shared (struct (field i32)))))
+ (type $at (shared (array i8)))
+ (type $st-sub1 (sub $st (shared (struct))))
+ (type $st-sub2 (sub $st (shared (struct))))
+ (type $st'-sub1 (sub $st' (shared (struct (field i32)))))
+ (type $st'-sub2 (sub $st' (shared (struct (field i32)))))
+
+ (table 20 (ref null (shared eq)))
+
+ (func (export "init")
+ (table.set (i32.const 0) (ref.null (shared eq)))
+ (table.set (i32.const 1) (ref.null (shared i31)))
+ (table.set (i32.const 2) (ref.i31_shared (i32.const 7)))
+ (table.set (i32.const 3) (ref.i31_shared (i32.const 7)))
+ (table.set (i32.const 4) (ref.i31_shared (i32.const 8)))
+ (table.set (i32.const 5) (struct.new_default $st))
+ (table.set (i32.const 6) (struct.new_default $st))
+ (table.set (i32.const 7) (array.new_default $at (i32.const 0)))
+ (table.set (i32.const 8) (array.new_default $at (i32.const 0)))
+ )
+
+ (func (export "eq") (param $i i32) (param $j i32) (result i32)
+ (ref.eq (table.get (local.get $i)) (table.get (local.get $j)))
+ )
+)
+
+(invoke "init")
+
+(assert_return (invoke "eq" (i32.const 0) (i32.const 0)) (i32.const 1))
+(assert_return (invoke "eq" (i32.const 0) (i32.const 1)) (i32.const 1))
+(assert_return (invoke "eq" (i32.const 0) (i32.const 2)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 0) (i32.const 3)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 0) (i32.const 4)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 0) (i32.const 5)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 0) (i32.const 6)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 0) (i32.const 7)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 0) (i32.const 8)) (i32.const 0))
+
+(assert_return (invoke "eq" (i32.const 1) (i32.const 0)) (i32.const 1))
+(assert_return (invoke "eq" (i32.const 1) (i32.const 1)) (i32.const 1))
+(assert_return (invoke "eq" (i32.const 1) (i32.const 2)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 1) (i32.const 3)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 1) (i32.const 4)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 1) (i32.const 5)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 1) (i32.const 6)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 1) (i32.const 7)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 1) (i32.const 8)) (i32.const 0))
+
+(assert_return (invoke "eq" (i32.const 2) (i32.const 0)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 2) (i32.const 1)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 2) (i32.const 2)) (i32.const 1))
+(assert_return (invoke "eq" (i32.const 2) (i32.const 3)) (i32.const 1))
+(assert_return (invoke "eq" (i32.const 2) (i32.const 4)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 2) (i32.const 5)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 2) (i32.const 6)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 2) (i32.const 7)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 2) (i32.const 8)) (i32.const 0))
+
+(assert_return (invoke "eq" (i32.const 3) (i32.const 0)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 3) (i32.const 1)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 3) (i32.const 2)) (i32.const 1))
+(assert_return (invoke "eq" (i32.const 3) (i32.const 3)) (i32.const 1))
+(assert_return (invoke "eq" (i32.const 3) (i32.const 4)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 3) (i32.const 5)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 3) (i32.const 6)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 3) (i32.const 7)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 3) (i32.const 8)) (i32.const 0))
+
+(assert_return (invoke "eq" (i32.const 4) (i32.const 0)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 4) (i32.const 1)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 4) (i32.const 2)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 4) (i32.const 3)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 4) (i32.const 4)) (i32.const 1))
+(assert_return (invoke "eq" (i32.const 4) (i32.const 5)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 4) (i32.const 6)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 4) (i32.const 7)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 4) (i32.const 8)) (i32.const 0))
+
+(assert_return (invoke "eq" (i32.const 5) (i32.const 0)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 5) (i32.const 1)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 5) (i32.const 2)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 5) (i32.const 3)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 5) (i32.const 4)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 5) (i32.const 5)) (i32.const 1))
+(assert_return (invoke "eq" (i32.const 5) (i32.const 6)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 5) (i32.const 7)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 5) (i32.const 8)) (i32.const 0))
+
+(assert_return (invoke "eq" (i32.const 6) (i32.const 0)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 6) (i32.const 1)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 6) (i32.const 2)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 6) (i32.const 3)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 6) (i32.const 4)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 6) (i32.const 5)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 6) (i32.const 6)) (i32.const 1))
+(assert_return (invoke "eq" (i32.const 6) (i32.const 7)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 6) (i32.const 8)) (i32.const 0))
+
+(assert_return (invoke "eq" (i32.const 7) (i32.const 0)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 7) (i32.const 1)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 7) (i32.const 2)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 7) (i32.const 3)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 7) (i32.const 4)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 7) (i32.const 5)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 7) (i32.const 6)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 7) (i32.const 7)) (i32.const 1))
+(assert_return (invoke "eq" (i32.const 7) (i32.const 8)) (i32.const 0))
+
+(assert_return (invoke "eq" (i32.const 8) (i32.const 0)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 8) (i32.const 1)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 8) (i32.const 2)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 8) (i32.const 3)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 8) (i32.const 4)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 8) (i32.const 5)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 8) (i32.const 6)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 8) (i32.const 7)) (i32.const 0))
+(assert_return (invoke "eq" (i32.const 8) (i32.const 8)) (i32.const 1))
+
+(assert_invalid
+ (module
+ (func (export "eq") (param $r (ref (shared any))) (result i32)
+ (ref.eq (local.get $r) (local.get $r))
+ )
+ )
+ "type mismatch"
+)
+(assert_invalid
+ (module
+ (func (export "eq") (param $r (ref null (shared any))) (result i32)
+ (ref.eq (local.get $r) (local.get $r))
+ )
+ )
+ "type mismatch"
+)
+(assert_invalid
+ (module
+ (func (export "eq") (param $r (ref null (shared func))) (result i32)
+ (ref.eq (local.get $r) (local.get $r))
+ )
+ )
+ "type mismatch"
+)
+(assert_invalid
+ (module
+ (func (export "eq") (param $r (ref null (shared func))) (result i32)
+ (ref.eq (local.get $r) (local.get $r))
+ )
+ )
+ "type mismatch"
+)
+(assert_invalid
+ (module
+ (func (export "eq") (param $r (ref (shared extern))) (result i32)
+ (ref.eq (local.get $r) (local.get $r))
+ )
+ )
+ "type mismatch"
+)
+(assert_invalid
+ (module
+ (func (export "eq") (param $r (ref null (shared extern))) (result i32)
+ (ref.eq (local.get $r) (local.get $r))
+ )
+ )
+ "type mismatch"
+)
+
+;; Mixed shared / unshared eq
+(assert_invalid
+ (module
+ (func (export "eq") (param $r1 (ref eq)) (param $r2 (ref (shared eq))) (result i32)
+ (ref.eq (local.get $r1) (local.get $r2))
+ )
+ )
+ "type mismatch"
+)
+(assert_invalid
+ (module
+ (func (export "eq") (param $r1 (ref (shared eq))) (param $r2 (ref eq)) (result i32)
+ (ref.eq (local.get $r1) (local.get $r2))
+ )
+ )
+ "type mismatch"
+)
+(assert_invalid
+ (module
+ (func (export "eq") (param $r1 eqref) (param $r2 (ref null (shared eq))) (result i32)
+ (ref.eq (local.get $r1) (local.get $r2))
+ )
+ )
+ "type mismatch"
+)
+(assert_invalid
+ (module
+ (func (export "eq") (param $r1 (ref null (shared eq))) (param $r2 eqref) (result i32)
+ (ref.eq (local.get $r1) (local.get $r2))
+ )
+ )
+ "type mismatch"
+)