This makes several changes: - It adds an index_type to heap declarations, allowing heaps to specify the type for indexing. This also anticipates 64-bit heap support. - It adds a memory_type to deref global values, allowing deref globals to have types other than pointers. This is used to allow the bound variable in dynamic heaps to have type i32, to match the index type in heaps with i32 index type. - And, it fixes heap legalization to do the bounds check in the heap's index type.
46 lines
1.1 KiB
Plaintext
46 lines
1.1 KiB
Plaintext
test verifier
|
|
target x86_64
|
|
|
|
function %heap_base_type(i64 vmctx) {
|
|
gv0 = vmctx+0
|
|
gv1 = deref(gv0): i32
|
|
heap0 = static gv1, guard 0x1000, bound 0x1_0000, index_type i32 ; error: heap base has type i32, which is not the pointer type i64
|
|
|
|
ebb0(v0: i64):
|
|
return
|
|
}
|
|
|
|
function %invalid_base(i64 vmctx) {
|
|
gv0 = vmctx+0
|
|
heap0 = dynamic gv1, bound gv0, guard 0x1000, index_type i64 ; error: invalid base global value gv1
|
|
|
|
ebb0(v0: i64):
|
|
return
|
|
}
|
|
|
|
function %invalid_bound(i64 vmctx) {
|
|
gv0 = vmctx+0
|
|
heap0 = dynamic gv0, bound gv1, guard 0x1000, index_type i64 ; error: invalid bound global value gv1
|
|
|
|
ebb0(v0: i64):
|
|
return
|
|
}
|
|
|
|
function %heap_bound_type(i64 vmctx) {
|
|
gv0 = vmctx+0
|
|
gv1 = deref(gv0): i16
|
|
heap0 = dynamic gv1, bound gv1, guard 0x1000, index_type i32 ; error: heap index type i32 differs from the type of its bound, i16
|
|
|
|
ebb0(v0: i64):
|
|
return
|
|
}
|
|
|
|
function %heap_addr_index_type(i64 vmctx, i64) {
|
|
gv0 = vmctx+0
|
|
heap0 = static gv0, guard 0x1000, bound 0x1_0000, index_type i32
|
|
|
|
ebb0(v0: i64, v1: i64):
|
|
v2 = heap_addr.i64 heap0, v1, 0; error: index type i64 differs from heap index type i32
|
|
return
|
|
}
|