| (module |
| (memory 0) |
| (start $start) |
| (type $0 (func)) |
| (type $0-dupe (func)) |
| (type $1 (func (param i32))) |
| (type $1-dupe (func (param i32))) |
| (type $2 (func (param i32) (result i32))) |
| (type $2-dupe (func (param i32) (result i32))) |
| (type $2-thrupe (func (param i32) (result i32))) |
| (export "memory" (memory $0)) |
| (export "exported" (func $exported)) |
| (export "other1" (func $other1)) |
| (export "other2" (func $other2)) |
| (table 1 1 funcref) |
| (elem (i32.const 0) $called_indirect) |
| (func $start (type $0) |
| (call $called0) |
| ) |
| (func $called0 (type $0) |
| (call $called1) |
| ) |
| (func $called1 (type $0) |
| (nop) |
| ) |
| (func $called_indirect (type $0) |
| (nop) |
| ) |
| (func $exported (type $0-dupe) |
| (call $called2) |
| ) |
| (func $called2 (type $0-dupe) |
| (call $called2) |
| (call $called3) |
| ) |
| (func $called3 (type $0-dupe) |
| (call $called4) |
| ) |
| (func $called4 (type $0-dupe) |
| (call $called3) |
| ) |
| (func $remove0 (type $0-dupe) |
| (call $remove1) |
| ) |
| (func $remove1 (type $0-dupe) |
| (nop) |
| ) |
| (func $remove2 (type $0-dupe) |
| (call $remove2) |
| ) |
| (func $remove3 (type $0) |
| (call $remove4) |
| ) |
| (func $remove4 (type $0) |
| (call $remove3) |
| ) |
| (func $other1 (type $1) (param i32) |
| (call_indirect (type $0) (i32.const 0)) |
| (call_indirect (type $0) (i32.const 0)) |
| (call_indirect (type $0-dupe) (i32.const 0)) |
| (call_indirect (type $0-dupe) (i32.const 0)) |
| (call_indirect (type $1) (i32.const 0) (i32.const 0)) |
| (call_indirect (type $1-dupe) (i32.const 0) (i32.const 0)) |
| (drop (call_indirect (type $2) (i32.const 0) (i32.const 0))) |
| (drop (call_indirect (type $2-dupe) (i32.const 0) (i32.const 0))) |
| (drop (call_indirect (type $2-thrupe) (i32.const 0) (i32.const 0))) |
| ) |
| (func $other2 (type $1-dupe) (param i32) |
| (unreachable) |
| ) |
| ) |
| (module ;; remove the table and memory |
| (import "env" "memory" (memory $0 256)) |
| (import "env" "table" (table 0 funcref)) |
| ) |
| (module ;; also when not imported |
| (memory 256) |
| (table 1 funcref) |
| ) |
| (module ;; but not when exported |
| (import "env" "memory" (memory $0 256)) |
| (import "env" "table" (table 1 funcref)) |
| (export "mem" (memory 0)) |
| (export "tab" (table 0)) |
| ) |
| (module ;; and not when there are segments |
| (import "env" "memory" (memory $0 256)) |
| (import "env" "table" (table 1 funcref)) |
| (data (i32.const 1) "hello, world!") |
| (elem (i32.const 0) $waka) |
| (func $waka) |
| ) |
| (module ;; and not when used |
| (type $0 (func)) |
| (import "env" "memory" (memory $0 256)) |
| (import "env" "table" (table 0 funcref)) |
| (export "user" (func $user)) |
| (func $user |
| (drop (i32.load (i32.const 0))) |
| (call_indirect (type $0) (i32.const 0)) |
| ) |
| ) |
| (module ;; more use checks |
| (memory $0 23 256 shared) |
| (export "user" (func $user)) |
| (func $user |
| (i32.store (i32.const 0) (i32.const 0)) |
| ) |
| ) |
| (module ;; more use checks |
| (memory $0 23 256 shared) |
| (export "user" (func $user)) |
| (func $user (result i32) |
| (i32.atomic.rmw.add (i32.const 0) (i32.const 0)) |
| ) |
| ) |
| (module ;; more use checks |
| (memory $0 23 256 shared) |
| (export "user" (func $user)) |
| (func $user (result i32) |
| (i32.atomic.rmw8.cmpxchg_u (i32.const 0) (i32.const 0) (i32.const 0)) |
| ) |
| ) |
| (module ;; more use checks |
| (memory $0 23 256 shared) |
| (export "user" (func $user)) |
| (func $user |
| (local $0 i32) |
| (local $1 i64) |
| (drop |
| (memory.atomic.wait32 |
| (local.get $0) |
| (local.get $0) |
| (local.get $1) |
| ) |
| ) |
| ) |
| ) |
| (module ;; more use checks |
| (memory $0 23 256 shared) |
| (export "user" (func $user)) |
| (func $user (result i32) |
| (memory.atomic.notify (i32.const 0) (i32.const 0)) |
| ) |
| ) |
| (module ;; more use checks |
| (memory $0 23 256) |
| (export "user" (func $user)) |
| (func $user (result i32) |
| (memory.grow (i32.const 0)) |
| ) |
| ) |
| (module ;; more use checks |
| (import "env" "memory" (memory $0 256)) |
| (export "user" (func $user)) |
| (func $user (result i32) |
| (memory.grow (i32.const 0)) |
| ) |
| ) |
| (module ;; more use checks |
| (memory $0 23 256) |
| (export "user" (func $user)) |
| (func $user (result i32) |
| (memory.size) |
| ) |
| ) |
| (module |
| (import "env" "memory" (memory $0 256)) |
| (import "env" "table" (table 0 funcref)) |
| (import "env" "memoryBase" (global $memoryBase i32)) ;; used in init |
| (import "env" "tableBase" (global $tableBase i32)) ;; used in init |
| (data (global.get $memoryBase) "hello, world!") |
| (elem (global.get $tableBase) $waka) |
| (func $waka) ;; used in table |
| ) |
| (module ;; one is exported, and one->two->int global, whose init->imported |
| (import "env" "imported" (global $imported i32)) |
| (import "env" "forgetme" (global $forgetme i32)) |
| (import "env" "_puts" (func $_puts (param i32) (result i32))) |
| (import "env" "forget_puts" (func $forget_puts (param i32) (result i32))) |
| (global $int (mut i32) (global.get $imported)) |
| (global $set (mut i32) (i32.const 100)) |
| (global $forglobal.get (mut i32) (i32.const 500)) |
| (global $exp_glob i32 (i32.const 600)) |
| (export "one" (func $one)) |
| (export "three" (func $three)) |
| (export "exp_glob" (global $exp_glob)) |
| (start $starter) |
| (func $one (result i32) |
| (call $two) |
| ) |
| (func $two (result i32) |
| (global.get $int) |
| ) |
| (func $three |
| (call $four) |
| ) |
| (func $four |
| (global.set $set (i32.const 200)) |
| (drop (call $_puts (i32.const 300))) |
| ) |
| (func $forget_implemented |
| (nop) |
| ) |
| (func $starter |
| (nop) |
| ) |
| ) |
| (module ;; empty start being removed |
| (start $starter) |
| (func $starter |
| (nop) |
| ) |
| ) |
| (module ;; non-empty start being kept |
| (start $starter) |
| (func $starter |
| (drop (i32.const 0)) |
| ) |
| ) |
| (module ;; the function stays but the table can be removed |
| (type $0 (func (param f64) (result f64))) |
| (table 6 6 funcref) |
| (func $0 (; 0 ;) (type $0) (param $var$0 f64) (result f64) |
| (if (result f64) |
| (f64.eq |
| (f64.const 1) |
| (f64.const 1) |
| ) |
| (then |
| (f64.const 1) |
| ) |
| (else |
| (f64.const 0) |
| ) |
| ) |
| ) |
| ) |
| (module ;; the function keeps the table alive |
| (type $0 (func (param f64) (result f64))) |
| (table 6 6 funcref) |
| (func $0 (; 0 ;) (type $0) (param $var$0 f64) (result f64) |
| (if (result f64) |
| (f64.eq |
| (f64.const 1) |
| (f64.const 1) |
| ) |
| (then |
| (call_indirect (type $0) (f64.const 1) (i32.const 0)) |
| ) |
| (else |
| (f64.const 0) |
| ) |
| ) |
| ) |
| ) |
| (module ;; the table is imported - we can't remove it |
| (type $0 (func (param f64) (result f64))) |
| (import "env" "table" (table 6 6 funcref)) |
| (elem (i32.const 0) $0) |
| (func $0 (; 0 ;) (type $0) (param $var$0 f64) (result f64) |
| (if (result f64) |
| (f64.eq |
| (f64.const 1) |
| (f64.const 1) |
| ) |
| (then |
| (f64.const 1) |
| ) |
| (else |
| (f64.const 0) |
| ) |
| ) |
| ) |
| ) |
| (module ;; non-exported tags can be removed |
| (type $0 (func (param i32))) |
| (import "env" "e" (tag $e2 (param i32))) |
| (tag $e0 (type $0)) |
| (tag $e1 (param i64)) |
| (export "e1" (tag $e1)) |
| (func $f (; 0 ;) (type $0)) |
| ) |