rustc_codegen_ssa::mir::operand

Enum OperandValue

Source
pub enum OperandValue<V> {
    Ref(PlaceValue<V>),
    Immediate(V),
    Pair(V, V),
    ZeroSized,
}
Expand description

The representation of a Rust value. The enum variant is in fact uniquely determined by the value’s type, but is kept as a safety check.

Variants§

§

Ref(PlaceValue<V>)

A reference to the actual operand. The data is guaranteed to be valid for the operand’s lifetime. The second value, if any, is the extra data (vtable or length) which indicates that it refers to an unsized rvalue.

An OperandValue must be this variant for any type for which LayoutTypeCodegenMethods::is_backend_ref returns true. (That basically amounts to “isn’t one of the other variants”.)

This holds a PlaceValue (like a PlaceRef does) with a pointer to the location holding the value. The type behind that pointer is the one returned by LayoutTypeCodegenMethods::backend_type.

§

Immediate(V)

A single LLVM immediate value.

An OperandValue must be this variant for any type for which LayoutTypeCodegenMethods::is_backend_immediate returns true. The backend value in this variant must be the immediate backend type, as returned by LayoutTypeCodegenMethods::immediate_backend_type.

§

Pair(V, V)

A pair of immediate LLVM values. Used by wide pointers too.

An OperandValue must be this variant for any type for which LayoutTypeCodegenMethods::is_backend_scalar_pair returns true. The backend values in this variant must be the immediate backend types, as returned by LayoutTypeCodegenMethods::scalar_pair_element_backend_type with immediate: true.

§

ZeroSized

A value taking no bytes, and which therefore needs no LLVM value at all.

If you ever need a V to pass to something, get a fresh poison value from ConstCodegenMethods::const_poison.

An OperandValue must be this variant for any type for which is_zst on its Layout returns true. Note however that these values can still require alignment.

Implementations§

Source§

impl<V: CodegenObject> OperandValue<V>

Source

pub(crate) fn immediates_or_place(self) -> Either<ArrayVec<V, 2>, PlaceValue<V>>

If this is ZeroSized/Immediate/Pair, return an array of the 0/1/2 values. If this is Ref, return the place.

Source

pub(crate) fn from_immediates(immediates: ArrayVec<V, 2>) -> Self

Given an array of 0/1/2 immediate values, return ZeroSized/Immediate/Pair.

Source

pub(crate) fn pointer_parts(self) -> (V, Option<V>)

Treat this value as a pointer and return the data pointer and optional metadata as backend values.

If you’re making a place, use Self::deref instead.

Source

pub(crate) fn deref(self, align: Align) -> PlaceValue<V>

Treat this value as a pointer and return the place to which it points.

The pointer immediate doesn’t inherently know its alignment, so you need to pass it in. If you want to get it from a type’s ABI alignment, then maybe you want OperandRef::deref instead.

This is the inverse of PlaceValue::address.

Source

pub(crate) fn is_expected_variant_for_type<'tcx, Cx: LayoutTypeCodegenMethods<'tcx>>( &self, cx: &Cx, ty: TyAndLayout<'tcx>, ) -> bool

Source§

impl<'a, 'tcx, V: CodegenObject> OperandValue<V>

Source

pub fn poison<Bx: BuilderMethods<'a, 'tcx, Value = V>>( bx: &mut Bx, layout: TyAndLayout<'tcx>, ) -> OperandValue<V>

Returns an OperandValue that’s generally UB to use in any way.

Depending on the layout, returns ZeroSized for ZSTs, an Immediate or Pair containing poison value(s), or a Ref containing a poison pointer.

Supports sized types only.

Source

pub fn store<Bx: BuilderMethods<'a, 'tcx, Value = V>>( self, bx: &mut Bx, dest: PlaceRef<'tcx, V>, )

Source

pub fn volatile_store<Bx: BuilderMethods<'a, 'tcx, Value = V>>( self, bx: &mut Bx, dest: PlaceRef<'tcx, V>, )

Source

pub fn unaligned_volatile_store<Bx: BuilderMethods<'a, 'tcx, Value = V>>( self, bx: &mut Bx, dest: PlaceRef<'tcx, V>, )

Source

pub fn nontemporal_store<Bx: BuilderMethods<'a, 'tcx, Value = V>>( self, bx: &mut Bx, dest: PlaceRef<'tcx, V>, )

Source

pub(crate) fn store_with_flags<Bx: BuilderMethods<'a, 'tcx, Value = V>>( self, bx: &mut Bx, dest: PlaceRef<'tcx, V>, flags: MemFlags, )

Source

pub fn store_unsized<Bx: BuilderMethods<'a, 'tcx, Value = V>>( self, bx: &mut Bx, indirect_dest: PlaceRef<'tcx, V>, )

Trait Implementations§

Source§

impl<V: Clone> Clone for OperandValue<V>

Source§

fn clone(&self) -> OperandValue<V>

Returns a copy of the value. Read more
1.0.0 · Source§

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

Performs copy-assignment from source. Read more
Source§

impl<V: Debug> Debug for OperandValue<V>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<V: Copy> Copy for OperandValue<V>

Auto Trait Implementations§

§

impl<V> DynSend for OperandValue<V>
where V: DynSend,

§

impl<V> DynSync for OperandValue<V>
where V: DynSync,

§

impl<V> Freeze for OperandValue<V>
where V: Freeze,

§

impl<V> RefUnwindSafe for OperandValue<V>
where V: RefUnwindSafe,

§

impl<V> Send for OperandValue<V>
where V: Send,

§

impl<V> Sync for OperandValue<V>
where V: Sync,

§

impl<V> Unpin for OperandValue<V>
where V: Unpin,

§

impl<V> UnwindSafe for OperandValue<V>
where V: 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<'tcx, T> ArenaAllocatable<'tcx, IsCopy> for T
where T: Copy,

Source§

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

Source§

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

Source§

impl<'tcx, T> ArenaAllocatable<'tcx, IsCopy> for T
where T: Copy,

Source§

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

Source§

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

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