blob: 52d7b19a16b7a834b3e8b28a97810edb592ea684 [file] [log] [blame] [edit]
(module
(type $0 (func))
(type $1 (func (param i32) (result i32)))
(type $2 (func (result i32)))
(type $ii (func (param i32 i32)))
(type $4 (func (param i32)))
(type $5 (func (param f64)))
(import "env" "STACKTOP" (global $STACKTOP$asm2wasm$import i32))
(import "env" "segfault" (func $segfault (param i32)))
(global $stack_ptr (mut i32) (global.get $STACKTOP$asm2wasm$import))
(memory $0 10)
(table $0 1 1 funcref)
(elem $0 (i32.const 0))
(func $nothing
)
(func $not-alive
(local $x i32)
(local.set $x
(i32.const 1)
)
(call $nothing)
)
(func $spill
(local $x i32)
(local $1 i32)
(global.set $stack_ptr
(local.tee $1
(i32.sub
(global.get $stack_ptr)
(i32.const 16)
)
)
)
(block
(block
(i32.store
(local.get $1)
(local.get $x)
)
(call $nothing)
)
(drop
(local.get $x)
)
)
(global.set $stack_ptr
(i32.add
(local.get $1)
(i32.const 16)
)
)
)
(func $ignore-non-pointers
(local $x i32)
(local $y i64)
(local $z f32)
(local $w f64)
(local $4 i32)
(global.set $stack_ptr
(local.tee $4
(i32.sub
(global.get $stack_ptr)
(i32.const 16)
)
)
)
(block
(local.set $x
(i32.const 1)
)
(local.set $y
(i64.const 1)
)
(local.set $z
(f32.const 1)
)
(local.set $w
(f64.const 1)
)
(block
(i32.store
(local.get $4)
(local.get $x)
)
(call $nothing)
)
(drop
(local.get $x)
)
(drop
(local.get $y)
)
(drop
(local.get $z)
)
(drop
(local.get $w)
)
)
(global.set $stack_ptr
(i32.add
(local.get $4)
(i32.const 16)
)
)
)
(func $spill4
(local $x i32)
(local $y i32)
(local $z i32)
(local $w i32)
(local $4 i32)
(global.set $stack_ptr
(local.tee $4
(i32.sub
(global.get $stack_ptr)
(i32.const 16)
)
)
)
(block
(local.set $x
(i32.const 1)
)
(local.set $y
(i32.const 1)
)
(local.set $z
(i32.const 1)
)
(local.set $w
(i32.const 1)
)
(block
(i32.store
(local.get $4)
(local.get $x)
)
(i32.store offset=4
(local.get $4)
(local.get $y)
)
(i32.store offset=8
(local.get $4)
(local.get $z)
)
(i32.store offset=12
(local.get $4)
(local.get $w)
)
(call $nothing)
)
(drop
(local.get $x)
)
(drop
(local.get $y)
)
(drop
(local.get $z)
)
(drop
(local.get $w)
)
)
(global.set $stack_ptr
(i32.add
(local.get $4)
(i32.const 16)
)
)
)
(func $spill5
(local $x i32)
(local $y i32)
(local $z i32)
(local $w i32)
(local $a i32)
(local $5 i32)
(global.set $stack_ptr
(local.tee $5
(i32.sub
(global.get $stack_ptr)
(i32.const 32)
)
)
)
(block
(local.set $x
(i32.const 1)
)
(local.set $y
(i32.const 1)
)
(local.set $z
(i32.const 1)
)
(local.set $w
(i32.const 1)
)
(local.set $a
(i32.const 1)
)
(block
(i32.store
(local.get $5)
(local.get $x)
)
(i32.store offset=4
(local.get $5)
(local.get $y)
)
(i32.store offset=8
(local.get $5)
(local.get $z)
)
(i32.store offset=12
(local.get $5)
(local.get $w)
)
(i32.store offset=16
(local.get $5)
(local.get $a)
)
(call $nothing)
)
(drop
(local.get $x)
)
(drop
(local.get $y)
)
(drop
(local.get $z)
)
(drop
(local.get $w)
)
(drop
(local.get $a)
)
)
(global.set $stack_ptr
(i32.add
(local.get $5)
(i32.const 32)
)
)
)
(func $some-alive
(local $x i32)
(local $y i32)
(local $2 i32)
(global.set $stack_ptr
(local.tee $2
(i32.sub
(global.get $stack_ptr)
(i32.const 16)
)
)
)
(block
(block
(i32.store
(local.get $2)
(local.get $x)
)
(call $nothing)
)
(drop
(local.get $x)
)
)
(global.set $stack_ptr
(i32.add
(local.get $2)
(i32.const 16)
)
)
)
(func $spill-args (param $p i32) (param $q i32)
(local $x i32)
(local $3 i32)
(local $4 i32)
(local $5 i32)
(global.set $stack_ptr
(local.tee $3
(i32.sub
(global.get $stack_ptr)
(i32.const 16)
)
)
)
(block
(block
(local.set $4
(i32.const 1)
)
(local.set $5
(i32.const 2)
)
(i32.store offset=8
(local.get $3)
(local.get $x)
)
(call $spill-args
(local.get $4)
(local.get $5)
)
)
(drop
(local.get $x)
)
)
(global.set $stack_ptr
(i32.add
(local.get $3)
(i32.const 16)
)
)
)
(func $spill-ret (result i32)
(local $x i32)
(local $1 i32)
(local $2 i32)
(local $3 i32)
(local $4 i32)
(global.set $stack_ptr
(local.tee $1
(i32.sub
(global.get $stack_ptr)
(i32.const 16)
)
)
)
(local.set $4
(block (result i32)
(block
(i32.store
(local.get $1)
(local.get $x)
)
(call $nothing)
)
(drop
(local.get $x)
)
(if
(i32.const 1)
(then
(local.set $2
(i32.const 2)
)
(global.set $stack_ptr
(i32.add
(local.get $1)
(i32.const 16)
)
)
(return
(local.get $2)
)
)
(else
(local.set $3
(i32.const 3)
)
(global.set $stack_ptr
(i32.add
(local.get $1)
(i32.const 16)
)
)
(return
(local.get $3)
)
)
)
(i32.const 4)
)
)
(global.set $stack_ptr
(i32.add
(local.get $1)
(i32.const 16)
)
)
(local.get $4)
)
(func $spill-unreachable (result i32)
(local $x i32)
(local $1 i32)
(local $2 i32)
(global.set $stack_ptr
(local.tee $1
(i32.sub
(global.get $stack_ptr)
(i32.const 16)
)
)
)
(local.set $2
(block (result i32)
(block
(i32.store
(local.get $1)
(local.get $x)
)
(call $nothing)
)
(drop
(local.get $x)
)
(unreachable)
)
)
(global.set $stack_ptr
(i32.add
(local.get $1)
(i32.const 16)
)
)
(local.get $2)
)
(func $spill-call-call0 (param $p i32) (result i32)
(unreachable)
)
(func $spill-call-call1 (param $p i32) (result i32)
(local $x i32)
(local $2 i32)
(local $3 i32)
(local $4 i32)
(local $5 i32)
(global.set $stack_ptr
(local.tee $2
(i32.sub
(global.get $stack_ptr)
(i32.const 16)
)
)
)
(local.set $5
(block (result i32)
(drop
(block (result i32)
(local.set $3
(block (result i32)
(local.set $4
(i32.const 1)
)
(i32.store offset=4
(local.get $2)
(local.get $x)
)
(call $spill-call-call1
(local.get $4)
)
)
)
(i32.store offset=4
(local.get $2)
(local.get $x)
)
(call $spill-call-call0
(local.get $3)
)
)
)
(local.get $x)
)
)
(global.set $stack_ptr
(i32.add
(local.get $2)
(i32.const 16)
)
)
(local.get $5)
)
(func $spill-call-ret (param $p i32) (result i32)
(local $x i32)
(drop
(call $spill-call-call0
(return
(i32.const 1)
)
)
)
(i32.const 0)
)
(func $spill-ret-call (param $p i32) (result i32)
(local $x i32)
(drop
(return
(call $spill-call-call0
(i32.const 1)
)
)
)
(i32.const 0)
)
(func $spill-ret-ret (result i32)
(local $x i32)
(local $1 i32)
(local $2 i32)
(local $3 i32)
(global.set $stack_ptr
(local.tee $1
(i32.sub
(global.get $stack_ptr)
(i32.const 16)
)
)
)
(local.set $3
(block (result i32)
(block
(i32.store
(local.get $1)
(local.get $x)
)
(call $nothing)
)
(drop
(local.get $x)
)
(drop
(block
(global.set $stack_ptr
(i32.add
(local.get $1)
(i32.const 16)
)
)
(return
(block
(local.set $2
(i32.const 1)
)
(global.set $stack_ptr
(i32.add
(local.get $1)
(i32.const 16)
)
)
(return
(local.get $2)
)
)
)
)
)
(i32.const 0)
)
)
(global.set $stack_ptr
(i32.add
(local.get $1)
(i32.const 16)
)
)
(local.get $3)
)
(func $spill-call-othertype (param $y f64)
(local $x i32)
(local $2 i32)
(local $3 f64)
(global.set $stack_ptr
(local.tee $2
(i32.sub
(global.get $stack_ptr)
(i32.const 16)
)
)
)
(block
(block
(local.set $3
(f64.const 1)
)
(i32.store
(local.get $2)
(local.get $x)
)
(call $spill-call-othertype
(local.get $3)
)
)
(drop
(local.get $x)
)
)
(global.set $stack_ptr
(i32.add
(local.get $2)
(i32.const 16)
)
)
)
(func $spill-call_indirect
(local $x i32)
(local $1 i32)
(local $2 i32)
(local $3 i32)
(local $4 i32)
(global.set $stack_ptr
(local.tee $1
(i32.sub
(global.get $stack_ptr)
(i32.const 16)
)
)
)
(block
(block
(local.set $2
(i32.const 123)
)
(local.set $3
(i32.const 456)
)
(local.set $4
(i32.const 789)
)
(i32.store
(local.get $1)
(local.get $x)
)
(call_indirect (type $ii)
(local.get $2)
(local.get $3)
(local.get $4)
)
)
(drop
(local.get $x)
)
)
(global.set $stack_ptr
(i32.add
(local.get $1)
(i32.const 16)
)
)
)
(func $spill-call_import
(local $x i32)
(local $1 i32)
(local $2 i32)
(global.set $stack_ptr
(local.tee $1
(i32.sub
(global.get $stack_ptr)
(i32.const 16)
)
)
)
(block
(block
(local.set $2
(i32.const 200)
)
(i32.store
(local.get $1)
(local.get $x)
)
(call $segfault
(local.get $2)
)
)
(drop
(local.get $x)
)
)
(global.set $stack_ptr
(i32.add
(local.get $1)
(i32.const 16)
)
)
)
)
(module
(type $0 (func))
(type $1 (func (result i32)))
(type $2 (func (param i32) (result i32)))
(type $ii (func (param i32 i32)))
(type $4 (func (param i32)))
(type $5 (func (param f64)))
(import "env" "segfault" (func $segfault (param i32)))
(global $stack_ptr (mut i32) (i32.const 1716592))
(memory $0 10)
(table $0 1 1 funcref)
(elem $0 (i32.const 0))
(export "stackSave" (func $stack_save))
(func $stack_save (result i32)
(global.get $stack_ptr)
)
(func $nothing
)
(func $not-alive
(local $x i32)
(local.set $x
(i32.const 1)
)
(call $nothing)
)
(func $spill
(local $x i32)
(local $1 i32)
(global.set $stack_ptr
(local.tee $1
(i32.sub
(global.get $stack_ptr)
(i32.const 16)
)
)
)
(block
(block
(i32.store
(local.get $1)
(local.get $x)
)
(call $nothing)
)
(drop
(local.get $x)
)
)
(global.set $stack_ptr
(i32.add
(local.get $1)
(i32.const 16)
)
)
)
(func $ignore-non-pointers
(local $x i32)
(local $y i64)
(local $z f32)
(local $w f64)
(local $4 i32)
(global.set $stack_ptr
(local.tee $4
(i32.sub
(global.get $stack_ptr)
(i32.const 16)
)
)
)
(block
(local.set $x
(i32.const 1)
)
(local.set $y
(i64.const 1)
)
(local.set $z
(f32.const 1)
)
(local.set $w
(f64.const 1)
)
(block
(i32.store
(local.get $4)
(local.get $x)
)
(call $nothing)
)
(drop
(local.get $x)
)
(drop
(local.get $y)
)
(drop
(local.get $z)
)
(drop
(local.get $w)
)
)
(global.set $stack_ptr
(i32.add
(local.get $4)
(i32.const 16)
)
)
)
(func $spill4
(local $x i32)
(local $y i32)
(local $z i32)
(local $w i32)
(local $4 i32)
(global.set $stack_ptr
(local.tee $4
(i32.sub
(global.get $stack_ptr)
(i32.const 16)
)
)
)
(block
(local.set $x
(i32.const 1)
)
(local.set $y
(i32.const 1)
)
(local.set $z
(i32.const 1)
)
(local.set $w
(i32.const 1)
)
(block
(i32.store
(local.get $4)
(local.get $x)
)
(i32.store offset=4
(local.get $4)
(local.get $y)
)
(i32.store offset=8
(local.get $4)
(local.get $z)
)
(i32.store offset=12
(local.get $4)
(local.get $w)
)
(call $nothing)
)
(drop
(local.get $x)
)
(drop
(local.get $y)
)
(drop
(local.get $z)
)
(drop
(local.get $w)
)
)
(global.set $stack_ptr
(i32.add
(local.get $4)
(i32.const 16)
)
)
)
(func $spill5
(local $x i32)
(local $y i32)
(local $z i32)
(local $w i32)
(local $a i32)
(local $5 i32)
(global.set $stack_ptr
(local.tee $5
(i32.sub
(global.get $stack_ptr)
(i32.const 32)
)
)
)
(block
(local.set $x
(i32.const 1)
)
(local.set $y
(i32.const 1)
)
(local.set $z
(i32.const 1)
)
(local.set $w
(i32.const 1)
)
(local.set $a
(i32.const 1)
)
(block
(i32.store
(local.get $5)
(local.get $x)
)
(i32.store offset=4
(local.get $5)
(local.get $y)
)
(i32.store offset=8
(local.get $5)
(local.get $z)
)
(i32.store offset=12
(local.get $5)
(local.get $w)
)
(i32.store offset=16
(local.get $5)
(local.get $a)
)
(call $nothing)
)
(drop
(local.get $x)
)
(drop
(local.get $y)
)
(drop
(local.get $z)
)
(drop
(local.get $w)
)
(drop
(local.get $a)
)
)
(global.set $stack_ptr
(i32.add
(local.get $5)
(i32.const 32)
)
)
)
(func $some-alive
(local $x i32)
(local $y i32)
(local $2 i32)
(global.set $stack_ptr
(local.tee $2
(i32.sub
(global.get $stack_ptr)
(i32.const 16)
)
)
)
(block
(block
(i32.store
(local.get $2)
(local.get $x)
)
(call $nothing)
)
(drop
(local.get $x)
)
)
(global.set $stack_ptr
(i32.add
(local.get $2)
(i32.const 16)
)
)
)
(func $spill-args (param $p i32) (param $q i32)
(local $x i32)
(local $3 i32)
(local $4 i32)
(local $5 i32)
(global.set $stack_ptr
(local.tee $3
(i32.sub
(global.get $stack_ptr)
(i32.const 16)
)
)
)
(block
(block
(local.set $4
(i32.const 1)
)
(local.set $5
(i32.const 2)
)
(i32.store offset=8
(local.get $3)
(local.get $x)
)
(call $spill-args
(local.get $4)
(local.get $5)
)
)
(drop
(local.get $x)
)
)
(global.set $stack_ptr
(i32.add
(local.get $3)
(i32.const 16)
)
)
)
(func $spill-ret (result i32)
(local $x i32)
(local $1 i32)
(local $2 i32)
(local $3 i32)
(local $4 i32)
(global.set $stack_ptr
(local.tee $1
(i32.sub
(global.get $stack_ptr)
(i32.const 16)
)
)
)
(local.set $4
(block (result i32)
(block
(i32.store
(local.get $1)
(local.get $x)
)
(call $nothing)
)
(drop
(local.get $x)
)
(if
(i32.const 1)
(then
(local.set $2
(i32.const 2)
)
(global.set $stack_ptr
(i32.add
(local.get $1)
(i32.const 16)
)
)
(return
(local.get $2)
)
)
(else
(local.set $3
(i32.const 3)
)
(global.set $stack_ptr
(i32.add
(local.get $1)
(i32.const 16)
)
)
(return
(local.get $3)
)
)
)
(i32.const 4)
)
)
(global.set $stack_ptr
(i32.add
(local.get $1)
(i32.const 16)
)
)
(local.get $4)
)
(func $spill-unreachable (result i32)
(local $x i32)
(local $1 i32)
(local $2 i32)
(global.set $stack_ptr
(local.tee $1
(i32.sub
(global.get $stack_ptr)
(i32.const 16)
)
)
)
(local.set $2
(block (result i32)
(block
(i32.store
(local.get $1)
(local.get $x)
)
(call $nothing)
)
(drop
(local.get $x)
)
(unreachable)
)
)
(global.set $stack_ptr
(i32.add
(local.get $1)
(i32.const 16)
)
)
(local.get $2)
)
(func $spill-call-call0 (param $p i32) (result i32)
(unreachable)
)
(func $spill-call-call1 (param $p i32) (result i32)
(local $x i32)
(local $2 i32)
(local $3 i32)
(local $4 i32)
(local $5 i32)
(global.set $stack_ptr
(local.tee $2
(i32.sub
(global.get $stack_ptr)
(i32.const 16)
)
)
)
(local.set $5
(block (result i32)
(drop
(block (result i32)
(local.set $3
(block (result i32)
(local.set $4
(i32.const 1)
)
(i32.store offset=4
(local.get $2)
(local.get $x)
)
(call $spill-call-call1
(local.get $4)
)
)
)
(i32.store offset=4
(local.get $2)
(local.get $x)
)
(call $spill-call-call0
(local.get $3)
)
)
)
(local.get $x)
)
)
(global.set $stack_ptr
(i32.add
(local.get $2)
(i32.const 16)
)
)
(local.get $5)
)
(func $spill-call-ret (param $p i32) (result i32)
(local $x i32)
(drop
(call $spill-call-call0
(return
(i32.const 1)
)
)
)
(i32.const 0)
)
(func $spill-ret-call (param $p i32) (result i32)
(local $x i32)
(drop
(return
(call $spill-call-call0
(i32.const 1)
)
)
)
(i32.const 0)
)
(func $spill-ret-ret (result i32)
(local $x i32)
(local $1 i32)
(local $2 i32)
(local $3 i32)
(global.set $stack_ptr
(local.tee $1
(i32.sub
(global.get $stack_ptr)
(i32.const 16)
)
)
)
(local.set $3
(block (result i32)
(block
(i32.store
(local.get $1)
(local.get $x)
)
(call $nothing)
)
(drop
(local.get $x)
)
(drop
(block
(global.set $stack_ptr
(i32.add
(local.get $1)
(i32.const 16)
)
)
(return
(block
(local.set $2
(i32.const 1)
)
(global.set $stack_ptr
(i32.add
(local.get $1)
(i32.const 16)
)
)
(return
(local.get $2)
)
)
)
)
)
(i32.const 0)
)
)
(global.set $stack_ptr
(i32.add
(local.get $1)
(i32.const 16)
)
)
(local.get $3)
)
(func $spill-call-othertype (param $y f64)
(local $x i32)
(local $2 i32)
(local $3 f64)
(global.set $stack_ptr
(local.tee $2
(i32.sub
(global.get $stack_ptr)
(i32.const 16)
)
)
)
(block
(block
(local.set $3
(f64.const 1)
)
(i32.store
(local.get $2)
(local.get $x)
)
(call $spill-call-othertype
(local.get $3)
)
)
(drop
(local.get $x)
)
)
(global.set $stack_ptr
(i32.add
(local.get $2)
(i32.const 16)
)
)
)
(func $spill-call_indirect
(local $x i32)
(local $1 i32)
(local $2 i32)
(local $3 i32)
(local $4 i32)
(global.set $stack_ptr
(local.tee $1
(i32.sub
(global.get $stack_ptr)
(i32.const 16)
)
)
)
(block
(block
(local.set $2
(i32.const 123)
)
(local.set $3
(i32.const 456)
)
(local.set $4
(i32.const 789)
)
(i32.store
(local.get $1)
(local.get $x)
)
(call_indirect (type $ii)
(local.get $2)
(local.get $3)
(local.get $4)
)
)
(drop
(local.get $x)
)
)
(global.set $stack_ptr
(i32.add
(local.get $1)
(i32.const 16)
)
)
)
(func $spill-call_import
(local $x i32)
(local $1 i32)
(local $2 i32)
(global.set $stack_ptr
(local.tee $1
(i32.sub
(global.get $stack_ptr)
(i32.const 16)
)
)
)
(block
(block
(local.set $2
(i32.const 200)
)
(i32.store
(local.get $1)
(local.get $x)
)
(call $segfault
(local.get $2)
)
)
(drop
(local.get $x)
)
)
(global.set $stack_ptr
(i32.add
(local.get $1)
(i32.const 16)
)
)
)
)