diff options
-rw-r--r-- | src/wasm/wasm.cpp | 8 | ||||
-rw-r--r-- | test/multivalue.wast | 9 | ||||
-rw-r--r-- | test/multivalue.wast.from-wast | 31 | ||||
-rw-r--r-- | test/multivalue.wast.fromBinary | 31 | ||||
-rw-r--r-- | test/multivalue.wast.fromBinary.noDebugInfo | 31 |
5 files changed, 76 insertions, 34 deletions
diff --git a/src/wasm/wasm.cpp b/src/wasm/wasm.cpp index 4e4186d08..35fa8b5c5 100644 --- a/src/wasm/wasm.cpp +++ b/src/wasm/wasm.cpp @@ -926,7 +926,13 @@ void TupleMake::finalize() { type = Type(types); } -void TupleExtract::finalize() { type = tuple->type.expand()[index]; } +void TupleExtract::finalize() { + if (tuple->type == Type::unreachable) { + type = Type::unreachable; + } else { + type = tuple->type.expand()[index]; + } +} size_t Function::getNumParams() { return sig.params.size(); } diff --git a/test/multivalue.wast b/test/multivalue.wast index 25e161ef4..d2deaef89 100644 --- a/test/multivalue.wast +++ b/test/multivalue.wast @@ -41,6 +41,15 @@ ) ) ) + (func $unreachable (result i64) + (tuple.extract 1 + (tuple.make + (i32.const 42) + (i64.const 7) + (unreachable) + ) + ) + ) ;; Test lowering of multivalue drops (func $drop-call diff --git a/test/multivalue.wast.from-wast b/test/multivalue.wast.from-wast index 57abbc21d..293ec8cb0 100644 --- a/test/multivalue.wast.from-wast +++ b/test/multivalue.wast.from-wast @@ -1,10 +1,10 @@ (module (type $none_=>_i32_i64 (func (result i32 i64))) (type $none_=>_none (func)) + (type $none_=>_i64 (func (result i64))) (type $none_=>_f32_i64_i32 (func (result f32 i64 i32))) (type $none_=>_i32 (func (result i32))) (type $none_=>_i32_i64_f32 (func (result i32 i64 f32))) - (type $none_=>_i64 (func (result i64))) (type $none_=>_f32 (func (result f32))) (import "env" "pair" (func $pair (result i32 i64))) (func $triple (; 1 ;) (result i32 i64 f32) @@ -46,12 +46,21 @@ ) ) ) - (func $drop-call (; 6 ;) + (func $unreachable (; 6 ;) (result i64) + (tuple.extract 1 + (tuple.make + (i32.const 42) + (i64.const 7) + (unreachable) + ) + ) + ) + (func $drop-call (; 7 ;) (drop (call $pair) ) ) - (func $drop-tuple-make (; 7 ;) + (func $drop-tuple-make (; 8 ;) (drop (tuple.make (i32.const 42) @@ -59,7 +68,7 @@ ) ) ) - (func $drop-block (; 8 ;) + (func $drop-block (; 9 ;) (drop (block $block (result i32 i64) (tuple.make @@ -69,7 +78,7 @@ ) ) ) - (func $mv-return (; 9 ;) (result i32 i64) + (func $mv-return (; 10 ;) (result i32 i64) (return (tuple.make (i32.const 42) @@ -77,7 +86,7 @@ ) ) ) - (func $mv-return-in-block (; 10 ;) (result i32 i64) + (func $mv-return-in-block (; 11 ;) (result i32 i64) (block $block (result i32 i64) (return (tuple.make @@ -87,7 +96,7 @@ ) ) ) - (func $mv-block-break (; 11 ;) (result i32 i64) + (func $mv-block-break (; 12 ;) (result i32 i64) (block $l (result i32 i64) (br $l (tuple.make @@ -97,7 +106,7 @@ ) ) ) - (func $mv-block-br-if (; 12 ;) (result i32 i64) + (func $mv-block-br-if (; 13 ;) (result i32 i64) (block $l (result i32 i64) (br_if $l (tuple.make @@ -108,7 +117,7 @@ ) ) ) - (func $mv-if (; 13 ;) (result i32 i64) + (func $mv-if (; 14 ;) (result i32 i64) (if (result i32 i64) (i32.const 1) (tuple.make @@ -121,7 +130,7 @@ ) ) ) - (func $mv-loop (; 14 ;) (result i32 i64) + (func $mv-loop (; 15 ;) (result i32 i64) (loop $loop-in (result i32 i64) (tuple.make (i32.const 42) @@ -129,7 +138,7 @@ ) ) ) - (func $mv-switch (; 15 ;) (result i32 i64) + (func $mv-switch (; 16 ;) (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 90d1331b1..9bd9d5e58 100644 --- a/test/multivalue.wast.fromBinary +++ b/test/multivalue.wast.fromBinary @@ -1,10 +1,10 @@ (module (type $none_=>_i32_i64 (func (result i32 i64))) (type $none_=>_none (func)) + (type $none_=>_i64 (func (result i64))) (type $none_=>_f32_i64_i32 (func (result f32 i64 i32))) (type $none_=>_i32 (func (result i32))) (type $none_=>_i32_i64_f32 (func (result i32 i64 f32))) - (type $none_=>_i64 (func (result i64))) (type $none_=>_f32 (func (result f32))) (import "env" "pair" (func $pair (result i32 i64))) (func $triple (; 1 ;) (result i32 i64 f32) @@ -224,7 +224,16 @@ ) ) ) - (func $drop-call (; 6 ;) + (func $unreachable (; 6 ;) (result i64) + (drop + (i32.const 42) + ) + (drop + (i64.const 7) + ) + (unreachable) + ) + (func $drop-call (; 7 ;) (local $0 (i32 i64)) (local $1 i32) (local.set $0 @@ -246,7 +255,7 @@ ) ) ) - (func $drop-tuple-make (; 7 ;) + (func $drop-tuple-make (; 8 ;) (local $0 i32) (drop (block (result i32) @@ -260,7 +269,7 @@ ) ) ) - (func $drop-block (; 8 ;) + (func $drop-block (; 9 ;) (local $0 (i32 i64)) (local $1 i32) (local.set $0 @@ -287,7 +296,7 @@ ) ) ) - (func $mv-return (; 9 ;) (result i32 i64) + (func $mv-return (; 10 ;) (result i32 i64) (return (tuple.make (i32.const 42) @@ -295,7 +304,7 @@ ) ) ) - (func $mv-return-in-block (; 10 ;) (result i32 i64) + (func $mv-return-in-block (; 11 ;) (result i32 i64) (return (tuple.make (i32.const 42) @@ -303,7 +312,7 @@ ) ) ) - (func $mv-block-break (; 11 ;) (result i32 i64) + (func $mv-block-break (; 12 ;) (result i32 i64) (local $0 (i32 i64)) (local.set $0 (block $label$1 (result i32 i64) @@ -324,7 +333,7 @@ ) ) ) - (func $mv-block-br-if (; 12 ;) (result i32 i64) + (func $mv-block-br-if (; 13 ;) (result i32 i64) (local $0 (i32 i64)) (local $1 (i32 i64)) (local.set $1 @@ -357,7 +366,7 @@ ) ) ) - (func $mv-if (; 13 ;) (result i32 i64) + (func $mv-if (; 14 ;) (result i32 i64) (local $0 (i32 i64)) (local.set $0 (if (result i32 i64) @@ -381,7 +390,7 @@ ) ) ) - (func $mv-loop (; 14 ;) (result i32 i64) + (func $mv-loop (; 15 ;) (result i32 i64) (local $0 (i32 i64)) (local.set $0 (loop $label$1 (result i32 i64) @@ -400,7 +409,7 @@ ) ) ) - (func $mv-switch (; 15 ;) (result i32 i64) + (func $mv-switch (; 16 ;) (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 ba4634b47..71d0939ba 100644 --- a/test/multivalue.wast.fromBinary.noDebugInfo +++ b/test/multivalue.wast.fromBinary.noDebugInfo @@ -1,10 +1,10 @@ (module (type $none_=>_i32_i64 (func (result i32 i64))) (type $none_=>_none (func)) + (type $none_=>_i64 (func (result i64))) (type $none_=>_f32_i64_i32 (func (result f32 i64 i32))) (type $none_=>_i32 (func (result i32))) (type $none_=>_i32_i64_f32 (func (result i32 i64 f32))) - (type $none_=>_i64 (func (result i64))) (type $none_=>_f32 (func (result f32))) (import "env" "pair" (func $fimport$0 (result i32 i64))) (func $0 (; 1 ;) (result i32 i64 f32) @@ -224,7 +224,16 @@ ) ) ) - (func $5 (; 6 ;) + (func $5 (; 6 ;) (result i64) + (drop + (i32.const 42) + ) + (drop + (i64.const 7) + ) + (unreachable) + ) + (func $6 (; 7 ;) (local $0 (i32 i64)) (local $1 i32) (local.set $0 @@ -246,7 +255,7 @@ ) ) ) - (func $6 (; 7 ;) + (func $7 (; 8 ;) (local $0 i32) (drop (block (result i32) @@ -260,7 +269,7 @@ ) ) ) - (func $7 (; 8 ;) + (func $8 (; 9 ;) (local $0 (i32 i64)) (local $1 i32) (local.set $0 @@ -287,7 +296,7 @@ ) ) ) - (func $8 (; 9 ;) (result i32 i64) + (func $9 (; 10 ;) (result i32 i64) (return (tuple.make (i32.const 42) @@ -295,7 +304,7 @@ ) ) ) - (func $9 (; 10 ;) (result i32 i64) + (func $10 (; 11 ;) (result i32 i64) (return (tuple.make (i32.const 42) @@ -303,7 +312,7 @@ ) ) ) - (func $10 (; 11 ;) (result i32 i64) + (func $11 (; 12 ;) (result i32 i64) (local $0 (i32 i64)) (local.set $0 (block $label$1 (result i32 i64) @@ -324,7 +333,7 @@ ) ) ) - (func $11 (; 12 ;) (result i32 i64) + (func $12 (; 13 ;) (result i32 i64) (local $0 (i32 i64)) (local $1 (i32 i64)) (local.set $1 @@ -357,7 +366,7 @@ ) ) ) - (func $12 (; 13 ;) (result i32 i64) + (func $13 (; 14 ;) (result i32 i64) (local $0 (i32 i64)) (local.set $0 (if (result i32 i64) @@ -381,7 +390,7 @@ ) ) ) - (func $13 (; 14 ;) (result i32 i64) + (func $14 (; 15 ;) (result i32 i64) (local $0 (i32 i64)) (local.set $0 (loop $label$1 (result i32 i64) @@ -400,7 +409,7 @@ ) ) ) - (func $14 (; 15 ;) (result i32 i64) + (func $15 (; 16 ;) (result i32 i64) (local $0 (i32 i64)) (local $1 (i32 i64)) (local.set $1 |