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:
Nick Fitzgerald
2022-12-14 16:26:45 -08:00
committed by GitHub
parent e03d65cca7
commit c0b587ac5f
198 changed files with 2494 additions and 4232 deletions

View File

@@ -154,8 +154,11 @@ pub struct TestHeap {
}
impl TestHeap {
pub fn to_ir(&self, name_to_ir_global: &BTreeMap<String, ir::GlobalValue>) -> ir::HeapData {
ir::HeapData {
pub fn to_ir(
&self,
name_to_ir_global: &BTreeMap<String, ir::GlobalValue>,
) -> cranelift_wasm::HeapData {
cranelift_wasm::HeapData {
base: name_to_ir_global[&self.base],
min_size: self.min_size.into(),
offset_guard_size: self.offset_guard_size.into(),
@@ -187,15 +190,18 @@ pub struct TestHeapStyle {
}
impl TestHeapStyle {
pub fn to_ir(&self, name_to_ir_global: &BTreeMap<String, ir::GlobalValue>) -> ir::HeapStyle {
pub fn to_ir(
&self,
name_to_ir_global: &BTreeMap<String, ir::GlobalValue>,
) -> cranelift_wasm::HeapStyle {
match self.kind.as_str() {
"static" => ir::HeapStyle::Static {
"static" => cranelift_wasm::HeapStyle::Static {
bound: match &self.bound {
toml::Value::Integer(x) => u64::try_from(*x).unwrap().into(),
_ => unreachable!(),
},
},
"dynamic" => ir::HeapStyle::Dynamic {
"dynamic" => cranelift_wasm::HeapStyle::Dynamic {
bound_gv: match &self.bound {
toml::Value::String(g) => name_to_ir_global[g],
_ => unreachable!(),

View File

@@ -49,6 +49,7 @@ impl<'data> ModuleEnvironment<'data> for ModuleEnv {
&self.inner.info,
self.inner.expected_reachability.clone(),
self.config.clone(),
self.heap_access_spectre_mitigation,
);
let func_index = FuncIndex::new(
self.inner.get_num_func_imports() + self.inner.info.function_bodies.len(),
@@ -234,6 +235,7 @@ pub struct FuncEnv<'a> {
pub config: TestConfig,
pub name_to_ir_global: BTreeMap<String, ir::GlobalValue>,
pub next_heap: usize,
pub heap_access_spectre_mitigation: bool,
}
impl<'a> FuncEnv<'a> {
@@ -241,6 +243,7 @@ impl<'a> FuncEnv<'a> {
mod_info: &'a cranelift_wasm::DummyModuleInfo,
expected_reachability: Option<cranelift_wasm::ExpectedReachability>,
config: TestConfig,
heap_access_spectre_mitigation: bool,
) -> Self {
let inner = cranelift_wasm::DummyFuncEnvironment::new(mod_info, expected_reachability);
Self {
@@ -248,6 +251,7 @@ impl<'a> FuncEnv<'a> {
config,
name_to_ir_global: Default::default(),
next_heap: 0,
heap_access_spectre_mitigation,
}
}
}
@@ -256,6 +260,10 @@ impl<'a> TargetEnvironment for FuncEnv<'a> {
fn target_config(&self) -> TargetFrontendConfig {
self.inner.target_config()
}
fn heap_access_spectre_mitigation(&self) -> bool {
self.heap_access_spectre_mitigation
}
}
impl<'a> FuncEnvironment for FuncEnv<'a> {
@@ -263,7 +271,7 @@ impl<'a> FuncEnvironment for FuncEnv<'a> {
&mut self,
func: &mut ir::Function,
index: cranelift_wasm::MemoryIndex,
) -> cranelift_wasm::WasmResult<ir::Heap> {
) -> cranelift_wasm::WasmResult<cranelift_wasm::Heap> {
if self.next_heap < self.config.heaps.len() {
let heap = &self.config.heaps[self.next_heap];
self.next_heap += 1;
@@ -311,7 +319,7 @@ impl<'a> FuncEnvironment for FuncEnv<'a> {
self.name_to_ir_global.insert(global_name.to_string(), g);
}
Ok(func.create_heap(heap.to_ir(&self.name_to_ir_global)))
Ok(self.inner.heaps.push(heap.to_ir(&self.name_to_ir_global)))
} else {
self.inner.make_heap(func, index)
}
@@ -378,7 +386,7 @@ impl<'a> FuncEnvironment for FuncEnv<'a> {
&mut self,
pos: cranelift_codegen::cursor::FuncCursor,
index: cranelift_wasm::MemoryIndex,
heap: ir::Heap,
heap: cranelift_wasm::Heap,
val: ir::Value,
) -> cranelift_wasm::WasmResult<ir::Value> {
self.inner.translate_memory_grow(pos, index, heap, val)
@@ -388,7 +396,7 @@ impl<'a> FuncEnvironment for FuncEnv<'a> {
&mut self,
pos: cranelift_codegen::cursor::FuncCursor,
index: cranelift_wasm::MemoryIndex,
heap: ir::Heap,
heap: cranelift_wasm::Heap,
) -> cranelift_wasm::WasmResult<ir::Value> {
self.inner.translate_memory_size(pos, index, heap)
}
@@ -397,9 +405,9 @@ impl<'a> FuncEnvironment for FuncEnv<'a> {
&mut self,
pos: cranelift_codegen::cursor::FuncCursor,
src_index: cranelift_wasm::MemoryIndex,
src_heap: ir::Heap,
src_heap: cranelift_wasm::Heap,
dst_index: cranelift_wasm::MemoryIndex,
dst_heap: ir::Heap,
dst_heap: cranelift_wasm::Heap,
dst: ir::Value,
src: ir::Value,
len: ir::Value,
@@ -412,7 +420,7 @@ impl<'a> FuncEnvironment for FuncEnv<'a> {
&mut self,
pos: cranelift_codegen::cursor::FuncCursor,
index: cranelift_wasm::MemoryIndex,
heap: ir::Heap,
heap: cranelift_wasm::Heap,
dst: ir::Value,
val: ir::Value,
len: ir::Value,
@@ -425,7 +433,7 @@ impl<'a> FuncEnvironment for FuncEnv<'a> {
&mut self,
pos: cranelift_codegen::cursor::FuncCursor,
index: cranelift_wasm::MemoryIndex,
heap: ir::Heap,
heap: cranelift_wasm::Heap,
seg_index: u32,
dst: ir::Value,
src: ir::Value,
@@ -574,7 +582,7 @@ impl<'a> FuncEnvironment for FuncEnv<'a> {
&mut self,
pos: cranelift_codegen::cursor::FuncCursor,
index: cranelift_wasm::MemoryIndex,
heap: ir::Heap,
heap: cranelift_wasm::Heap,
addr: ir::Value,
expected: ir::Value,
timeout: ir::Value,
@@ -587,7 +595,7 @@ impl<'a> FuncEnvironment for FuncEnv<'a> {
&mut self,
pos: cranelift_codegen::cursor::FuncCursor,
index: cranelift_wasm::MemoryIndex,
heap: ir::Heap,
heap: cranelift_wasm::Heap,
addr: ir::Value,
count: ir::Value,
) -> cranelift_wasm::WasmResult<ir::Value> {
@@ -598,4 +606,11 @@ impl<'a> FuncEnvironment for FuncEnv<'a> {
fn unsigned_add_overflow_condition(&self) -> ir::condcodes::IntCC {
self.inner.unsigned_add_overflow_condition()
}
fn heaps(
&self,
) -> &cranelift_codegen::entity::PrimaryMap<cranelift_wasm::Heap, cranelift_wasm::HeapData>
{
self.inner.heaps()
}
}