[−][src]Struct rustc_mir::interpret::Allocation
Fields
bytes: Vec<u8>The actual bytes of the allocation. Note that the bytes of a pointer represent the offset of the pointer.
relocations: Relocations<Tag, AllocId>Maps from byte addresses to extra data for each pointer.
Only the first byte of a pointer is inserted into the map; i.e.,
every entry in this map applies to pointer_size consecutive bytes starting
at the given offset.
init_mask: InitMaskDenotes which part of this allocation is initialized.
size: SizeThe size of the allocation. Currently, must always equal bytes.len().
align: AlignThe alignment of the allocation to detect unaligned reads.
(Align guarantees that this is a power of two.)
mutability: Mutabilitytrue if the allocation is mutable.
Also used by codegen to determine if a static should be put into mutable memory,
which happens for static mut and static with interior mutability.
extra: ExtraExtra state for the machine.
Implementations
impl<Tag> Allocation<Tag, ()>[src]
pub fn from_bytes<'a>(
slice: impl Into<Cow<'a, [u8]>>,
align: Align
) -> Allocation<Tag, ()>[src]
slice: impl Into<Cow<'a, [u8]>>,
align: Align
) -> Allocation<Tag, ()>
Creates a read-only allocation initialized by the given bytes
pub fn from_byte_aligned_bytes<'a>(
slice: impl Into<Cow<'a, [u8]>>
) -> Allocation<Tag, ()>[src]
slice: impl Into<Cow<'a, [u8]>>
) -> Allocation<Tag, ()>
pub fn uninit(size: Size, align: Align) -> Allocation<Tag, ()>[src]
impl Allocation<(), ()>[src]
pub fn with_tags_and_extra<T, E>(
self,
tagger: impl FnMut(AllocId) -> T,
extra: E
) -> Allocation<T, E>[src]
self,
tagger: impl FnMut(AllocId) -> T,
extra: E
) -> Allocation<T, E>
Add Tag and Extra fields
impl<Tag, Extra> Allocation<Tag, Extra>[src]
Raw accessors. Provide access to otherwise private bytes.
pub fn len(&self) -> usize[src]
pub fn inspect_with_uninit_and_ptr_outside_interpreter(
&self,
range: Range<usize>
) -> &[u8][src]
&self,
range: Range<usize>
) -> &[u8]
Looks at a slice which may describe uninitialized bytes or describe a relocation. This differs
from get_bytes_with_uninit_and_ptr in that it does no relocation checks (even on the
edges) at all. It further ignores AllocationExtra callbacks.
This must not be used for reads affecting the interpreter execution.
pub fn init_mask(&self) -> &InitMask[src]
Returns the mask indicating which bytes are initialized.
pub fn relocations(&self) -> &Relocations<Tag, AllocId>[src]
Returns the relocation list.
impl<'tcx, Tag, Extra> Allocation<Tag, Extra> where
Extra: AllocationExtra<Tag>,
Tag: Copy, [src]
Extra: AllocationExtra<Tag>,
Tag: Copy,
Byte accessors.
pub fn get_bytes(
&self,
cx: &impl HasDataLayout,
ptr: Pointer<Tag>,
size: Size
) -> Result<&[u8], InterpErrorInfo<'tcx>>[src]
&self,
cx: &impl HasDataLayout,
ptr: Pointer<Tag>,
size: Size
) -> Result<&[u8], InterpErrorInfo<'tcx>>
Checks that these bytes are initialized and not pointer bytes, and then return them as a slice.
It is the caller's responsibility to check bounds and alignment beforehand.
Most likely, you want to use the PlaceTy and OperandTy-based methods
on InterpCx instead.
pub fn get_bytes_with_uninit_and_ptr(
&self,
cx: &impl HasDataLayout,
ptr: Pointer<Tag>,
size: Size
) -> Result<&[u8], InterpErrorInfo<'tcx>>[src]
&self,
cx: &impl HasDataLayout,
ptr: Pointer<Tag>,
size: Size
) -> Result<&[u8], InterpErrorInfo<'tcx>>
It is the caller's responsibility to handle uninitialized and pointer bytes. However, this still checks that there are no relocations on the edges.
It is the caller's responsibility to check bounds and alignment beforehand.
pub fn get_bytes_mut(
&mut self,
cx: &impl HasDataLayout,
ptr: Pointer<Tag>,
size: Size
) -> Result<&mut [u8], InterpErrorInfo<'tcx>>[src]
&mut self,
cx: &impl HasDataLayout,
ptr: Pointer<Tag>,
size: Size
) -> Result<&mut [u8], InterpErrorInfo<'tcx>>
Just calling this already marks everything as defined and removes relocations, so be sure to actually put data there!
It is the caller's responsibility to check bounds and alignment beforehand.
Most likely, you want to use the PlaceTy and OperandTy-based methods
on InterpCx instead.
impl<'tcx, Tag, Extra> Allocation<Tag, Extra> where
Extra: AllocationExtra<Tag>,
Tag: Copy, [src]
Extra: AllocationExtra<Tag>,
Tag: Copy,
Reading and writing.
pub fn read_c_str(
&self,
cx: &impl HasDataLayout,
ptr: Pointer<Tag>
) -> Result<&[u8], InterpErrorInfo<'tcx>>[src]
&self,
cx: &impl HasDataLayout,
ptr: Pointer<Tag>
) -> Result<&[u8], InterpErrorInfo<'tcx>>
Reads bytes until a 0 is encountered. Will error if the end of the allocation is reached
before a 0 is found.
Most likely, you want to call Memory::read_c_str instead of this method.
pub fn check_bytes(
&self,
cx: &impl HasDataLayout,
ptr: Pointer<Tag>,
size: Size,
allow_uninit_and_ptr: bool
) -> Result<(), InterpErrorInfo<'tcx>>[src]
&self,
cx: &impl HasDataLayout,
ptr: Pointer<Tag>,
size: Size,
allow_uninit_and_ptr: bool
) -> Result<(), InterpErrorInfo<'tcx>>
Validates that ptr.offset and ptr.offset + size do not point to the middle of a
relocation. If allow_uninit_and_ptr is false, also enforces that the memory in the
given range contains neither relocations nor uninitialized bytes.
pub fn write_bytes(
&mut self,
cx: &impl HasDataLayout,
ptr: Pointer<Tag>,
src: impl IntoIterator<Item = u8>
) -> Result<(), InterpErrorInfo<'tcx>>[src]
&mut self,
cx: &impl HasDataLayout,
ptr: Pointer<Tag>,
src: impl IntoIterator<Item = u8>
) -> Result<(), InterpErrorInfo<'tcx>>
Writes src to the memory starting at ptr.offset.
It is the caller's responsibility to check bounds and alignment beforehand.
Most likely, you want to call Memory::write_bytes instead of this method.
pub fn read_scalar(
&self,
cx: &impl HasDataLayout,
ptr: Pointer<Tag>,
size: Size
) -> Result<ScalarMaybeUninit<Tag>, InterpErrorInfo<'tcx>>[src]
&self,
cx: &impl HasDataLayout,
ptr: Pointer<Tag>,
size: Size
) -> Result<ScalarMaybeUninit<Tag>, InterpErrorInfo<'tcx>>
Reads a non-ZST scalar.
ZSTs can't be read for two reasons:
- byte-order cannot work with zero-element buffers;
- in order to obtain a
Pointer, we need to check for ZSTness anyway due to integer pointers being valid for ZSTs.
It is the caller's responsibility to check bounds and alignment beforehand.
Most likely, you want to call InterpCx::read_scalar instead of this method.
pub fn read_ptr_sized(
&self,
cx: &impl HasDataLayout,
ptr: Pointer<Tag>
) -> Result<ScalarMaybeUninit<Tag>, InterpErrorInfo<'tcx>>[src]
&self,
cx: &impl HasDataLayout,
ptr: Pointer<Tag>
) -> Result<ScalarMaybeUninit<Tag>, InterpErrorInfo<'tcx>>
Reads a pointer-sized scalar.
It is the caller's responsibility to check bounds and alignment beforehand.
Most likely, you want to call InterpCx::read_scalar instead of this method.
pub fn write_scalar(
&mut self,
cx: &impl HasDataLayout,
ptr: Pointer<Tag>,
val: ScalarMaybeUninit<Tag>,
type_size: Size
) -> Result<(), InterpErrorInfo<'tcx>>[src]
&mut self,
cx: &impl HasDataLayout,
ptr: Pointer<Tag>,
val: ScalarMaybeUninit<Tag>,
type_size: Size
) -> Result<(), InterpErrorInfo<'tcx>>
Writes a non-ZST scalar.
ZSTs can't be read for two reasons:
- byte-order cannot work with zero-element buffers;
- in order to obtain a
Pointer, we need to check for ZSTness anyway due to integer pointers being valid for ZSTs.
It is the caller's responsibility to check bounds and alignment beforehand.
Most likely, you want to call InterpCx::write_scalar instead of this method.
pub fn write_ptr_sized(
&mut self,
cx: &impl HasDataLayout,
ptr: Pointer<Tag>,
val: ScalarMaybeUninit<Tag>
) -> Result<(), InterpErrorInfo<'tcx>>[src]
&mut self,
cx: &impl HasDataLayout,
ptr: Pointer<Tag>,
val: ScalarMaybeUninit<Tag>
) -> Result<(), InterpErrorInfo<'tcx>>
Writes a pointer-sized scalar.
It is the caller's responsibility to check bounds and alignment beforehand.
Most likely, you want to call InterpCx::write_scalar instead of this method.
impl<'tcx, Tag, Extra> Allocation<Tag, Extra> where
Tag: Copy, [src]
Tag: Copy,
Relocations.
pub fn get_relocations(
&self,
cx: &impl HasDataLayout,
ptr: Pointer<Tag>,
size: Size
) -> &[(Size, (Tag, AllocId))][src]
&self,
cx: &impl HasDataLayout,
ptr: Pointer<Tag>,
size: Size
) -> &[(Size, (Tag, AllocId))]
Returns all relocations overlapping with the given pointer-offset pair.
impl<'tcx, Tag, Extra> Allocation<Tag, Extra> where
Tag: Copy, [src]
Tag: Copy,
Uninitialized bytes.
impl<Tag, Extra> Allocation<Tag, Extra>[src]
Transferring the initialization mask to other allocations.
pub fn compress_uninit_range(
&self,
src: Pointer<Tag>,
size: Size
) -> InitMaskCompressed[src]
&self,
src: Pointer<Tag>,
size: Size
) -> InitMaskCompressed
Creates a run-length encoding of the initialization mask.
pub fn mark_compressed_init_range(
&mut self,
defined: &InitMaskCompressed,
dest: Pointer<Tag>,
size: Size,
repeat: u64
)[src]
&mut self,
defined: &InitMaskCompressed,
dest: Pointer<Tag>,
size: Size,
repeat: u64
)
Applies multiple instances of the run-length encoding to the initialization mask.
impl<Tag, Extra> Allocation<Tag, Extra> where
Tag: Copy, [src]
Tag: Copy,
pub fn prepare_relocation_copy(
&self,
cx: &impl HasDataLayout,
src: Pointer<Tag>,
size: Size,
dest: Pointer<Tag>,
length: u64
) -> AllocationRelocations<Tag>[src]
&self,
cx: &impl HasDataLayout,
src: Pointer<Tag>,
size: Size,
dest: Pointer<Tag>,
length: u64
) -> AllocationRelocations<Tag>
pub fn mark_relocation_range(&mut self, relocations: AllocationRelocations<Tag>)[src]
Applies a relocation copy.
The affected range, as defined in the parameters to prepare_relocation_copy is expected
to be clear of relocations.
Trait Implementations
impl<Tag, Extra> Clone for Allocation<Tag, Extra> where
Extra: Clone,
Tag: Clone, [src]
Extra: Clone,
Tag: Clone,
fn clone(&self) -> Allocation<Tag, Extra>[src]
fn clone_from(&mut self, source: &Self)1.0.0[src]
impl<Tag, Extra> Debug for Allocation<Tag, Extra> where
Extra: Debug,
Tag: Debug, [src]
Extra: Debug,
Tag: Debug,
impl<Tag, Extra> Eq for Allocation<Tag, Extra> where
Extra: Eq,
Tag: Eq, [src]
Extra: Eq,
Tag: Eq,
impl<Tag, Extra> Hash for Allocation<Tag, Extra> where
Extra: Hash,
Tag: Hash, [src]
Extra: Hash,
Tag: Hash,
fn hash<__H>(&self, state: &mut __H) where
__H: Hasher, [src]
__H: Hasher,
fn hash_slice<H>(data: &[Self], state: &mut H) where
H: Hasher, 1.3.0[src]
H: Hasher,
impl<Tag, Extra> Ord for Allocation<Tag, Extra> where
Extra: Ord,
Tag: Ord, [src]
Extra: Ord,
Tag: Ord,
fn cmp(&self, other: &Allocation<Tag, Extra>) -> Ordering[src]
#[must_use]fn max(self, other: Self) -> Self1.21.0[src]
#[must_use]fn min(self, other: Self) -> Self1.21.0[src]
#[must_use]fn clamp(self, min: Self, max: Self) -> Self[src]
impl<Tag, Extra> PartialEq<Allocation<Tag, Extra>> for Allocation<Tag, Extra> where
Extra: PartialEq<Extra>,
Tag: PartialEq<Tag>, [src]
Extra: PartialEq<Extra>,
Tag: PartialEq<Tag>,
fn eq(&self, other: &Allocation<Tag, Extra>) -> bool[src]
fn ne(&self, other: &Allocation<Tag, Extra>) -> bool[src]
impl<Tag, Extra> PartialOrd<Allocation<Tag, Extra>> for Allocation<Tag, Extra> where
Extra: PartialOrd<Extra>,
Tag: PartialOrd<Tag>, [src]
Extra: PartialOrd<Extra>,
Tag: PartialOrd<Tag>,
fn partial_cmp(&self, other: &Allocation<Tag, Extra>) -> Option<Ordering>[src]
fn lt(&self, other: &Allocation<Tag, Extra>) -> bool[src]
fn le(&self, other: &Allocation<Tag, Extra>) -> bool[src]
fn gt(&self, other: &Allocation<Tag, Extra>) -> bool[src]
fn ge(&self, other: &Allocation<Tag, Extra>) -> bool[src]
Auto Trait Implementations
impl<Tag, Extra> RefUnwindSafe for Allocation<Tag, Extra> where
Extra: RefUnwindSafe,
Tag: RefUnwindSafe,
Extra: RefUnwindSafe,
Tag: RefUnwindSafe,
impl<Tag, Extra> Send for Allocation<Tag, Extra> where
Extra: Send,
Tag: Send,
Extra: Send,
Tag: Send,
impl<Tag, Extra> Sync for Allocation<Tag, Extra> where
Extra: Sync,
Tag: Sync,
Extra: Sync,
Tag: Sync,
impl<Tag, Extra> Unpin for Allocation<Tag, Extra> where
Extra: Unpin,
Tag: Unpin,
Extra: Unpin,
Tag: Unpin,
impl<Tag, Extra> UnwindSafe for Allocation<Tag, Extra> where
Extra: UnwindSafe,
Tag: UnwindSafe,
Extra: UnwindSafe,
Tag: UnwindSafe,
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized, [src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized, [src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized, [src]
T: ?Sized,
fn borrow_mut(&mut self) -> &mut T[src]
impl<T> From<T> for T[src]
impl<T, U> Into<U> for T where
U: From<T>, [src]
U: From<T>,
impl<T> ToOwned for T where
T: Clone, [src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
fn to_owned(&self) -> T[src]
fn clone_into(&self, target: &mut T)[src]
impl<T, U> TryFrom<U> for T where
U: Into<T>, [src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>, [src]
U: TryFrom<T>,
type Error = <U as TryFrom<T>>::Error
The type returned in the event of a conversion error.