1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
(module
(type $0 (func (param i32)))
(import "env" "invoke_vif" (func $invoke_vif (param i32 i32 f32)))
(memory 256 256)
(table 7 7 funcref)
(elem (i32.const 1) $exc $other_safe $other_unsafe $deep_safe $deep_unsafe)
(func $exc
(call $invoke_vif
(i32.const 2) ;; other_safe()
(i32.const 42)
(f32.const 3.14159)
)
(call $invoke_vif
(i32.const 3) ;; other_unsafe()
(i32.const 55)
(f32.const 2.18281828)
)
(call $invoke_vif
(i32.const 4) ;; deep_safe()
(i32.const 100)
(f32.const 1.111)
)
(call $invoke_vif
(i32.const 5) ;; deep_unsafe()
(i32.const 999)
(f32.const 1.414)
)
(call $invoke_vif
(i32.add (i32.const 1) (i32.const 1)) ;; nonconstant
(i32.const 42)
(f32.const 3.14159)
)
;; there is no function at index 0, so this cannot be optimized
(call $invoke_vif
(i32.const 0)
(i32.const 42)
(f32.const 3.14159)
)
;; there is no function at index 1337, so this cannot be optimized
(call $invoke_vif
(i32.const 1337)
(i32.const 42)
(f32.const 3.14159)
)
)
(func $other_safe (param i32) (param f32)
)
(func $other_unsafe (param i32) (param f32)
)
(func $deep_safe (param i32) (param f32)
(call $other_safe (unreachable) (unreachable))
)
(func $deep_unsafe (param i32) (param f32)
(call $other_unsafe (unreachable) (unreachable))
)
)
(module ;; no invokes
(func $call
(call $call)
)
)
(module ;; non-constant base for elem
(type $0 (func (param i32)))
(import "env" "invoke_vif" (func $invoke_vif (param i32 i32 f32)))
(import "env" "glob" (global $glob i32)) ;; non-constant table offset
(memory 256 256)
(table 7 7 funcref)
(elem (global.get $glob) $other_safe)
(func $exc
(call $invoke_vif
(i32.const 3) ;; other_safe()
(i32.const 42)
(f32.const 3.14159)
)
)
(func $other_safe (param i32) (param f32)
)
)
(module ;; indirect call in the invoke target, which we assume might throw
(type $none_=>_none (func))
(import "env" "invoke_vif" (func $invoke_vif (param i32 i32 f32)))
(import "env" "glob" (global $glob i32)) ;; non-constant table offset
(memory 256 256)
(table 7 7 funcref)
(elem (i32.const 0) $other_safe)
(func $exc
(call $invoke_vif
(i32.const 0) ;; other_safe()
(i32.const 42)
(f32.const 3.14159)
)
)
(func $other_safe (param i32) (param f32)
(call_indirect (type $none_=>_none)
(i32.const 0)
)
)
)
|