[][src]Struct rustc::mir::interpret::Allocation

pub struct Allocation<Tag = (), Extra = ()> {
    bytes: Vec<u8>,
    relocations: Relocations<Tag>,
    undef_mask: UndefMask,
    pub size: Size,
    pub align: Align,
    pub mutability: Mutability,
    pub extra: Extra,
}
⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

Fields

bytes: Vec<u8>
⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

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

relocations: Relocations<Tag>
⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

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.

undef_mask: UndefMask
⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

Denotes which part of this allocation is initialized.

size: Size
⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

The size of the allocation. Currently, must always equal bytes.len().

align: Align
⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

The alignment of the allocation to detect unaligned reads.

mutability: Mutability
⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

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
⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

Extra state for the machine.

Methods

impl<Tag> Allocation<Tag>[src]

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

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

Creates a read-only allocation initialized by the given bytes

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

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

pub fn undef(size: Size, align: Align) -> Self[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

impl Allocation<(), ()>[src]

pub fn with_tags_and_extra<T, E>(
    self,
    tagger: impl FnMut(AllocId) -> T,
    extra: E
) -> Allocation<T, E>
[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

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]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

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

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

Looks at a slice which may describe undefined bytes or describe a relocation. This differs from get_bytes_with_undef_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 undef_mask(&self) -> &UndefMask[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

Returns the undef mask.

pub fn relocations(&self) -> &Relocations<Tag>[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

Returns the relocation list.

impl<'tcx, Tag: Copy, Extra: AllocationExtra<Tag>> Allocation<Tag, Extra>[src]

Byte accessors.

fn check_bounds(&self, offset: Size, size: Size) -> Range<usize>[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

Just a small local helper function to avoid a bit of code repetition. Returns the range of this allocation that was meant.

fn get_bytes_internal(
    &self,
    cx: &impl HasDataLayout,
    ptr: Pointer<Tag>,
    size: Size,
    check_defined_and_ptr: bool
) -> InterpResult<'tcx, &[u8]>
[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

The last argument controls whether we error out when there are undefined or pointer bytes. You should never call this, call get_bytes or get_bytes_with_undef_and_ptr instead,

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

It is the caller's responsibility to check bounds and alignment beforehand.

pub fn get_bytes(
    &self,
    cx: &impl HasDataLayout,
    ptr: Pointer<Tag>,
    size: Size
) -> InterpResult<'tcx, &[u8]>
[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

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_undef_and_ptr(
    &self,
    cx: &impl HasDataLayout,
    ptr: Pointer<Tag>,
    size: Size
) -> InterpResult<'tcx, &[u8]>
[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

It is the caller's responsibility to handle undefined 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
) -> InterpResult<'tcx, &mut [u8]>
[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

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: Copy, Extra: AllocationExtra<Tag>> Allocation<Tag, Extra>[src]

Reading and writing.

pub fn read_c_str(
    &self,
    cx: &impl HasDataLayout,
    ptr: Pointer<Tag>
) -> InterpResult<'tcx, &[u8]>
[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

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_ptr_and_undef: bool
) -> InterpResult<'tcx>
[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

Validates that ptr.offset and ptr.offset + size do not point to the middle of a relocation. If allow_ptr_and_undef is false, also enforces that the memory in the given range contains neither relocations nor undef bytes.

pub fn write_bytes(
    &mut self,
    cx: &impl HasDataLayout,
    ptr: Pointer<Tag>,
    src: impl IntoIterator<Item = u8>
) -> InterpResult<'tcx>
[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

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
) -> InterpResult<'tcx, ScalarMaybeUndef<Tag>>
[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

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>
) -> InterpResult<'tcx, ScalarMaybeUndef<Tag>>
[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

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: ScalarMaybeUndef<Tag>,
    type_size: Size
) -> InterpResult<'tcx>
[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

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: ScalarMaybeUndef<Tag>
) -> InterpResult<'tcx>
[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

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: Copy, Extra> Allocation<Tag, Extra>[src]

Relocations.

pub fn get_relocations(
    &self,
    cx: &impl HasDataLayout,
    ptr: Pointer<Tag>,
    size: Size
) -> &[(Size, (Tag, AllocId))]
[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

Returns all relocations overlapping with the given pointer-offset pair.

fn check_relocations(
    &self,
    cx: &impl HasDataLayout,
    ptr: Pointer<Tag>,
    size: Size
) -> InterpResult<'tcx>
[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

Checks that there are no relocations overlapping with the given range.

fn clear_relocations(
    &mut self,
    cx: &impl HasDataLayout,
    ptr: Pointer<Tag>,
    size: Size
) -> InterpResult<'tcx>
[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

Removes all relocations inside the given range. If there are relocations overlapping with the edges, they are removed as well and the bytes they cover are marked as uninitialized. This is a somewhat odd "spooky action at a distance", but it allows strictly more code to run than if we would just error immediately in that case.

fn check_relocation_edges(
    &self,
    cx: &impl HasDataLayout,
    ptr: Pointer<Tag>,
    size: Size
) -> InterpResult<'tcx>
[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

Errors if there are relocations overlapping with the edges of the given memory range.

impl<'tcx, Tag, Extra> Allocation<Tag, Extra>[src]

Undefined bytes.

fn check_defined(&self, ptr: Pointer<Tag>, size: Size) -> InterpResult<'tcx>[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

Checks that a range of bytes is defined. If not, returns the ReadUndefBytes error which will report the first byte which is undefined.

pub fn mark_definedness(
    &mut self,
    ptr: Pointer<Tag>,
    size: Size,
    new_state: bool
)
[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

impl<Tag, Extra> Allocation<Tag, Extra>[src]

Transferring the definedness mask to other allocations.

pub fn compress_undef_range(
    &self,
    src: Pointer<Tag>,
    size: Size
) -> AllocationDefinedness
[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

Creates a run-length encoding of the undef mask.

pub fn mark_compressed_undef_range(
    &mut self,
    defined: &AllocationDefinedness,
    dest: Pointer<Tag>,
    size: Size,
    repeat: u64
)
[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

Applies multiple instances of the run-length encoding to the undef mask.

impl<Tag: Copy, Extra> Allocation<Tag, Extra>[src]

pub fn prepare_relocation_copy(
    &self,
    cx: &impl HasDataLayout,
    src: Pointer<Tag>,
    size: Size,
    dest: Pointer<Tag>,
    length: u64
) -> AllocationRelocations<Tag>
[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

pub fn mark_relocation_range(&mut self, relocations: AllocationRelocations<Tag>)[src]

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

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 ArenaAllocatable for Allocation[src]

impl<'tcx> ArenaField<'tcx> for Allocation[src]

impl<Tag: Clone, Extra: Clone> Clone for Allocation<Tag, Extra>[src]

impl<Tag: Debug, Extra: Debug> Debug for Allocation<Tag, Extra>[src]

impl<Tag: Decodable, Extra: Decodable> Decodable for Allocation<Tag, Extra>[src]

impl<Tag: Encodable, Extra: Encodable> Encodable for Allocation<Tag, Extra>[src]

impl<Tag: Eq, Extra: Eq> Eq for Allocation<Tag, Extra>[src]

impl<Tag: Hash, Extra: Hash> Hash for Allocation<Tag, Extra>[src]

impl<'__ctx, Tag, Extra> HashStable<StableHashingContext<'__ctx>> for Allocation<Tag, Extra> where
    Tag: HashStable<StableHashingContext<'__ctx>>,
    Extra: HashStable<StableHashingContext<'__ctx>>, 
[src]

impl<Tag: Ord, Extra: Ord> Ord for Allocation<Tag, Extra>[src]

impl<Tag: PartialEq, Extra: PartialEq> PartialEq<Allocation<Tag, Extra>> for Allocation<Tag, Extra>[src]

impl<Tag: PartialOrd, Extra: PartialOrd> PartialOrd<Allocation<Tag, Extra>> for Allocation<Tag, Extra>[src]

impl<'a, 'tcx> SpecializedDecoder<&'tcx Allocation<(), ()>> for CacheDecoder<'a, 'tcx>[src]

impl<Tag, Extra> StructuralEq for Allocation<Tag, Extra>[src]

impl<Tag, Extra> StructuralPartialEq for Allocation<Tag, Extra>[src]

impl<'tcx> UseSpecializedDecodable for &'tcx Allocation[src]

Auto Trait Implementations

impl<Tag, Extra> RefUnwindSafe for Allocation<Tag, Extra> where
    Extra: RefUnwindSafe,
    Tag: RefUnwindSafe

impl<Tag, Extra> Send for Allocation<Tag, Extra> where
    Extra: Send,
    Tag: Send

impl<Tag, Extra> Sync for Allocation<Tag, Extra> where
    Extra: Sync,
    Tag: Sync

impl<Tag, Extra> Unpin for Allocation<Tag, Extra> where
    Extra: Unpin,
    Tag: Unpin

impl<Tag, Extra> UnwindSafe for Allocation<Tag, Extra> where
    Extra: UnwindSafe,
    Tag: UnwindSafe

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> ArenaAllocatable for T where
    T: Copy
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

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

impl<T> Decodable for T where
    T: UseSpecializedDecodable
[src]

impl<T> Encodable for T where
    T: UseSpecializedEncodable + ?Sized
[src]

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

impl<T> Erased for T[src]

impl<T> From<T> for T[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T> MaybeResult<T> for T[src]

type Error = !

⚙️ This is an internal compiler API. (rustc_private)

This crate is being loaded from the sysroot, a permanently unstable location for private compiler dependencies. It is not intended for general use. Prefer using a public version of this crate from crates.io via Cargo.toml.

impl<E> SpecializationError for E[src]

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

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

The type returned in the event of a conversion error.