blob: 16b5d728568b85e97ecea7489fee49b29db5aab9 [file] [edit]
;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited.
;; RUN: wasm-opt %s -all --make-shared-objects -S -o - | filecheck %s --check-prefix=SHARED
;; RUN: wasm-opt %s -all --make-shared-objects --pass-arg=make-shared-objects-unshared -S -o - | filecheck %s --check-prefix=UNSHARED
(module
;; SHARED: (type $struct (shared (struct (field (mut (ref null (shared i31)))) (field (mut (ref null (shared i31)))) (field (mut (ref null (shared any)))))))
;; SHARED: (type $sig (func (param (ref null (shared i31)) (ref null (shared i31))) (result (ref null (shared any)))))
;; UNSHARED: (type $struct (struct (field (mut i31ref)) (field (mut i31ref)) (field (mut anyref))))
;; UNSHARED: (type $sig (func (param i31ref i31ref) (result anyref)))
(type $sig (func (param funcref externref) (result anyref)))
(type $struct (struct (field (mut funcref)) (field (mut externref)) (field (mut anyref))))
;; SHARED: (type $array (shared (array (mut (ref null $struct)))))
;; UNSHARED: (type $array (array (mut (ref null $struct))))
(type $array (array (mut (ref null $struct))))
(import "env" "imported_func" (func $imported_func (param funcref externref) (result funcref externref)))
(import "env" "imported_global" (global $imported_global externref))
;; SHARED: (type $3 (func (param externref)))
;; SHARED: (type $4 (func (param (ref null (shared i31)) (ref null (shared i31))) (result (ref null (shared i31)) (ref null (shared i31)))))
;; SHARED: (type $5 (func (param (ref null $array))))
;; SHARED: (type $6 (func (param (ref $struct))))
;; SHARED: (type $7 (func (param (ref $struct) (ref (shared i31)))))
;; SHARED: (type $8 (func (param (ref $struct)) (result (ref null (shared i31)))))
;; SHARED: (type $9 (func (param (ref null (shared i31))) (result (ref null (shared i31)))))
;; SHARED: (type $10 (func (param (ref null (shared i31)) externref) (result (ref null (shared i31)) externref)))
;; SHARED: (type $11 (func (param (ref null (shared i31)) externref) (result (ref null (shared any)))))
;; SHARED: (type $12 (func (param externref) (result (ref null (shared i31)))))
;; SHARED: (type $13 (func (param (ref null (shared i31))) (result externref)))
;; SHARED: (type $14 (func (param (ref null (shared any))) (result externref)))
;; SHARED: (type $15 (func (param externref) (result (ref null (shared any)))))
;; SHARED: (type $16 (func (result (ref null (shared i31)) (ref null (shared i31)))))
;; SHARED: (import "env" "imported_global" (global $imported_global$import externref))
;; SHARED: (import "env" "imported_func" (func $imported_func$import (type $10) (param (ref null (shared i31)) externref) (result (ref null (shared i31)) externref)))
;; SHARED: (import "env" "any_to_extern" (func $any_to_extern (exact (type $14) (param (ref null (shared any))) (result externref))))
;; SHARED: (import "env" "extern_to_any" (func $extern_to_any (exact (type $15) (param externref) (result (ref null (shared any))))))
;; SHARED: (import "env" "tag" (tag $tag (type $3) (param externref)))
;; UNSHARED: (type $3 (func (param externref)))
;; UNSHARED: (type $4 (func (param i31ref i31ref) (result i31ref i31ref)))
;; UNSHARED: (type $5 (func (param (ref null $array))))
;; UNSHARED: (type $6 (func (param (ref $struct))))
;; UNSHARED: (type $7 (func (param (ref $struct) (ref i31))))
;; UNSHARED: (type $8 (func (param (ref $struct)) (result i31ref)))
;; UNSHARED: (type $9 (func (param i31ref) (result i31ref)))
;; UNSHARED: (type $10 (func (param i31ref externref) (result i31ref externref)))
;; UNSHARED: (type $11 (func (param i31ref externref) (result anyref)))
;; UNSHARED: (type $12 (func (param externref) (result i31ref)))
;; UNSHARED: (type $13 (func (param i31ref) (result externref)))
;; UNSHARED: (type $14 (func (param anyref) (result externref)))
;; UNSHARED: (type $15 (func (param externref) (result anyref)))
;; UNSHARED: (type $16 (func (result i31ref i31ref)))
;; UNSHARED: (import "env" "imported_global" (global $imported_global$import externref))
;; UNSHARED: (import "env" "imported_func" (func $imported_func$import (type $10) (param i31ref externref) (result i31ref externref)))
;; UNSHARED: (import "env" "any_to_extern" (func $any_to_extern (exact (type $14) (param anyref) (result externref))))
;; UNSHARED: (import "env" "extern_to_any" (func $extern_to_any (exact (type $15) (param externref) (result anyref))))
;; UNSHARED: (import "env" "tag" (tag $tag (type $3) (param externref)))
(import "env" "tag" (tag $tag (param externref)))
(export "exported_func" (func $exported_func))
;; SHARED: (global $imported_global (ref null (shared i31)) (ref.i31_shared
;; SHARED-NEXT: (i32.const 0)
;; SHARED-NEXT: ))
;; SHARED: (table $funcs 1 1 funcref)
;; SHARED: (table $externs 1 externref)
;; SHARED: (elem $funcs (table $funcs) (i32.const 0) func $exported_func)
;; SHARED: (elem $externs (table $externs) (i32.const 0) externref (item (global.get $imported_global$import)))
;; SHARED: (export "exported_func" (func $exported_func$export))
;; SHARED: (func $imported_func (type $4) (param $0 (ref null (shared i31))) (param $1 (ref null (shared i31))) (result (ref null (shared i31)) (ref null (shared i31)))
;; SHARED-NEXT: (local $2 (tuple (ref null (shared i31)) externref))
;; SHARED-NEXT: (local.set $2
;; SHARED-NEXT: (call $imported_func$import
;; SHARED-NEXT: (local.get $0)
;; SHARED-NEXT: (call $index_to_extern
;; SHARED-NEXT: (local.get $1)
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: (tuple.make 2
;; SHARED-NEXT: (tuple.extract 2 0
;; SHARED-NEXT: (local.get $2)
;; SHARED-NEXT: )
;; SHARED-NEXT: (call $extern_to_index
;; SHARED-NEXT: (tuple.extract 2 1
;; SHARED-NEXT: (local.get $2)
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED: (func $exported_func (type $sig) (param $f (ref null (shared i31))) (param $e (ref null (shared i31))) (result (ref null (shared any)))
;; SHARED-NEXT: (call $extern_to_any
;; SHARED-NEXT: (call $index_to_extern
;; SHARED-NEXT: (local.get $e)
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; UNSHARED: (global $imported_global i31ref (ref.i31
;; UNSHARED-NEXT: (i32.const 0)
;; UNSHARED-NEXT: ))
;; UNSHARED: (table $funcs 1 1 funcref)
;; UNSHARED: (table $externs 1 externref)
;; UNSHARED: (elem $funcs (table $funcs) (i32.const 0) func $exported_func)
;; UNSHARED: (elem $externs (table $externs) (i32.const 0) externref (item (global.get $imported_global$import)))
;; UNSHARED: (export "exported_func" (func $exported_func$export))
;; UNSHARED: (func $imported_func (type $4) (param $0 i31ref) (param $1 i31ref) (result i31ref i31ref)
;; UNSHARED-NEXT: (local $2 (tuple i31ref externref))
;; UNSHARED-NEXT: (local.set $2
;; UNSHARED-NEXT: (call $imported_func$import
;; UNSHARED-NEXT: (local.get $0)
;; UNSHARED-NEXT: (call $index_to_extern
;; UNSHARED-NEXT: (local.get $1)
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: (tuple.make 2
;; UNSHARED-NEXT: (tuple.extract 2 0
;; UNSHARED-NEXT: (local.get $2)
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: (call $extern_to_index
;; UNSHARED-NEXT: (tuple.extract 2 1
;; UNSHARED-NEXT: (local.get $2)
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED: (func $exported_func (type $sig) (param $f i31ref) (param $e i31ref) (result anyref)
;; UNSHARED-NEXT: (call $extern_to_any
;; UNSHARED-NEXT: (call $index_to_extern
;; UNSHARED-NEXT: (local.get $e)
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
(func $exported_func (param $f funcref) (param $e externref) (result anyref)
;; Exported function taking funcref and externref and returning anyref.
(any.convert_extern
(local.get $e)
)
)
;; SHARED: (func $basic-types (type $5) (param $a (ref null $array))
;; SHARED-NEXT: (local $nf (ref null (shared none)))
;; SHARED-NEXT: (local $ne (ref null (shared none)))
;; SHARED-NEXT: (local $str (ref null (shared i31)))
;; SHARED-NEXT: (local $eq (ref null (shared eq)))
;; SHARED-NEXT: (nop)
;; SHARED-NEXT: )
;; UNSHARED: (func $basic-types (type $5) (param $a (ref null $array))
;; UNSHARED-NEXT: (local $nf nullref)
;; UNSHARED-NEXT: (local $ne nullref)
;; UNSHARED-NEXT: (local $str i31ref)
;; UNSHARED-NEXT: (local $eq eqref)
;; UNSHARED-NEXT: (nop)
;; UNSHARED-NEXT: )
(func $basic-types (param $a (ref null $array))
;; Test lowering of array and basic heap types in parameters and locals.
(local $nf nullfuncref)
(local $ne nullexternref)
(local $str stringref)
(local $eq eqref)
(nop)
)
;; SHARED: (func $ref-func-and-global (type $6) (param $s (ref $struct))
;; SHARED-NEXT: (struct.set $struct 0
;; SHARED-NEXT: (local.get $s)
;; SHARED-NEXT: (ref.i31_shared
;; SHARED-NEXT: (i32.const 0)
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: (struct.set $struct 1
;; SHARED-NEXT: (local.get $s)
;; SHARED-NEXT: (global.get $imported_global)
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; UNSHARED: (func $ref-func-and-global (type $6) (param $s (ref $struct))
;; UNSHARED-NEXT: (struct.set $struct 0
;; UNSHARED-NEXT: (local.get $s)
;; UNSHARED-NEXT: (ref.i31
;; UNSHARED-NEXT: (i32.const 0)
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: (struct.set $struct 1
;; UNSHARED-NEXT: (local.get $s)
;; UNSHARED-NEXT: (global.get $imported_global)
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
(func $ref-func-and-global (param $s (ref $struct))
;; Store ref.func and an imported externref global into struct fields.
(struct.set $struct 0
(local.get $s)
(ref.func $exported_func)
)
(struct.set $struct 1
(local.get $s)
(global.get $imported_global)
)
)
;; SHARED: (func $call-ref (type $7) (param $s (ref $struct)) (param $f (ref (shared i31)))
;; SHARED-NEXT: (struct.set $struct 2
;; SHARED-NEXT: (local.get $s)
;; SHARED-NEXT: (call_indirect $funcs (type $sig)
;; SHARED-NEXT: (struct.get $struct 0
;; SHARED-NEXT: (local.get $s)
;; SHARED-NEXT: )
;; SHARED-NEXT: (struct.get $struct 1
;; SHARED-NEXT: (local.get $s)
;; SHARED-NEXT: )
;; SHARED-NEXT: (i31.get_u
;; SHARED-NEXT: (local.get $f)
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; UNSHARED: (func $call-ref (type $7) (param $s (ref $struct)) (param $f (ref i31))
;; UNSHARED-NEXT: (struct.set $struct 2
;; UNSHARED-NEXT: (local.get $s)
;; UNSHARED-NEXT: (call_indirect $funcs (type $sig)
;; UNSHARED-NEXT: (struct.get $struct 0
;; UNSHARED-NEXT: (local.get $s)
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: (struct.get $struct 1
;; UNSHARED-NEXT: (local.get $s)
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: (i31.get_u
;; UNSHARED-NEXT: (local.get $f)
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
(func $call-ref (param $s (ref $struct)) (param $f (ref $sig))
;; Lower call_ref to call_indirect over the $funcs table.
(struct.set $struct 2
(local.get $s)
(call_ref $sig
(struct.get $struct 0
(local.get $s)
)
(struct.get $struct 1
(local.get $s)
)
(local.get $f)
)
)
)
;; SHARED: (func $call-imported-func-and-convert (type $8) (param $s (ref $struct)) (result (ref null (shared i31)))
;; SHARED-NEXT: (tuple.drop 2
;; SHARED-NEXT: (call $imported_func
;; SHARED-NEXT: (struct.get $struct 0
;; SHARED-NEXT: (local.get $s)
;; SHARED-NEXT: )
;; SHARED-NEXT: (call $extern_to_index
;; SHARED-NEXT: (call $any_to_extern
;; SHARED-NEXT: (struct.get $struct 2
;; SHARED-NEXT: (local.get $s)
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: (call $extern_to_index
;; SHARED-NEXT: (call $any_to_extern
;; SHARED-NEXT: (struct.get $struct 2
;; SHARED-NEXT: (local.get $s)
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; UNSHARED: (func $call-imported-func-and-convert (type $8) (param $s (ref $struct)) (result i31ref)
;; UNSHARED-NEXT: (tuple.drop 2
;; UNSHARED-NEXT: (call $imported_func
;; UNSHARED-NEXT: (struct.get $struct 0
;; UNSHARED-NEXT: (local.get $s)
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: (call $extern_to_index
;; UNSHARED-NEXT: (call $any_to_extern
;; UNSHARED-NEXT: (struct.get $struct 2
;; UNSHARED-NEXT: (local.get $s)
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: (call $extern_to_index
;; UNSHARED-NEXT: (call $any_to_extern
;; UNSHARED-NEXT: (struct.get $struct 2
;; UNSHARED-NEXT: (local.get $s)
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
(func $call-imported-func-and-convert (param $s (ref $struct)) (result externref)
;; Convert anyref to externref and call an imported function.
(tuple.drop 2
(call $imported_func
(struct.get $struct 0
(local.get $s)
)
(extern.convert_any
(struct.get $struct 2
(local.get $s)
)
)
)
)
(extern.convert_any
(struct.get $struct 2
(local.get $s)
)
)
)
;; SHARED: (func $test-tag (type $9) (param $e (ref null (shared i31))) (result (ref null (shared i31)))
;; SHARED-NEXT: (try (result (ref null (shared i31)))
;; SHARED-NEXT: (do
;; SHARED-NEXT: (throw $tag
;; SHARED-NEXT: (call $index_to_extern
;; SHARED-NEXT: (local.get $e)
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: (catch $tag
;; SHARED-NEXT: (call $extern_to_index
;; SHARED-NEXT: (pop externref)
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; UNSHARED: (func $test-tag (type $9) (param $e i31ref) (result i31ref)
;; UNSHARED-NEXT: (try (result i31ref)
;; UNSHARED-NEXT: (do
;; UNSHARED-NEXT: (throw $tag
;; UNSHARED-NEXT: (call $index_to_extern
;; UNSHARED-NEXT: (local.get $e)
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: (catch $tag
;; UNSHARED-NEXT: (call $extern_to_index
;; UNSHARED-NEXT: (pop externref)
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
(func $test-tag (param $e externref) (result externref)
;; Throw and catch an externref tag with i31ref table conversions.
(try (result externref)
(do
(throw $tag
(local.get $e)
)
)
(catch $tag
(pop externref)
)
)
)
)
;; SHARED: (func $exported_func$export (type $11) (param $0 (ref null (shared i31))) (param $1 externref) (result (ref null (shared any)))
;; SHARED-NEXT: (call $exported_func
;; SHARED-NEXT: (local.get $0)
;; SHARED-NEXT: (call $extern_to_index
;; SHARED-NEXT: (local.get $1)
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED: (func $extern_to_index (type $12) (param $0 externref) (result (ref null (shared i31)))
;; SHARED-NEXT: (local $1 i32)
;; SHARED-NEXT: (if (result (ref null (shared i31)))
;; SHARED-NEXT: (ref.is_null
;; SHARED-NEXT: (local.get $0)
;; SHARED-NEXT: )
;; SHARED-NEXT: (then
;; SHARED-NEXT: (ref.null (shared none))
;; SHARED-NEXT: )
;; SHARED-NEXT: (else
;; SHARED-NEXT: (if (result (ref (shared i31)))
;; SHARED-NEXT: (i32.ge_s
;; SHARED-NEXT: (local.tee $1
;; SHARED-NEXT: (table.grow $externs
;; SHARED-NEXT: (local.get $0)
;; SHARED-NEXT: (i32.const 1)
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: (i32.const 0)
;; SHARED-NEXT: )
;; SHARED-NEXT: (then
;; SHARED-NEXT: (ref.i31_shared
;; SHARED-NEXT: (local.get $1)
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: (else
;; SHARED-NEXT: (unreachable)
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED: (func $index_to_extern (type $13) (param $0 (ref null (shared i31))) (result externref)
;; SHARED-NEXT: (if (result externref)
;; SHARED-NEXT: (ref.is_null
;; SHARED-NEXT: (local.get $0)
;; SHARED-NEXT: )
;; SHARED-NEXT: (then
;; SHARED-NEXT: (ref.null noextern)
;; SHARED-NEXT: )
;; SHARED-NEXT: (else
;; SHARED-NEXT: (table.get $externs
;; SHARED-NEXT: (i31.get_u
;; SHARED-NEXT: (local.get $0)
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; SHARED-NEXT: )
;; UNSHARED: (func $exported_func$export (type $11) (param $0 i31ref) (param $1 externref) (result anyref)
;; UNSHARED-NEXT: (call $exported_func
;; UNSHARED-NEXT: (local.get $0)
;; UNSHARED-NEXT: (call $extern_to_index
;; UNSHARED-NEXT: (local.get $1)
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED: (func $extern_to_index (type $12) (param $0 externref) (result i31ref)
;; UNSHARED-NEXT: (local $1 i32)
;; UNSHARED-NEXT: (if (result i31ref)
;; UNSHARED-NEXT: (ref.is_null
;; UNSHARED-NEXT: (local.get $0)
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: (then
;; UNSHARED-NEXT: (ref.null none)
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: (else
;; UNSHARED-NEXT: (if (result (ref i31))
;; UNSHARED-NEXT: (i32.ge_s
;; UNSHARED-NEXT: (local.tee $1
;; UNSHARED-NEXT: (table.grow $externs
;; UNSHARED-NEXT: (local.get $0)
;; UNSHARED-NEXT: (i32.const 1)
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: (i32.const 0)
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: (then
;; UNSHARED-NEXT: (ref.i31
;; UNSHARED-NEXT: (local.get $1)
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: (else
;; UNSHARED-NEXT: (unreachable)
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED: (func $index_to_extern (type $13) (param $0 i31ref) (result externref)
;; UNSHARED-NEXT: (if (result externref)
;; UNSHARED-NEXT: (ref.is_null
;; UNSHARED-NEXT: (local.get $0)
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: (then
;; UNSHARED-NEXT: (ref.null noextern)
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: (else
;; UNSHARED-NEXT: (table.get $externs
;; UNSHARED-NEXT: (i31.get_u
;; UNSHARED-NEXT: (local.get $0)
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )
;; UNSHARED-NEXT: )