Remove heaps from core Cranelift, push them into cranelift-wasm (#5386)
* cranelift-wasm: translate Wasm loads into lower-level CLIF operations
Rather than using `heap_{load,store,addr}`.
* cranelift: Remove the `heap_{addr,load,store}` instructions
These are now legalized in the `cranelift-wasm` frontend.
* cranelift: Remove the `ir::Heap` entity from CLIF
* Port basic memory operation tests to .wat filetests
* Remove test for verifying CLIF heaps
* Remove `heap_addr` from replace_branching_instructions_and_cfg_predecessors.clif test
* Remove `heap_addr` from readonly.clif test
* Remove `heap_addr` from `table_addr.clif` test
* Remove `heap_addr` from the simd-fvpromote_low.clif test
* Remove `heap_addr` from simd-fvdemote.clif test
* Remove `heap_addr` from the load-op-store.clif test
* Remove the CLIF heap runtest
* Remove `heap_addr` from the global_value.clif test
* Remove `heap_addr` from fpromote.clif runtests
* Remove `heap_addr` from fdemote.clif runtests
* Remove `heap_addr` from memory.clif parser test
* Remove `heap_addr` from reject_load_readonly.clif test
* Remove `heap_addr` from reject_load_notrap.clif test
* Remove `heap_addr` from load_readonly_notrap.clif test
* Remove `static-heap-without-guard-pages.clif` test
Will be subsumed when we port `make-heap-load-store-tests.sh` to generating
`.wat` tests.
* Remove `static-heap-with-guard-pages.clif` test
Will be subsumed when we port `make-heap-load-store-tests.sh` over to `.wat`
tests.
* Remove more heap tests
These will be subsumed by porting `make-heap-load-store-tests.sh` over to `.wat`
tests.
* Remove `heap_addr` from `simple-alias.clif` test
* Remove `heap_addr` from partial-redundancy.clif test
* Remove `heap_addr` from multiple-blocks.clif test
* Remove `heap_addr` from fence.clif test
* Remove `heap_addr` from extends.clif test
* Remove runtests that rely on heaps
Heaps are not a thing in CLIF or the interpreter anymore
* Add generated load/store `.wat` tests
* Enable memory-related wasm features in `.wat` tests
* Remove CLIF heap from fcmp-mem-bug.clif test
* Add a mode for compiling `.wat` all the way to assembly in filetests
* Also generate WAT to assembly tests in `make-load-store-tests.sh`
* cargo fmt
* Reinstate `f{de,pro}mote.clif` tests without the heap bits
* Remove undefined doc link
* Remove outdated SVG and dot file from docs
* Add docs about `None` returns for base address computation helpers
* Factor out `env.heap_access_spectre_mitigation()` to a local
* Expand docs for `FuncEnvironment::heaps` trait method
* Restore f{de,pro}mote+load clif runtests with stack memory
This commit is contained in:
@@ -374,79 +374,3 @@ pointers are always 8 bytes, and laid out sequentially in memory. Even for 32 bi
|
||||
|
||||
Currently, we only support requesting heaps, however this is a generic mechanism that should
|
||||
be able to introduce any sort of environment support that we may need later. (e.g. tables, global values, external functions)
|
||||
|
||||
##### `heap` directive
|
||||
|
||||
The `heap` directive allows a test to request a heap to be allocated and passed to the test via the environment struct.
|
||||
|
||||
|
||||
A sample heap annotation is the following:
|
||||
```
|
||||
; heap: static, size=0x1000, ptr=vmctx+0, bound=vmctx+8
|
||||
```
|
||||
|
||||
This indicates the following:
|
||||
* `static`: We have requested a non-resizable and non-movable static heap.
|
||||
* `size=0x1000`: It has to have a size of 4096 bytes.
|
||||
* `ptr=vmctx+0`: The pointer to the address to the start of this heap is placed at offset 0 in the `vmctx` struct
|
||||
* `bound=vmctx+8`: The pointer to the address to the end of this heap is placed at offset 8 in the `vmctx` struct
|
||||
|
||||
The `ptr` and `bound` arguments make explicit the placement of the pointers to the start and end of the heap memory in
|
||||
the environment struct. `vmctx+0` means that at offset 0 of the environment struct there will be the pointer to the start
|
||||
similarly, at offset 8 the pointer to the end.
|
||||
|
||||
|
||||
You can combine multiple heap annotations, in which case, their pointers are laid out sequentially in memory in
|
||||
the order that the annotations appear in the source file.
|
||||
|
||||
```
|
||||
; heap: static, size=0x1000, ptr=vmctx+0, bound=vmctx+8
|
||||
; heap: dynamic, size=0x1000, ptr=vmctx+16, bound=vmctx+24
|
||||
```
|
||||
|
||||
An invalid or unexpected offset will raise an error when the test is run.
|
||||
|
||||
See the diagram below, on how the `vmctx` struct ends up if with multiple heaps:
|
||||
|
||||
```
|
||||
┌─────────────────────┐ vmctx+0
|
||||
│heap0: start address │
|
||||
├─────────────────────┤ vmctx+8
|
||||
│heap0: end address │
|
||||
├─────────────────────┤ vmctx+16
|
||||
│heap1: start address │
|
||||
├─────────────────────┤ vmctx+24
|
||||
│heap1: end address │
|
||||
├─────────────────────┤ vmctx+32
|
||||
│etc... │
|
||||
└─────────────────────┘
|
||||
```
|
||||
|
||||
With this setup, you can now use the global values to load heaps, and load / store to them.
|
||||
|
||||
Example:
|
||||
|
||||
```
|
||||
function %heap_load_store(i64 vmctx, i64, i32) -> i32 {
|
||||
gv0 = vmctx
|
||||
gv1 = load.i64 notrap aligned gv0+0
|
||||
gv2 = load.i64 notrap aligned gv0+8
|
||||
heap0 = dynamic gv1, bound gv2, offset_guard 0, index_type i64
|
||||
|
||||
block0(v0: i64, v1: i64, v2: i32):
|
||||
v3 = heap_addr.i64 heap0, v1, 4
|
||||
store.i32 v2, v3
|
||||
v4 = load.i32 v3
|
||||
return v4
|
||||
}
|
||||
; heap: static, size=0x1000, ptr=vmctx+0, bound=vmctx+8
|
||||
; run: %heap_load_store(0, 1) == 1
|
||||
```
|
||||
|
||||
|
||||
### `test interpret`
|
||||
|
||||
Test the CLIF interpreter
|
||||
|
||||
This test supports the same commands as `test run`, but runs the code in the cranelift
|
||||
interpreter instead of the host machine.
|
||||
|
||||
Reference in New Issue
Block a user