With the change to the parser to preserve indices, it now inserts placeholders to pad out index spaces as needed. Placeholder functions use reserved signature indices, so skip them when writing them out, to avoid writing them out as "sig4294967295".
95 lines
2.1 KiB
Plaintext
95 lines
2.1 KiB
Plaintext
; Parser tests for call and return syntax.
|
|
test cat
|
|
|
|
function %mini() {
|
|
ebb1:
|
|
return
|
|
}
|
|
; sameln: function %mini() native {
|
|
; nextln: ebb1:
|
|
; nextln: return
|
|
; nextln: }
|
|
|
|
function %r1() -> i32, f32 spiderwasm {
|
|
ebb1:
|
|
v1 = iconst.i32 3
|
|
v2 = f32const 0.0
|
|
return v1, v2
|
|
}
|
|
; sameln: function %r1() -> i32, f32 spiderwasm {
|
|
; nextln: ebb1:
|
|
; nextln: v1 = iconst.i32 3
|
|
; nextln: v2 = f32const 0.0
|
|
; nextln: return v1, v2
|
|
; nextln: }
|
|
|
|
function %signatures() {
|
|
sig10 = ()
|
|
sig11 = (i32, f64) -> i32, b1 spiderwasm
|
|
fn5 = sig11 %foo
|
|
fn8 = function %bar(i32) -> b1
|
|
}
|
|
; sameln: function %signatures() native {
|
|
; check: sig10 = () native
|
|
; check: sig11 = (i32, f64) -> i32, b1 spiderwasm
|
|
; check: sig12 = (i32) -> b1 native
|
|
; not: fn0
|
|
; check: fn5 = sig11 %foo
|
|
; check: fn8 = sig12 %bar
|
|
; check: }
|
|
|
|
function %direct() {
|
|
fn0 = function %none()
|
|
fn1 = function %one() -> i32
|
|
fn2 = function %two() -> i32, f32
|
|
|
|
ebb0:
|
|
call fn0()
|
|
v1 = call fn1()
|
|
v2, v3 = call fn2()
|
|
return
|
|
}
|
|
; check: call fn0()
|
|
; check: v1 = call fn1()
|
|
; check: v2, v3 = call fn2()
|
|
; check: return
|
|
|
|
function %indirect(i64) {
|
|
sig0 = (i64)
|
|
sig1 = () -> i32
|
|
sig2 = () -> i32, f32
|
|
|
|
ebb0(v0: i64):
|
|
v1 = call_indirect sig1, v0()
|
|
call_indirect sig0, v1(v0)
|
|
v3, v4 = call_indirect sig2, v1()
|
|
return
|
|
}
|
|
; check: v1 = call_indirect sig1, v0()
|
|
; check: call_indirect sig0, v1(v0)
|
|
; check: v3, v4 = call_indirect sig2, v1()
|
|
; check: return
|
|
|
|
function %long_call() {
|
|
sig0 = ()
|
|
fn0 = sig0 %none
|
|
|
|
ebb0:
|
|
v0 = func_addr.i32 fn0
|
|
call_indirect sig0, v0()
|
|
return
|
|
}
|
|
; check: v0 = func_addr.i32 fn0
|
|
; check: call_indirect sig0, v0()
|
|
; check: return
|
|
|
|
; Special purpose function arguments
|
|
function %special1(i32 sret, i32 fp, i32 csr, i32 link) -> i32 link, i32 fp, i32 csr, i32 sret {
|
|
ebb0(v1: i32, v2: i32, v3: i32, v4: i32):
|
|
return v4, v2, v3, v1
|
|
}
|
|
; check: function %special1(i32 sret, i32 fp, i32 csr, i32 link) -> i32 link, i32 fp, i32 csr, i32 sret native {
|
|
; check: ebb0(v1: i32, v2: i32, v3: i32, v4: i32):
|
|
; check: return v4, v2, v3, v1
|
|
; check: }
|