rustc_middle::mir::interpret

Struct Allocation

source
pub struct Allocation<Prov: Provenance = CtfeProvenance, Extra = (), Bytes = Box<[u8]>> {
    bytes: Bytes,
    provenance: ProvenanceMap<Prov>,
    init_mask: InitMask,
    pub align: Align,
    pub mutability: Mutability,
    pub extra: Extra,
}
Expand description

This type represents an Allocation in the Miri/CTFE core engine.

Its public API is rather low-level, working directly with allocation offsets and a custom error type to account for the lack of an AllocId on this level. The Miri/CTFE core engine memory module provides higher-level access.

Fields§

§bytes: Bytes

The actual bytes of the allocation. Note that the bytes of a pointer represent the offset of the pointer.

§provenance: ProvenanceMap<Prov>

Maps from byte addresses to extra provenance 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: InitMask

Denotes which part of this allocation is initialized.

§align: Align

The alignment of the allocation to detect unaligned reads. (Align guarantees that this is a power of two.)

§mutability: Mutability

true 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: Extra

Extra state for the machine.

Implementations§

source§

impl<Prov: Provenance, Bytes: AllocBytes> Allocation<Prov, (), Bytes>

source

pub fn from_bytes<'a>( slice: impl Into<Cow<'a, [u8]>>, align: Align, mutability: Mutability, ) -> Self

Creates an allocation initialized by the given bytes

source

pub fn from_bytes_byte_aligned_immutable<'a>( slice: impl Into<Cow<'a, [u8]>>, ) -> Self

source

fn uninit_inner<R>( size: Size, align: Align, fail: impl FnOnce() -> R, ) -> Result<Self, R>

source

pub fn try_uninit<'tcx>(size: Size, align: Align) -> InterpResult<'tcx, Self>

Try to create an Allocation of size bytes, failing if there is not enough memory available to the compiler to do so.

source

pub fn uninit(size: Size, align: Align) -> Self

Try to create an Allocation of size bytes, panics if there is not enough memory available to the compiler to do so.

Example use case: To obtain an Allocation filled with specific data, first call this function and then call write_scalar to fill in the right data.

source

pub fn with_extra<Extra>(self, extra: Extra) -> Allocation<Prov, Extra, Bytes>

Add the extra.

source§

impl Allocation

source

pub fn adjust_from_tcx<'tcx, Prov: Provenance, Bytes: AllocBytes>( &self, cx: &impl HasDataLayout, alloc_bytes: impl FnMut(&[u8], Align) -> InterpResult<'tcx, Bytes>, adjust_ptr: impl FnMut(Pointer<CtfeProvenance>) -> InterpResult<'tcx, Pointer<Prov>>, ) -> InterpResult<'tcx, Allocation<Prov, (), Bytes>>

Adjust allocation from the ones in tcx to a custom Machine instance with a different Provenance and Byte type.

source§

impl<Prov: Provenance, Extra, Bytes: AllocBytes> Allocation<Prov, Extra, Bytes>

Raw accessors. Provide access to otherwise private bytes.

source

pub fn len(&self) -> usize

source

pub fn size(&self) -> Size

source

pub fn inspect_with_uninit_and_ptr_outside_interpreter( &self, range: Range<usize>, ) -> &[u8]

Looks at a slice which may contain uninitialized bytes or provenance. This differs from get_bytes_with_uninit_and_ptr in that it does no provenance checks (even on the edges) at all. This must not be used for reads affecting the interpreter execution.

source

pub fn init_mask(&self) -> &InitMask

Returns the mask indicating which bytes are initialized.

source

pub fn provenance(&self) -> &ProvenanceMap<Prov>

Returns the provenance map.

source§

impl<Prov: Provenance, Extra, Bytes: AllocBytes> Allocation<Prov, Extra, Bytes>

Byte accessors.

source

pub fn get_bytes_unchecked(&self, range: AllocRange) -> &[u8]

This is the entirely abstraction-violating way to just grab the raw bytes without caring about provenance or initialization.

This function also guarantees that the resulting pointer will remain stable even when new allocations are pushed to the HashMap. mem_copy_repeatedly relies on that.

source

pub fn get_bytes_strip_provenance( &self, cx: &impl HasDataLayout, range: AllocRange, ) -> AllocResult<&[u8]>

Checks that these bytes are initialized, and then strip provenance (if possible) and return them.

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.

source

pub fn get_bytes_unchecked_for_overwrite( &mut self, cx: &impl HasDataLayout, range: AllocRange, ) -> AllocResult<&mut [u8]>

This is the entirely abstraction-violating way to just get mutable access to the raw bytes. Just calling this already marks everything as defined and removes provenance, so be sure to actually overwrite all the 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.

source

pub fn get_bytes_unchecked_for_overwrite_ptr( &mut self, cx: &impl HasDataLayout, range: AllocRange, ) -> AllocResult<*mut [u8]>

A raw pointer variant of get_bytes_unchecked_for_overwrite that avoids invalidating existing immutable aliases into this memory.

source

pub fn get_bytes_unchecked_raw_mut(&mut self) -> *mut u8

This gives direct mutable access to the entire buffer, just exposing their internal state without resetting anything. Directly exposes AllocBytes::as_mut_ptr. Only works if OFFSET_IS_ADDR is true.

source

pub fn get_bytes_unchecked_raw(&self) -> *const u8

This gives direct immutable access to the entire buffer, just exposing their internal state without resetting anything. Directly exposes AllocBytes::as_ptr. Only works if OFFSET_IS_ADDR is true.

source§

impl<Prov: Provenance, Extra, Bytes: AllocBytes> Allocation<Prov, Extra, Bytes>

Reading and writing.

source

fn mark_init(&mut self, range: AllocRange, is_init: bool)

Sets the init bit for the given range.

source

pub fn read_scalar( &self, cx: &impl HasDataLayout, range: AllocRange, read_provenance: bool, ) -> AllocResult<Scalar<Prov>>

Reads a non-ZST scalar.

If read_provenance is true, this will also read provenance; otherwise (if the machine supports that) provenance is entirely ignored.

ZSTs can’t be read because 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.

source

pub fn write_scalar( &mut self, cx: &impl HasDataLayout, range: AllocRange, val: Scalar<Prov>, ) -> AllocResult

Writes a non-ZST scalar.

ZSTs can’t be read because 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.

source

pub fn write_uninit( &mut self, cx: &impl HasDataLayout, range: AllocRange, ) -> AllocResult

Write “uninit” to the given memory range.

source

pub fn clear_provenance( &mut self, cx: &impl HasDataLayout, range: AllocRange, ) -> AllocResult

Remove all provenance in the given memory range.

source

pub fn provenance_apply_copy(&mut self, copy: ProvenanceCopy<Prov>)

Applies a previously prepared provenance copy. The affected range, as defined in the parameters to provenance().prepare_copy is expected to be clear of provenance.

This is dangerous to use as it can violate internal Allocation invariants! It only exists to support an efficient implementation of mem_copy_repeatedly.

source

pub fn init_mask_apply_copy( &mut self, copy: InitCopy, range: AllocRange, repeat: u64, )

Applies a previously prepared copy of the init mask.

This is dangerous to use as it can violate internal Allocation invariants! It only exists to support an efficient implementation of mem_copy_repeatedly.

Trait Implementations§

source§

impl<'tcx> ArenaAllocatable<'tcx> for Allocation

source§

fn allocate_on(self, arena: &'tcx Arena<'tcx>) -> &'tcx mut Self

source§

fn allocate_from_iter( arena: &'tcx Arena<'tcx>, iter: impl IntoIterator<Item = Self>, ) -> &'tcx mut [Self]

source§

impl<'tcx> Borrow<Allocation> for InternedInSet<'tcx, Allocation>

source§

fn borrow<'a>(&'a self) -> &'a Allocation

Immutably borrows from an owned value. Read more
source§

impl<Prov: Clone + Provenance, Extra: Clone, Bytes: Clone> Clone for Allocation<Prov, Extra, Bytes>

source§

fn clone(&self) -> Allocation<Prov, Extra, Bytes>

Returns a copy of the value. Read more
source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<Prov: Provenance, Extra, Bytes, __D: TyDecoder> Decodable<__D> for Allocation<Prov, Extra, Bytes>
where Bytes: Decodable<__D>, ProvenanceMap<Prov>: Decodable<__D>, Extra: Decodable<__D>,

source§

fn decode(__decoder: &mut __D) -> Self

source§

impl<Prov: Provenance, Extra, Bytes, __E: TyEncoder> Encodable<__E> for Allocation<Prov, Extra, Bytes>
where Bytes: Encodable<__E>, ProvenanceMap<Prov>: Encodable<__E>, Extra: Encodable<__E>,

source§

fn encode(&self, __encoder: &mut __E)

source§

impl Hash for Allocation

source§

fn hash<H: Hasher>(&self, state: &mut H)

Feeds this value into the given Hasher. Read more
source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
source§

impl<'__ctx, Prov, Extra, Bytes> HashStable<StableHashingContext<'__ctx>> for Allocation<Prov, Extra, Bytes>

source§

fn hash_stable( &self, __hcx: &mut StableHashingContext<'__ctx>, __hasher: &mut StableHasher, )

source§

impl<Prov: PartialEq + Provenance, Extra: PartialEq, Bytes: PartialEq> PartialEq for Allocation<Prov, Extra, Bytes>

source§

fn eq(&self, other: &Allocation<Prov, Extra, Bytes>) -> bool

Tests for self and other values to be equal, and is used by ==.
source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<Prov: Eq + Provenance, Extra: Eq, Bytes: Eq> Eq for Allocation<Prov, Extra, Bytes>

source§

impl<Prov: Provenance, Extra, Bytes> StructuralPartialEq for Allocation<Prov, Extra, Bytes>

Auto Trait Implementations§

§

impl<Prov, Extra, Bytes> DynSend for Allocation<Prov, Extra, Bytes>
where Bytes: DynSend, Extra: DynSend, Prov: DynSend,

§

impl<Prov, Extra, Bytes> DynSync for Allocation<Prov, Extra, Bytes>
where Bytes: DynSync, Extra: DynSync, Prov: DynSync,

§

impl<Prov, Extra, Bytes> Freeze for Allocation<Prov, Extra, Bytes>
where Bytes: Freeze, Extra: Freeze,

§

impl<Prov, Extra, Bytes> RefUnwindSafe for Allocation<Prov, Extra, Bytes>
where Bytes: RefUnwindSafe, Extra: RefUnwindSafe, Prov: RefUnwindSafe,

§

impl<Prov, Extra, Bytes> Send for Allocation<Prov, Extra, Bytes>
where Bytes: Send, Extra: Send, Prov: Send,

§

impl<Prov, Extra, Bytes> Sync for Allocation<Prov, Extra, Bytes>
where Bytes: Sync, Extra: Sync, Prov: Sync,

§

impl<Prov, Extra, Bytes> Unpin for Allocation<Prov, Extra, Bytes>
where Bytes: Unpin, Extra: Unpin, Prov: Unpin,

§

impl<Prov, Extra, Bytes> UnwindSafe for Allocation<Prov, Extra, Bytes>
where Bytes: UnwindSafe, Extra: UnwindSafe, Prov: UnwindSafe,

Blanket Implementations§

source§

impl<T> Aligned for T

source§

const ALIGN: Alignment = _

Alignment of Self.
source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> AnyEq for T
where T: Any + PartialEq,

source§

fn equals(&self, other: &(dyn Any + 'static)) -> bool

source§

fn as_any(&self) -> &(dyn Any + 'static)

source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> CloneToUninit for T
where T: Clone,

source§

unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T, R> CollectAndApply<T, R> for T

source§

fn collect_and_apply<I, F>(iter: I, f: F) -> R
where I: Iterator<Item = T>, F: FnOnce(&[T]) -> R,

Equivalent to f(&iter.collect::<Vec<_>>()).

source§

type Output = R

source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
source§

impl<T> Filterable for T

source§

fn filterable( self, filter_name: &'static str, ) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>

Creates a filterable data provider with the given name for debugging. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> Instrument for T

source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> IntoEither for T

source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
source§

impl<P> IntoQueryParam<P> for P

source§

impl<T> MaybeResult<T> for T

source§

type Error = !

source§

fn from(_: Result<T, <T as MaybeResult<T>>::Error>) -> T

source§

fn to_result(self) -> Result<T, <T as MaybeResult<T>>::Error>

source§

impl<T> Pointable for T

source§

const ALIGN: usize = _

The alignment of pointer.
source§

type Init = T

The type for initializers.
source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> Same for T

source§

type Output = T

Should always be Self
source§

impl<T> ToOwned for T
where T: Clone,

source§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
source§

impl<I, T, U> Upcast<I, U> for T
where U: UpcastFrom<I, T>,

source§

fn upcast(self, interner: I) -> U

source§

impl<I, T> UpcastFrom<I, T> for T

source§

fn upcast_from(from: T, _tcx: I) -> T

source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

source§

fn vzip(self) -> V

source§

impl<Tcx, T> Value<Tcx> for T
where Tcx: DepContext,

source§

default fn from_cycle_error( tcx: Tcx, cycle_error: &CycleError, _guar: ErrorGuaranteed, ) -> T

source§

impl<T> WithSubscriber for T

source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
source§

impl<'a, T> Captures<'a> for T
where T: ?Sized,

source§

impl<T> ErasedDestructor for T
where T: 'static,

source§

impl<T> MaybeSendSync for T
where T: Send + Sync,

Layout§

Note: Unable to compute type layout, possibly due to this type having generic parameters. Layout can only be computed for concrete, fully-instantiated types.