summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorThomas Lively <7121787+tlively@users.noreply.github.com>2020-04-02 10:36:19 -0700
committerGitHub <noreply@github.com>2020-04-02 10:36:19 -0700
commit80c5164e1f50ed26e6fab373a563fd7a84135429 (patch)
treeac944407ac6bf1b26e524d31a3db8c410e4599e7 /test
parent702b99508487bc5f56c409d890644b3b9212ae81 (diff)
downloadbinaryen-80c5164e1f50ed26e6fab373a563fd7a84135429.tar.gz
binaryen-80c5164e1f50ed26e6fab373a563fd7a84135429.tar.bz2
binaryen-80c5164e1f50ed26e6fab373a563fd7a84135429.zip
Tuple globals (#2718)
Since it wasn't easy to support tuples in Asyncify's call support using temporary functions, we decided to allow tuple-typed globals after all. This PR adds support for parsing, printing, lowering, and interpreting tuple globals and also adds validation ensuring that imported and exported globals do not have tuple types.
Diffstat (limited to 'test')
-rw-r--r--test/multivalue.wast16
-rw-r--r--test/multivalue.wast.from-wast37
-rw-r--r--test/multivalue.wast.fromBinary42
-rw-r--r--test/multivalue.wast.fromBinary.noDebugInfo42
-rw-r--r--test/spec/multivalue.wast15
5 files changed, 120 insertions, 32 deletions
diff --git a/test/multivalue.wast b/test/multivalue.wast
index 08e23f62a..d740d384f 100644
--- a/test/multivalue.wast
+++ b/test/multivalue.wast
@@ -1,7 +1,8 @@
(module
(import "env" "pair" (func $pair (result i32 i64)))
-
- ;; Test basic lowering of tuple.make, tuple.extract, and tuple locals
+ (global $g1 (mut (i32 i64)) (tuple.make (i32.const 0) (i64.const 0)))
+ (global $g2 (i32 i64) (tuple.make (i32.const 0) (i64.const 0)))
+ ;; Test basic lowering of tuple.make, tuple.extract, and tuple variables
(func $triple (result i32 i64 f32)
(tuple.make
(i32.const 42)
@@ -51,6 +52,17 @@
)
)
+ ;; Test multivalue globals
+ (func $global (result i32 i64)
+ (global.set $g1
+ (tuple.make
+ (i32.const 42)
+ (i64.const 7)
+ )
+ )
+ (global.get $g2)
+ )
+
;; Test lowering of multivalue drops
(func $drop-call
(drop
diff --git a/test/multivalue.wast.from-wast b/test/multivalue.wast.from-wast
index a918979f5..d23198e94 100644
--- a/test/multivalue.wast.from-wast
+++ b/test/multivalue.wast.from-wast
@@ -9,6 +9,14 @@
(type $none_=>_i32_i64_nullref (func (result i32 i64 nullref)))
(type $none_=>_f32 (func (result f32)))
(import "env" "pair" (func $pair (result i32 i64)))
+ (global $g1 (mut (i32 i64)) (tuple.make
+ (i32.const 0)
+ (i64.const 0)
+ ))
+ (global $g2 (i32 i64) (tuple.make
+ (i32.const 0)
+ (i64.const 0)
+ ))
(func $triple (; 1 ;) (result i32 i64 f32)
(tuple.make
(i32.const 42)
@@ -57,12 +65,21 @@
)
)
)
- (func $drop-call (; 7 ;)
+ (func $global (; 7 ;) (result i32 i64)
+ (global.set $g1
+ (tuple.make
+ (i32.const 42)
+ (i64.const 7)
+ )
+ )
+ (global.get $g2)
+ )
+ (func $drop-call (; 8 ;)
(drop
(call $pair)
)
)
- (func $drop-tuple-make (; 8 ;)
+ (func $drop-tuple-make (; 9 ;)
(drop
(tuple.make
(i32.const 42)
@@ -70,7 +87,7 @@
)
)
)
- (func $drop-block (; 9 ;)
+ (func $drop-block (; 10 ;)
(drop
(block $block (result i32 i64)
(tuple.make
@@ -80,7 +97,7 @@
)
)
)
- (func $mv-return (; 10 ;) (result i32 i64)
+ (func $mv-return (; 11 ;) (result i32 i64)
(return
(tuple.make
(i32.const 42)
@@ -88,7 +105,7 @@
)
)
)
- (func $mv-return-in-block (; 11 ;) (result i32 i64)
+ (func $mv-return-in-block (; 12 ;) (result i32 i64)
(block $block (result i32 i64)
(return
(tuple.make
@@ -98,7 +115,7 @@
)
)
)
- (func $mv-block-break (; 12 ;) (result i32 i64)
+ (func $mv-block-break (; 13 ;) (result i32 i64)
(block $l (result i32 i64)
(br $l
(tuple.make
@@ -108,7 +125,7 @@
)
)
)
- (func $mv-block-br-if (; 13 ;) (result i32 i64)
+ (func $mv-block-br-if (; 14 ;) (result i32 i64)
(block $l (result i32 i64)
(br_if $l
(tuple.make
@@ -119,7 +136,7 @@
)
)
)
- (func $mv-if (; 14 ;) (result i32 i64 anyref)
+ (func $mv-if (; 15 ;) (result i32 i64 anyref)
(if (result i32 i64 nullref)
(i32.const 1)
(tuple.make
@@ -134,7 +151,7 @@
)
)
)
- (func $mv-loop (; 15 ;) (result i32 i64)
+ (func $mv-loop (; 16 ;) (result i32 i64)
(loop $loop-in (result i32 i64)
(tuple.make
(i32.const 42)
@@ -142,7 +159,7 @@
)
)
)
- (func $mv-switch (; 16 ;) (result i32 i64)
+ (func $mv-switch (; 17 ;) (result i32 i64)
(block $a (result i32 i64)
(block $b (result i32 i64)
(br_table $a $b
diff --git a/test/multivalue.wast.fromBinary b/test/multivalue.wast.fromBinary
index 32f744c46..2a1bd095e 100644
--- a/test/multivalue.wast.fromBinary
+++ b/test/multivalue.wast.fromBinary
@@ -9,6 +9,10 @@
(type $none_=>_i32_i64_nullref (func (result i32 i64 nullref)))
(type $none_=>_f32 (func (result f32)))
(import "env" "pair" (func $pair (result i32 i64)))
+ (global $global$0 (mut i32) (i32.const 0))
+ (global $global$1 (mut i64) (i64.const 0))
+ (global $global$2 i32 (i32.const 0))
+ (global $global$3 i64 (i64.const 0))
(func $triple (; 1 ;) (result i32 i64 f32)
(tuple.make
(i32.const 42)
@@ -235,7 +239,25 @@
)
(unreachable)
)
- (func $drop-call (; 7 ;)
+ (func $global (; 7 ;) (result i32 i64)
+ (local $0 i32)
+ (global.set $global$0
+ (block (result i32)
+ (local.set $0
+ (i32.const 42)
+ )
+ (global.set $global$1
+ (i64.const 7)
+ )
+ (local.get $0)
+ )
+ )
+ (tuple.make
+ (global.get $global$2)
+ (global.get $global$3)
+ )
+ )
+ (func $drop-call (; 8 ;)
(local $0 (i32 i64))
(local $1 i32)
(local.set $0
@@ -257,7 +279,7 @@
)
)
)
- (func $drop-tuple-make (; 8 ;)
+ (func $drop-tuple-make (; 9 ;)
(local $0 i32)
(drop
(block (result i32)
@@ -271,7 +293,7 @@
)
)
)
- (func $drop-block (; 9 ;)
+ (func $drop-block (; 10 ;)
(local $0 (i32 i64))
(local $1 i32)
(local.set $0
@@ -298,7 +320,7 @@
)
)
)
- (func $mv-return (; 10 ;) (result i32 i64)
+ (func $mv-return (; 11 ;) (result i32 i64)
(return
(tuple.make
(i32.const 42)
@@ -306,7 +328,7 @@
)
)
)
- (func $mv-return-in-block (; 11 ;) (result i32 i64)
+ (func $mv-return-in-block (; 12 ;) (result i32 i64)
(return
(tuple.make
(i32.const 42)
@@ -314,7 +336,7 @@
)
)
)
- (func $mv-block-break (; 12 ;) (result i32 i64)
+ (func $mv-block-break (; 13 ;) (result i32 i64)
(local $0 (i32 i64))
(local.set $0
(block $label$1 (result i32 i64)
@@ -335,7 +357,7 @@
)
)
)
- (func $mv-block-br-if (; 13 ;) (result i32 i64)
+ (func $mv-block-br-if (; 14 ;) (result i32 i64)
(local $0 (i32 i64))
(local $1 (i32 i64))
(local.set $1
@@ -368,7 +390,7 @@
)
)
)
- (func $mv-if (; 14 ;) (result i32 i64 anyref)
+ (func $mv-if (; 15 ;) (result i32 i64 anyref)
(local $0 (i32 i64 nullref))
(local.set $0
(if (result i32 i64 nullref)
@@ -397,7 +419,7 @@
)
)
)
- (func $mv-loop (; 15 ;) (result i32 i64)
+ (func $mv-loop (; 16 ;) (result i32 i64)
(local $0 (i32 i64))
(local.set $0
(loop $label$1 (result i32 i64)
@@ -416,7 +438,7 @@
)
)
)
- (func $mv-switch (; 16 ;) (result i32 i64)
+ (func $mv-switch (; 17 ;) (result i32 i64)
(local $0 (i32 i64))
(local $1 (i32 i64))
(local.set $1
diff --git a/test/multivalue.wast.fromBinary.noDebugInfo b/test/multivalue.wast.fromBinary.noDebugInfo
index c105df989..1682e3144 100644
--- a/test/multivalue.wast.fromBinary.noDebugInfo
+++ b/test/multivalue.wast.fromBinary.noDebugInfo
@@ -9,6 +9,10 @@
(type $none_=>_i32_i64_nullref (func (result i32 i64 nullref)))
(type $none_=>_f32 (func (result f32)))
(import "env" "pair" (func $fimport$0 (result i32 i64)))
+ (global $global$0 (mut i32) (i32.const 0))
+ (global $global$1 (mut i64) (i64.const 0))
+ (global $global$2 i32 (i32.const 0))
+ (global $global$3 i64 (i64.const 0))
(func $0 (; 1 ;) (result i32 i64 f32)
(tuple.make
(i32.const 42)
@@ -235,7 +239,25 @@
)
(unreachable)
)
- (func $6 (; 7 ;)
+ (func $6 (; 7 ;) (result i32 i64)
+ (local $0 i32)
+ (global.set $global$0
+ (block (result i32)
+ (local.set $0
+ (i32.const 42)
+ )
+ (global.set $global$1
+ (i64.const 7)
+ )
+ (local.get $0)
+ )
+ )
+ (tuple.make
+ (global.get $global$2)
+ (global.get $global$3)
+ )
+ )
+ (func $7 (; 8 ;)
(local $0 (i32 i64))
(local $1 i32)
(local.set $0
@@ -257,7 +279,7 @@
)
)
)
- (func $7 (; 8 ;)
+ (func $8 (; 9 ;)
(local $0 i32)
(drop
(block (result i32)
@@ -271,7 +293,7 @@
)
)
)
- (func $8 (; 9 ;)
+ (func $9 (; 10 ;)
(local $0 (i32 i64))
(local $1 i32)
(local.set $0
@@ -298,7 +320,7 @@
)
)
)
- (func $9 (; 10 ;) (result i32 i64)
+ (func $10 (; 11 ;) (result i32 i64)
(return
(tuple.make
(i32.const 42)
@@ -306,7 +328,7 @@
)
)
)
- (func $10 (; 11 ;) (result i32 i64)
+ (func $11 (; 12 ;) (result i32 i64)
(return
(tuple.make
(i32.const 42)
@@ -314,7 +336,7 @@
)
)
)
- (func $11 (; 12 ;) (result i32 i64)
+ (func $12 (; 13 ;) (result i32 i64)
(local $0 (i32 i64))
(local.set $0
(block $label$1 (result i32 i64)
@@ -335,7 +357,7 @@
)
)
)
- (func $12 (; 13 ;) (result i32 i64)
+ (func $13 (; 14 ;) (result i32 i64)
(local $0 (i32 i64))
(local $1 (i32 i64))
(local.set $1
@@ -368,7 +390,7 @@
)
)
)
- (func $13 (; 14 ;) (result i32 i64 anyref)
+ (func $14 (; 15 ;) (result i32 i64 anyref)
(local $0 (i32 i64 nullref))
(local.set $0
(if (result i32 i64 nullref)
@@ -397,7 +419,7 @@
)
)
)
- (func $14 (; 15 ;) (result i32 i64)
+ (func $15 (; 16 ;) (result i32 i64)
(local $0 (i32 i64))
(local.set $0
(loop $label$1 (result i32 i64)
@@ -416,7 +438,7 @@
)
)
)
- (func $15 (; 16 ;) (result i32 i64)
+ (func $16 (; 17 ;) (result i32 i64)
(local $0 (i32 i64))
(local $1 (i32 i64))
(local.set $1
diff --git a/test/spec/multivalue.wast b/test/spec/multivalue.wast
index d6089721d..3891d6983 100644
--- a/test/spec/multivalue.wast
+++ b/test/spec/multivalue.wast
@@ -1,4 +1,5 @@
(module
+ (global $global_pair (mut (i32 i64)) (tuple.make (i32.const 0) (i64.const 0)))
(func $pair (export "pair") (result i32 i64)
(tuple.make
(i32.const 42)
@@ -9,6 +10,17 @@
(local $x (i32 i64))
(local.get $x)
)
+ (func (export "tuple-global-get") (result i32 i64)
+ (global.get $global_pair)
+ )
+ (func (export "tuple-global-set")
+ (global.set $global_pair
+ (tuple.make
+ (i32.const 42)
+ (i64.const 7)
+ )
+ )
+ )
(func (export "tail-call") (result i32 i64)
(return_call $pair)
(unreachable)
@@ -17,4 +29,7 @@
(assert_return (invoke "pair") (tuple.make (i32.const 42) (i64.const 7)))
(assert_return (invoke "tuple-local") (tuple.make (i32.const 0) (i64.const 0)))
+(assert_return (invoke "tuple-global-get") (tuple.make (i32.const 0) (i64.const 0)))
+(assert_return (invoke "tuple-global-set"))
+(assert_return (invoke "tuple-global-get") (tuple.make (i32.const 42) (i64.const 7)))
(assert_return (invoke "tail-call") (tuple.make (i32.const 42) (i64.const 7)))