Remove most manual LayoutData creations and move them to rustc_abi
...either as: - methods on LayoutCalculator, for faillible operations; - constructors on LayoutData, for infaillible ones.
This commit is contained in:
parent
cdd8af2299
commit
9917173575
6 changed files with 228 additions and 267 deletions
|
@ -1744,48 +1744,6 @@ impl<FieldIdx: Idx, VariantIdx: Idx> LayoutData<FieldIdx, VariantIdx> {
|
|||
pub fn is_uninhabited(&self) -> bool {
|
||||
self.uninhabited
|
||||
}
|
||||
|
||||
pub fn scalar<C: HasDataLayout>(cx: &C, scalar: Scalar) -> Self {
|
||||
let largest_niche = Niche::from_scalar(cx, Size::ZERO, scalar);
|
||||
let size = scalar.size(cx);
|
||||
let align = scalar.align(cx);
|
||||
|
||||
let range = scalar.valid_range(cx);
|
||||
|
||||
// All primitive types for which we don't have subtype coercions should get a distinct seed,
|
||||
// so that types wrapping them can use randomization to arrive at distinct layouts.
|
||||
//
|
||||
// Some type information is already lost at this point, so as an approximation we derive
|
||||
// the seed from what remains. For example on 64-bit targets usize and u64 can no longer
|
||||
// be distinguished.
|
||||
let randomization_seed = size
|
||||
.bytes()
|
||||
.wrapping_add(
|
||||
match scalar.primitive() {
|
||||
Primitive::Int(_, true) => 1,
|
||||
Primitive::Int(_, false) => 2,
|
||||
Primitive::Float(_) => 3,
|
||||
Primitive::Pointer(_) => 4,
|
||||
} << 32,
|
||||
)
|
||||
// distinguishes references from pointers
|
||||
.wrapping_add((range.start as u64).rotate_right(16))
|
||||
// distinguishes char from u32 and bool from u8
|
||||
.wrapping_add((range.end as u64).rotate_right(16));
|
||||
|
||||
LayoutData {
|
||||
variants: Variants::Single { index: VariantIdx::new(0) },
|
||||
fields: FieldsShape::Primitive,
|
||||
backend_repr: BackendRepr::Scalar(scalar),
|
||||
largest_niche,
|
||||
uninhabited: false,
|
||||
size,
|
||||
align,
|
||||
max_repr_align: None,
|
||||
unadjusted_abi_align: align.abi,
|
||||
randomization_seed: Hash64::new(randomization_seed),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<FieldIdx: Idx, VariantIdx: Idx> fmt::Debug for LayoutData<FieldIdx, VariantIdx>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue