blob: 0077c27bef3701b14c7bdb7114cf5098f63ec424 [file] [edit]
;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited.
;; RUN: foreach %s %t wasm-opt --enclose-world -all -S -o - | filecheck %s
(module
;; CHECK: (type $A (struct))
(type $A (struct))
;; CHECK: (type $B (struct (field i32)))
(type $B (struct (field i32)))
;; CHECK: (type $2 (func (param externref)))
;; CHECK: (type $3 (func (result externref)))
;; CHECK: (type $4 (func (param anyref) (result anyref)))
;; CHECK: (type $5 (func (param externref) (result externref)))
;; CHECK: (type $C (struct (field i32) (field f64)))
(type $C (struct (field i32 f64)))
;; CHECK: (type $7 (func (param i32) (result f64)))
;; CHECK: (type $8 (func (param anyref)))
;; CHECK: (type $9 (func (result anyref)))
;; CHECK: (type $10 (func (param (ref $A) (ref null $B)) (result (ref $C))))
;; CHECK: (type $11 (func (param i32 (ref $A) funcref)))
;; CHECK: (type $12 (func (param externref externref) (result externref)))
;; CHECK: (type $13 (func (param i32 externref funcref)))
;; CHECK: (export "normal" (func $normal))
;; CHECK: (export "externref-param" (func $externref-param))
;; CHECK: (export "externref-result" (func $externref-result))
;; CHECK: (export "anyref-param" (func $stub$anyref-param))
;; CHECK: (export "anyref-result" (func $stub$anyref-result))
;; CHECK: (export "anyref-both" (func $stub$anyref-both))
;; CHECK: (export "anyref-both-dupe" (func $stub$anyref-both-dupe))
;; CHECK: (export "many" (func $stub$many))
;; CHECK: (export "mixed" (func $stub$mixed))
;; CHECK: (func $normal (type $7) (param $x i32) (result f64)
;; CHECK-NEXT: (f64.const 3.14159)
;; CHECK-NEXT: )
(func $normal (export "normal") (param $x i32) (result f64)
;; A normal function which we do not need to do anything with.
(f64.const 3.14159)
)
;; CHECK: (func $externref-param (type $2) (param $x externref)
;; CHECK-NEXT: )
(func $externref-param (export "externref-param") (param $x externref)
;; An externref param is fine, we don't need to do anything.
)
;; CHECK: (func $externref-result (type $3) (result externref)
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
(func $externref-result (export "externref-result") (result externref)
;; An externref result is also fine.
(unreachable)
)
;; CHECK: (func $anyref-param (type $8) (param $x anyref)
;; CHECK-NEXT: )
(func $anyref-param (export "anyref-param") (param $x anyref)
;; An anyref requires a fixup. We will call this from a stub that has an
;; externref param, which calls this.
)
;; CHECK: (func $anyref-result (type $9) (result anyref)
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
(func $anyref-result (export "anyref-result") (result anyref)
;; An anyref result also requires a fixup.
(unreachable)
)
;; CHECK: (func $anyref-both (type $4) (param $x anyref) (result anyref)
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
(func $anyref-both (export "anyref-both") (param $x anyref) (result anyref)
;; Here we must fix up both the param and the result.
(unreachable)
)
;; CHECK: (func $anyref-both-dupe (type $4) (param $x anyref) (result anyref)
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
(func $anyref-both-dupe (export "anyref-both-dupe") (param $x anyref) (result anyref)
;; Identical to the above function, and should be fixed up in the same
;; manner. In theory we could use the same stub for both, but we leave that
;; for the optimizer.
(unreachable)
)
;; CHECK: (func $many (type $10) (param $a (ref $A)) (param $b (ref null $B)) (result (ref $C))
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
(func $many (export "many") (param $a (ref $A)) (param $b (ref null $B)) (result (ref $C))
;; Various declared types are used, and must be fixed up.
(unreachable)
)
;; CHECK: (func $mixed (type $11) (param $a i32) (param $b (ref $A)) (param $c funcref)
;; CHECK-NEXT: )
(func $mixed (export "mixed") (param $a i32) (param $b (ref $A)) (param $c funcref)
;; One param needs to be fixed, two others do not: we can ignore i32 and
;; funcref.
)
)
;; CHECK: (func $stub$anyref-param (type $2) (param $0 externref)
;; CHECK-NEXT: (call $anyref-param
;; CHECK-NEXT: (ref.cast anyref
;; CHECK-NEXT: (any.convert_extern
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK: (func $stub$anyref-result (type $3) (result externref)
;; CHECK-NEXT: (extern.convert_any
;; CHECK-NEXT: (call $anyref-result)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK: (func $stub$anyref-both (type $5) (param $0 externref) (result externref)
;; CHECK-NEXT: (extern.convert_any
;; CHECK-NEXT: (call $anyref-both
;; CHECK-NEXT: (ref.cast anyref
;; CHECK-NEXT: (any.convert_extern
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK: (func $stub$anyref-both-dupe (type $5) (param $0 externref) (result externref)
;; CHECK-NEXT: (extern.convert_any
;; CHECK-NEXT: (call $anyref-both-dupe
;; CHECK-NEXT: (ref.cast anyref
;; CHECK-NEXT: (any.convert_extern
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK: (func $stub$many (type $12) (param $0 externref) (param $1 externref) (result externref)
;; CHECK-NEXT: (extern.convert_any
;; CHECK-NEXT: (call $many
;; CHECK-NEXT: (ref.cast (ref $A)
;; CHECK-NEXT: (any.convert_extern
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (ref.cast (ref null $B)
;; CHECK-NEXT: (any.convert_extern
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK: (func $stub$mixed (type $13) (param $0 i32) (param $1 externref) (param $2 funcref)
;; CHECK-NEXT: (call $mixed
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (ref.cast (ref $A)
;; CHECK-NEXT: (any.convert_extern
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(module
;; Two exports of a single function that needs fixups. We could reuse a
;; single stub, but we leave that for the optimizer.
(export "a" (func $anyref-both))
(export "b" (func $anyref-both))
;; CHECK: (type $0 (func (param externref) (result externref)))
;; CHECK: (type $1 (func (param anyref) (result anyref)))
;; CHECK: (export "a" (func $stub$anyref-both))
;; CHECK: (export "b" (func $stub$anyref-both_2))
;; CHECK: (func $anyref-both (type $1) (param $x anyref) (result anyref)
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: )
(func $anyref-both (param $x anyref) (result anyref)
(unreachable)
)
)
;; CHECK: (func $stub$anyref-both (type $0) (param $0 externref) (result externref)
;; CHECK-NEXT: (extern.convert_any
;; CHECK-NEXT: (call $anyref-both
;; CHECK-NEXT: (ref.cast anyref
;; CHECK-NEXT: (any.convert_extern
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK: (func $stub$anyref-both_2 (type $0) (param $0 externref) (result externref)
;; CHECK-NEXT: (extern.convert_any
;; CHECK-NEXT: (call $anyref-both
;; CHECK-NEXT: (ref.cast anyref
;; CHECK-NEXT: (any.convert_extern
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )