pub enum BackendRepr {
Scalar(Scalar),
ScalarPair {
a: Scalar,
b: Scalar,
b_offset: Size,
},
SimdScalableVector {
element: Scalar,
count: u64,
number_of_vectors: NumScalableVectors,
},
SimdVector {
element: Scalar,
count: u64,
},
Memory {
sized: bool,
},
}Expand description
The way we represent values to the backend
Previously this was conflated with the “ABI” a type is given, as in the platform-specific ABI. In reality, this implies little about that, but is mostly used to describe the syntactic form emitted for the backend, as most backends handle SSA values and blobs of memory differently. The psABI may need consideration in doing so, but this enum does not constitute a promise for how the value will be lowered to the calling convention, in itself.
Generally, a codegen backend will prefer to handle smaller values as a scalar or short vector, and larger values will usually prefer to be represented as memory.
Variants§
Scalar(Scalar)
ScalarPair
The data contained in this type can be entirely represented by two scalars.
The two scalars are listed in memory order, so a is at offset zero
and b is at non-zero offset b_offset.
These need not be FieldIdx(0) and FieldIdx(1).
As of June 2026 the b_offset is always the size of the a
scalar rounded up to the platform alignment of the b scalar.
That may soon change, however; see MCP#1007.
SimdScalableVector
SimdVector
Memory
Implementations§
Source§impl BackendRepr
impl BackendRepr
Sourcepub fn is_unsized(&self) -> bool
pub fn is_unsized(&self) -> bool
Returns true if the layout corresponds to an unsized type.
pub fn is_sized(&self) -> bool
Sourcepub fn is_signed(&self) -> bool
pub fn is_signed(&self) -> bool
Returns true if this is a single signed integer scalar.
Sanity check: panics if this is not a scalar type (see PR #70189).
Sourcepub fn is_scalar(&self) -> bool
pub fn is_scalar(&self) -> bool
Returns true if this is specifically a Self::Scalar type.
This excludes SIMD types.
Sourcepub fn is_scalar_or_simd(&self) -> bool
pub fn is_scalar_or_simd(&self) -> bool
Returns true if this is a scalar type or SIMD type.
Sourcepub fn scalar_platform_align<C: HasDataLayout>(&self, cx: &C) -> Option<Align>
pub fn scalar_platform_align<C: HasDataLayout>(&self, cx: &C) -> Option<Align>
The psABI alignment for a Scalar or ScalarPair
None for other variants.
It’s unclear whether this is a meaningful operation, and MCP#1007 proposes changes.
You should generally be using the alignment of the place or the type,
not calculating something from the Scalars.
Sourcepub fn scalar_size<C: HasDataLayout>(&self, cx: &C) -> Option<Size>
pub fn scalar_size<C: HasDataLayout>(&self, cx: &C) -> Option<Size>
The psABI size for a Scalar or ScalarPair
None for other variants
pub fn eq_up_to_validity(&self, other: &Self) -> bool
Trait Implementations§
Source§impl Clone for BackendRepr
impl Clone for BackendRepr
Source§fn clone(&self) -> BackendRepr
fn clone(&self) -> BackendRepr
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for BackendRepr
Source§impl Debug for BackendRepr
impl Debug for BackendRepr
impl Eq for BackendRepr
Source§impl Hash for BackendRepr
impl Hash for BackendRepr
Source§impl PartialEq for BackendRepr
impl PartialEq for BackendRepr
Source§impl StableHash for BackendRepr
impl StableHash for BackendRepr
fn stable_hash<__Hcx: StableHashCtxt>( &self, __hcx: &mut __Hcx, __hasher: &mut StableHasher, )
impl StructuralPartialEq for BackendRepr
Auto Trait Implementations§
impl DynSend for BackendRepr
impl DynSync for BackendRepr
impl Freeze for BackendRepr
impl RefUnwindSafe for BackendRepr
impl Send for BackendRepr
impl Sync for BackendRepr
impl Unpin for BackendRepr
impl UnsafeUnpin for BackendRepr
impl UnwindSafe for BackendRepr
Blanket Implementations§
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<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.impl<T> ErasedDestructor for Twhere
T: 'static,
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<T> Pointable for T
impl<T> Pointable for 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> ⓘ
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 112 bytes
Size for each variant:
Scalar: 64 bytesScalarPair: 112 bytesSimdScalableVector: 80 bytesSimdVector: 80 bytesMemory: 5 bytes