These addresses will allow referencing C/C++/Rust-style global variables by name directly.
81 lines
2.1 KiB
Plaintext
81 lines
2.1 KiB
Plaintext
test cat
|
|
test verifier
|
|
|
|
function %vmglobal() -> i32 {
|
|
gv3 = vmctx+16
|
|
; check: $gv3 = vmctx+16
|
|
gv4 = vmctx+0
|
|
; check: $gv4 = vmctx
|
|
; not: +0
|
|
gv5 = vmctx -256
|
|
; check: $gv5 = vmctx-256
|
|
ebb0:
|
|
v1 = global_addr.i32 gv3
|
|
; check: $v1 = global_addr.i32 $gv3
|
|
return v1
|
|
}
|
|
|
|
function %deref() -> i32 {
|
|
gv3 = vmctx+16
|
|
gv4 = deref(gv3)-32
|
|
; check: $gv4 = deref($gv3)-32
|
|
ebb0:
|
|
v1 = global_addr.i32 gv4
|
|
; check: $v1 = global_addr.i32 $gv4
|
|
return v1
|
|
}
|
|
|
|
; Refer to a global variable before it's been declared.
|
|
function %backref() -> i32 {
|
|
gv1 = deref(gv2)-32
|
|
; check: $gv1 = deref($gv2)-32
|
|
gv2 = vmctx+16
|
|
; check: $gv2 = vmctx+16
|
|
ebb0:
|
|
v1 = global_addr.i32 gv1
|
|
return v1
|
|
}
|
|
|
|
function %sym() -> i32 {
|
|
gv0 = globalsym %something
|
|
; check: $gv0 = globalsym %something
|
|
gv1 = globalsym #d0bad180d0b5d182d0bed0bd
|
|
; check: $gv1 = globalsym #d0bad180d0b5d182d0bed0bd
|
|
ebb0:
|
|
v0 = global_addr.i32 gv0
|
|
; check: $v0 = global_addr.i32 $gv0
|
|
v1 = global_addr.i32 gv1
|
|
; check: $v1 = global_addr.i32 $gv1
|
|
v2 = bxor v0, v1
|
|
return v2
|
|
}
|
|
|
|
; Declare static heaps.
|
|
function %sheap(i32) -> i64 {
|
|
heap1 = static reserved_reg, min 0x1_0000, bound 0x1_0000_0000, guard 0x8000_0000
|
|
heap2 = static gv5, guard 0x1000, bound 0x1_0000
|
|
gv5 = vmctx+64
|
|
|
|
; check: $heap1 = static reserved_reg, min 0x0001_0000, bound 0x0001_0000_0000, guard 0x8000_0000
|
|
; check: $heap2 = static $gv5, min 0, bound 0x0001_0000, guard 4096
|
|
ebb0(v1: i32):
|
|
v2 = heap_addr.i64 heap1, v1, 0
|
|
; check: $v2 = heap_addr.i64 $heap1, $v1, 0
|
|
return v2
|
|
}
|
|
|
|
; Declare dynamic heaps.
|
|
function %dheap(i32) -> i64 {
|
|
heap1 = dynamic reserved_reg, min 0x1_0000, bound gv6, guard 0x8000_0000
|
|
heap2 = dynamic gv5, bound gv6, guard 0x1000
|
|
gv5 = vmctx+64
|
|
gv6 = vmctx+72
|
|
|
|
; check: $heap1 = dynamic reserved_reg, min 0x0001_0000, bound $gv6, guard 0x8000_0000
|
|
; check: $heap2 = dynamic $gv5, min 0, bound $gv6, guard 4096
|
|
ebb0(v1: i32):
|
|
v2 = heap_addr.i64 heap2, v1, 0
|
|
; check: $v2 = heap_addr.i64 $heap2, $v1, 0
|
|
return v2
|
|
}
|