| ;; 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: ) |