x64 and aarch64: carry MemFlags on loads/stores; don't emit trap info unless an op can trap.
This end result was previously enacted by carrying a `SourceLoc` on every load/store, which was somewhat cumbersome, and only indirectly encoded metadata about a memory reference (can it trap) by its presence or absence. We have a type for this -- `MemFlags` -- that tells us everything we might want to know about a load or store, and we should plumb it through to code emission instead. This PR attaches a `MemFlags` to an `Amode` on x64, and puts it on load and store `Inst` variants on aarch64. These two choices seem to factor things out in the nicest way: there are relatively few load/store insts on aarch64 but many addressing modes, while the opposite is true on x64.
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
//! Implementation of the standard x64 ABI.
|
||||
|
||||
use crate::ir::types::*;
|
||||
use crate::ir::{self, types, TrapCode, Type};
|
||||
use crate::ir::{self, types, MemFlags, TrapCode, Type};
|
||||
use crate::isa;
|
||||
use crate::isa::{x64::inst::*, CallConv};
|
||||
use crate::machinst::abi_impl::*;
|
||||
@@ -618,6 +618,7 @@ impl From<StackAMode> for SyntheticAmode {
|
||||
SyntheticAmode::Real(Amode::ImmReg {
|
||||
simm32,
|
||||
base: regs::rbp(),
|
||||
flags: MemFlags::trusted(),
|
||||
})
|
||||
}
|
||||
StackAMode::NominalSPOffset(off, _ty) => {
|
||||
@@ -634,6 +635,7 @@ impl From<StackAMode> for SyntheticAmode {
|
||||
SyntheticAmode::Real(Amode::ImmReg {
|
||||
simm32,
|
||||
base: regs::rsp(),
|
||||
flags: MemFlags::trusted(),
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user