flowistry_pdg::rustc::mir

Enum ConstValue

Source
pub enum ConstValue<'tcx> {
    Scalar(Scalar),
    ZeroSized,
    Slice {
        data: ConstAllocation<'tcx>,
        meta: u64,
    },
    Indirect {
        alloc_id: AllocId,
        offset: Size,
    },
}
Expand description

Represents a constant value in Rust. Scalar and Slice are optimizations for array length computations, enum discriminants and the pattern matching logic.

Variants§

§

Scalar(Scalar)

Used for types with layout::abi::Scalar ABI.

Not using the enum Value to encode that this must not be Uninit.

§

ZeroSized

Only for ZSTs.

§

Slice

Used for references to unsized types with slice tail.

This is worth an optimized representation since Rust has literals of type &str and &[u8]. Not having to indirect those through an AllocId (or two, if we used Indirect) has shown measurable performance improvements on stress tests. We then reuse this optimization for slice-tail types more generally during valtree-to-constval conversion.

Fields

§data: ConstAllocation<'tcx>

The allocation storing the slice contents. This always points to the beginning of the allocation.

§meta: u64

The metadata field of the reference. This is a “target usize”, so we use u64 as in the interpreter.

§

Indirect

A value not representable by the other variants; needs to be stored in-memory.

Must not be used for scalars or ZST, but having &str or other slices in this variant is fine.

Fields

§alloc_id: AllocId

The backing memory of the value. May contain more memory than needed for just the value if this points into some other larger ConstValue.

We use an AllocId here instead of a ConstAllocation<'tcx> to make sure that when a raw constant (which is basically just an AllocId) is turned into a ConstValue and back, we can preserve the original AllocId.

§offset: Size

Offset into alloc

Auto Trait Implementations§

§

impl<'tcx> Freeze for ConstValue<'tcx>

§

impl<'tcx> RefUnwindSafe for ConstValue<'tcx>

§

impl<'tcx> Send for ConstValue<'tcx>

§

impl<'tcx> Sync for ConstValue<'tcx>

§

impl<'tcx> Unpin for ConstValue<'tcx>

§

impl<'tcx> UnwindSafe for ConstValue<'tcx>

Blanket Implementations§

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> 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 u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. 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<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> 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.