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>
impl<V: CodegenObject> OperandValue<V>
Sourcepub(crate) fn immediates_or_place(self) -> Either<ArrayVec<V, 2>, PlaceValue<V>>
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.
Sourcepub(crate) fn from_immediates(immediates: ArrayVec<V, 2>) -> Self
pub(crate) fn from_immediates(immediates: ArrayVec<V, 2>) -> Self
Given an array of 0/1/2 immediate values, return ZeroSized/Immediate/Pair.
Sourcepub(crate) fn pointer_parts(self) -> (V, Option<V>)
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.
Sourcepub(crate) fn deref(self, align: Align) -> PlaceValue<V>
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
.
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>
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> 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<'tcx, T> ArenaAllocatable<'tcx, IsCopy> for Twhere
T: Copy,
impl<'tcx, T> ArenaAllocatable<'tcx, IsCopy> for Twhere
T: Copy,
fn allocate_on(self, arena: &'tcx Arena<'tcx>) -> &'tcx mut T
fn allocate_from_iter( arena: &'tcx Arena<'tcx>, iter: impl IntoIterator<Item = T>, ) -> &'tcx 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(self, arena: &'tcx Arena<'tcx>) -> &'tcx mut T
fn allocate_from_iter( arena: &'tcx Arena<'tcx>, iter: impl IntoIterator<Item = T>, ) -> &'tcx 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§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<T> Pointable for T
impl<T> Pointable 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.