diff options
author | Thomas Lively <7121787+tlively@users.noreply.github.com> | 2020-04-02 10:36:19 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-02 10:36:19 -0700 |
commit | 80c5164e1f50ed26e6fab373a563fd7a84135429 (patch) | |
tree | ac944407ac6bf1b26e524d31a3db8c410e4599e7 /test | |
parent | 702b99508487bc5f56c409d890644b3b9212ae81 (diff) | |
download | binaryen-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.wast | 16 | ||||
-rw-r--r-- | test/multivalue.wast.from-wast | 37 | ||||
-rw-r--r-- | test/multivalue.wast.fromBinary | 42 | ||||
-rw-r--r-- | test/multivalue.wast.fromBinary.noDebugInfo | 42 | ||||
-rw-r--r-- | test/spec/multivalue.wast | 15 |
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))) |