Enum rustc_codegen_ssa::mir::operand::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
LayoutTypeMethods::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 LayoutTypeMethods::backend_type
.
Immediate(V)
A single LLVM immediate value.
An OperandValue
must be this variant for any type for which
LayoutTypeMethods::is_backend_immediate
returns true
.
The backend value in this variant must be the immediate backend type,
as returned by LayoutTypeMethods::immediate_backend_type
.
Pair(V, V)
A pair of immediate LLVM values. Used by fat pointers too.
An OperandValue
must be this variant for any type for which
LayoutTypeMethods::is_backend_scalar_pair
returns true
.
The backend values in this variant must be the immediate backend types,
as returned by LayoutTypeMethods::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 ConstMethods::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>
impl<V: CodegenObject> OperandValue<V>
sourcepub fn immediates_or_place(self) -> Either<ArrayVec<V, 2>, PlaceValue<V>>
pub 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.
sourcepub fn from_immediates(immediates: ArrayVec<V, 2>) -> Self
pub fn from_immediates(immediates: ArrayVec<V, 2>) -> Self
Given an array of 0/1/2 immediate values, return ZeroSized/Immediate/Pair.
sourcepub fn pointer_parts(self) -> (V, Option<V>)
pub 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.
sourcepub fn deref(self, align: Align) -> PlaceValue<V>
pub 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
.
pub(crate) fn is_expected_variant_for_type<'tcx, Cx: LayoutTypeMethods<'tcx>>( &self, cx: &Cx, ty: TyAndLayout<'tcx>, ) -> bool
source§impl<'a, 'tcx, V: CodegenObject> OperandValue<V>
impl<'a, 'tcx, V: CodegenObject> OperandValue<V>
sourcepub fn poison<Bx: BuilderMethods<'a, 'tcx, Value = V>>(
bx: &mut Bx,
layout: TyAndLayout<'tcx>,
) -> OperandValue<V>
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.
pub fn store<Bx: BuilderMethods<'a, 'tcx, Value = V>>( self, bx: &mut Bx, dest: PlaceRef<'tcx, V>, )
pub fn volatile_store<Bx: BuilderMethods<'a, 'tcx, Value = V>>( self, bx: &mut Bx, dest: PlaceRef<'tcx, V>, )
pub fn unaligned_volatile_store<Bx: BuilderMethods<'a, 'tcx, Value = V>>( self, bx: &mut Bx, dest: PlaceRef<'tcx, V>, )
pub fn nontemporal_store<Bx: BuilderMethods<'a, 'tcx, Value = V>>( self, bx: &mut Bx, dest: PlaceRef<'tcx, V>, )
pub(crate) fn store_with_flags<Bx: BuilderMethods<'a, 'tcx, Value = V>>( self, bx: &mut Bx, dest: PlaceRef<'tcx, V>, flags: MemFlags, )
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>
impl<V: Clone> Clone for OperandValue<V>
source§fn clone(&self) -> OperandValue<V>
fn clone(&self) -> OperandValue<V>
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moresource§impl<V: Debug> Debug for OperandValue<V>
impl<V: Debug> Debug for OperandValue<V>
impl<V: Copy> Copy for OperandValue<V>
Auto Trait Implementations§
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<'tcx, T> ArenaAllocatable<'tcx, IsCopy> for Twhere
T: Copy,
impl<'tcx, T> ArenaAllocatable<'tcx, IsCopy> for Twhere
T: Copy,
fn allocate_on<'a>(self, arena: &'a Arena<'tcx>) -> &'a mut T
fn allocate_from_iter<'a>( arena: &'a Arena<'tcx>, iter: impl IntoIterator<Item = T>, ) -> &'a mut [T]
source§impl<'tcx, T> ArenaAllocatable<'tcx, IsCopy> for Twhere
T: Copy,
impl<'tcx, T> ArenaAllocatable<'tcx, IsCopy> for Twhere
T: Copy,
fn allocate_on<'a>(self, arena: &'a Arena<'tcx>) -> &'a mut T
fn allocate_from_iter<'a>( arena: &'a Arena<'tcx>, iter: impl IntoIterator<Item = T>, ) -> &'a mut [T]
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)source§impl<T, R> CollectAndApply<T, R> for T
impl<T, R> CollectAndApply<T, R> for T
source§impl<T> Filterable for T
impl<T> Filterable for T
source§fn filterable(
self,
filter_name: &'static str,
) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
fn filterable( self, filter_name: &'static str, ) -> RequestFilterDataProvider<T, fn(_: DataRequest<'_>) -> bool>
source§impl<T> Instrument for T
impl<T> Instrument for T
source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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 moresource§impl<P> IntoQueryParam<P> for P
impl<P> IntoQueryParam<P> for P
fn into_query_param(self) -> P
source§impl<T> MaybeResult<T> for T
impl<T> MaybeResult<T> for T
source§impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
impl<I, T, U> Upcast<I, U> for Twhere
U: UpcastFrom<I, T>,
source§impl<I, T> UpcastFrom<I, T> for T
impl<I, T> UpcastFrom<I, T> for T
fn upcast_from(from: T, _tcx: I) -> T
source§impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
impl<Tcx, T> Value<Tcx> for Twhere
Tcx: DepContext,
default fn from_cycle_error( tcx: Tcx, cycle_error: &CycleError, _guar: ErrorGuaranteed, ) -> T
source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
impl<'a, T> Captures<'a> for Twhere
T: ?Sized,
impl<T> ErasedDestructor for Twhere
T: 'static,
impl<T> MaybeSendSync for T
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.