Memory in rustc_const_eval::interpret - Rust (original) (raw)
pub struct Memory<'tcx, M: Machine<'tcx>> {
pub(super) alloc_map: M::MemoryMap,
extra_fn_ptr_map: FxIndexMap<AllocId, M::ExtraFnVal>,
pub(super) dead_alloc_map: FxIndexMap<AllocId, (Size, Align)>,
validation_in_progress: Cell<bool>,
}
Allocations local to this instance of the interpreter. The kind helps ensure that the same mechanism is used for allocation and deallocation. When an allocation is not found here, it is a global and looked up in the tcx
for read access. Some machines may have to mutate this map even on a read-only access to a global (because they do pointer provenance tracking and the allocations in tcx
have the wrong type), so we let the machine override this type. Either way, if the machine allows writing to a global, doing so will create a copy of the global allocation here.
Map for “extra” function pointers.
To be able to compare pointers with null, and to check alignment for accesses to ZSTs (where pointers may dangle), we keep track of the size even for allocations that do not exist any more.
This stores whether we are currently doing reads purely for the purpose of validation. Those reads do not trigger the machine’s hooks for memory reads. Needless to say, this must only be set with great care!
Note: Unable to compute type layout, possibly due to this type having generic parameters. Layout can only be computed for concrete, fully-instantiated types.