Skip to content

Commit 6572ec8

Browse files
committed
Auto merge of #15691 - Veykril:rustc_abi, r=Veykril
Update rustc_abi dependency cc #116269
2 parents a8581aa + 40acc52 commit 6572ec8

File tree

9 files changed

+133
-96
lines changed

9 files changed

+133
-96
lines changed

Cargo.lock

+19-29
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/hir-def/src/data/adt.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ fn parse_repr_tt(tt: &Subtree) -> Option<ReprOptions> {
178178
}
179179
}
180180

181-
Some(ReprOptions { int, align: max_align, pack: min_pack, flags, field_shuffle_seed: 0 })
181+
Some(ReprOptions { int, align: max_align, pack: min_pack, flags })
182182
}
183183

184184
impl StructData {

crates/hir-ty/src/layout.rs

+51-27
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ use hir_def::{
99
LocalEnumVariantId, LocalFieldId, StructId,
1010
};
1111
use la_arena::{Idx, RawIdx};
12+
use rustc_dependencies::{
13+
abi::AddressSpace,
14+
index::{IndexSlice, IndexVec},
15+
};
1216
use stdx::never;
1317
use triomphe::Arc;
1418

@@ -34,7 +38,7 @@ mod target;
3438
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
3539
pub struct RustcEnumVariantIdx(pub LocalEnumVariantId);
3640

37-
impl rustc_dependencies::index::vec::Idx for RustcEnumVariantIdx {
41+
impl rustc_dependencies::index::Idx for RustcEnumVariantIdx {
3842
fn new(idx: usize) -> Self {
3943
RustcEnumVariantIdx(Idx::from_raw(RawIdx::from(idx as u32)))
4044
}
@@ -44,9 +48,28 @@ impl rustc_dependencies::index::vec::Idx for RustcEnumVariantIdx {
4448
}
4549
}
4650

47-
pub type Layout = LayoutS<RustcEnumVariantIdx>;
51+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
52+
pub struct RustcFieldIdx(pub LocalFieldId);
53+
54+
impl RustcFieldIdx {
55+
pub fn new(idx: usize) -> Self {
56+
RustcFieldIdx(Idx::from_raw(RawIdx::from(idx as u32)))
57+
}
58+
}
59+
60+
impl rustc_dependencies::index::Idx for RustcFieldIdx {
61+
fn new(idx: usize) -> Self {
62+
RustcFieldIdx(Idx::from_raw(RawIdx::from(idx as u32)))
63+
}
64+
65+
fn index(self) -> usize {
66+
u32::from(self.0.into_raw()) as usize
67+
}
68+
}
69+
70+
pub type Layout = LayoutS<RustcFieldIdx, RustcEnumVariantIdx>;
4871
pub type TagEncoding = hir_def::layout::TagEncoding<RustcEnumVariantIdx>;
49-
pub type Variants = hir_def::layout::Variants<RustcEnumVariantIdx>;
72+
pub type Variants = hir_def::layout::Variants<RustcFieldIdx, RustcEnumVariantIdx>;
5073

5174
#[derive(Debug, PartialEq, Eq, Clone)]
5275
pub enum LayoutError {
@@ -66,7 +89,7 @@ struct LayoutCx<'a> {
6689
impl<'a> LayoutCalculator for LayoutCx<'a> {
6790
type TargetDataLayoutRef = &'a TargetDataLayout;
6891

69-
fn delay_bug(&self, txt: &str) {
92+
fn delay_bug(&self, txt: String) {
7093
never!("{}", txt);
7194
}
7295

@@ -145,6 +168,8 @@ fn layout_of_simd_ty(
145168
largest_niche: e_ly.largest_niche,
146169
size,
147170
align,
171+
max_repr_align: None,
172+
unadjusted_abi_align: align.abi,
148173
}))
149174
}
150175

@@ -230,7 +255,7 @@ pub fn layout_of_ty_query(
230255
.map(|k| db.layout_of_ty(k.assert_ty_ref(Interner).clone(), trait_env.clone()))
231256
.collect::<Result<Vec<_>, _>>()?;
232257
let fields = fields.iter().map(|it| &**it).collect::<Vec<_>>();
233-
let fields = fields.iter().collect::<Vec<_>>();
258+
let fields = fields.iter().collect::<IndexVec<_, _>>();
234259
cx.univariant(dl, &fields, &ReprOptions::default(), kind).ok_or(LayoutError::Unknown)?
235260
}
236261
TyKind::Array(element, count) => {
@@ -255,6 +280,8 @@ pub fn layout_of_ty_query(
255280
largest_niche,
256281
align: element.align,
257282
size,
283+
max_repr_align: None,
284+
unadjusted_abi_align: element.align.abi,
258285
}
259286
}
260287
TyKind::Slice(element) => {
@@ -266,11 +293,23 @@ pub fn layout_of_ty_query(
266293
largest_niche: None,
267294
align: element.align,
268295
size: Size::ZERO,
296+
max_repr_align: None,
297+
unadjusted_abi_align: element.align.abi,
269298
}
270299
}
300+
TyKind::Str => Layout {
301+
variants: Variants::Single { index: struct_variant_idx() },
302+
fields: FieldsShape::Array { stride: Size::from_bytes(1), count: 0 },
303+
abi: Abi::Aggregate { sized: false },
304+
largest_niche: None,
305+
align: dl.i8_align,
306+
size: Size::ZERO,
307+
max_repr_align: None,
308+
unadjusted_abi_align: dl.i8_align.abi,
309+
},
271310
// Potentially-wide pointers.
272311
TyKind::Ref(_, _, pointee) | TyKind::Raw(_, pointee) => {
273-
let mut data_ptr = scalar_unit(dl, Primitive::Pointer);
312+
let mut data_ptr = scalar_unit(dl, Primitive::Pointer(AddressSpace::DATA));
274313
if matches!(ty.kind(Interner), TyKind::Ref(..)) {
275314
data_ptr.valid_range_mut().start = 1;
276315
}
@@ -294,7 +333,7 @@ pub fn layout_of_ty_query(
294333
scalar_unit(dl, Primitive::Int(dl.ptr_sized_integer(), false))
295334
}
296335
TyKind::Dyn(..) => {
297-
let mut vtable = scalar_unit(dl, Primitive::Pointer);
336+
let mut vtable = scalar_unit(dl, Primitive::Pointer(AddressSpace::DATA));
298337
vtable.valid_range_mut().start = 1;
299338
vtable
300339
}
@@ -308,22 +347,7 @@ pub fn layout_of_ty_query(
308347
cx.scalar_pair(data_ptr, metadata)
309348
}
310349
TyKind::FnDef(_, _) => layout_of_unit(&cx, dl)?,
311-
TyKind::Str => Layout {
312-
variants: Variants::Single { index: struct_variant_idx() },
313-
fields: FieldsShape::Array { stride: Size::from_bytes(1), count: 0 },
314-
abi: Abi::Aggregate { sized: false },
315-
largest_niche: None,
316-
align: dl.i8_align,
317-
size: Size::ZERO,
318-
},
319-
TyKind::Never => Layout {
320-
variants: Variants::Single { index: struct_variant_idx() },
321-
fields: FieldsShape::Primitive,
322-
abi: Abi::Uninhabited,
323-
largest_niche: None,
324-
align: dl.i8_align,
325-
size: Size::ZERO,
326-
},
350+
TyKind::Never => cx.layout_of_never_type(),
327351
TyKind::Dyn(_) | TyKind::Foreign(_) => {
328352
let mut unit = layout_of_unit(&cx, dl)?;
329353
match unit.abi {
@@ -333,7 +357,7 @@ pub fn layout_of_ty_query(
333357
unit
334358
}
335359
TyKind::Function(_) => {
336-
let mut ptr = scalar_unit(dl, Primitive::Pointer);
360+
let mut ptr = scalar_unit(dl, Primitive::Pointer(dl.instruction_address_space));
337361
ptr.valid_range_mut().start = 1;
338362
Layout::scalar(dl, ptr)
339363
}
@@ -363,7 +387,7 @@ pub fn layout_of_ty_query(
363387
})
364388
.collect::<Result<Vec<_>, _>>()?;
365389
let fields = fields.iter().map(|it| &**it).collect::<Vec<_>>();
366-
let fields = fields.iter().collect::<Vec<_>>();
390+
let fields = fields.iter().collect::<IndexVec<_, _>>();
367391
cx.univariant(dl, &fields, &ReprOptions::default(), StructKind::AlwaysSized)
368392
.ok_or(LayoutError::Unknown)?
369393
}
@@ -398,9 +422,9 @@ pub fn layout_of_ty_recover(
398422
}
399423

400424
fn layout_of_unit(cx: &LayoutCx<'_>, dl: &TargetDataLayout) -> Result<Layout, LayoutError> {
401-
cx.univariant::<RustcEnumVariantIdx, &&Layout>(
425+
cx.univariant::<RustcFieldIdx, RustcEnumVariantIdx, &&Layout>(
402426
dl,
403-
&[],
427+
IndexSlice::empty(),
404428
&ReprOptions::default(),
405429
StructKind::AlwaysSized,
406430
)

crates/hir-ty/src/layout/adt.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use hir_def::{
88
AdtId, EnumVariantId, LocalEnumVariantId, VariantId,
99
};
1010
use la_arena::RawIdx;
11+
use rustc_dependencies::index::IndexVec;
1112
use smallvec::SmallVec;
1213
use triomphe::Arc;
1314

@@ -20,8 +21,8 @@ use crate::{
2021

2122
use super::LayoutCx;
2223

23-
pub(crate) fn struct_variant_idx() -> RustcEnumVariantIdx {
24-
RustcEnumVariantIdx(LocalEnumVariantId::from_raw(RawIdx::from(0)))
24+
pub(crate) const fn struct_variant_idx() -> RustcEnumVariantIdx {
25+
RustcEnumVariantIdx(LocalEnumVariantId::from_raw(RawIdx::from_u32(0)))
2526
}
2627

2728
pub fn layout_of_adt_query(
@@ -74,7 +75,7 @@ pub fn layout_of_adt_query(
7475
.iter()
7576
.map(|it| it.iter().map(|it| &**it).collect::<Vec<_>>())
7677
.collect::<SmallVec<[_; 1]>>();
77-
let variants = variants.iter().map(|it| it.iter().collect()).collect();
78+
let variants = variants.iter().map(|it| it.iter().collect()).collect::<IndexVec<_, _>>();
7879
let result = if matches!(def, AdtId::UnionId(..)) {
7980
cx.layout_of_union(&repr, &variants).ok_or(LayoutError::Unknown)?
8081
} else {
@@ -105,7 +106,7 @@ pub fn layout_of_adt_query(
105106
&& variants
106107
.iter()
107108
.next()
108-
.and_then(|it| it.last().map(|it| !it.is_unsized()))
109+
.and_then(|it| it.iter().last().map(|it| !it.is_unsized()))
109110
.unwrap_or(true),
110111
)
111112
.ok_or(LayoutError::SizeOverflow)?

crates/hir/src/lib.rs

+20-4
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ use hir_ty::{
6464
consteval::{try_const_usize, unknown_const_as_generic, ConstEvalError, ConstExt},
6565
diagnostics::BodyValidationDiagnostic,
6666
known_const_to_ast,
67-
layout::{Layout as TyLayout, RustcEnumVariantIdx, TagEncoding},
67+
layout::{Layout as TyLayout, RustcEnumVariantIdx, RustcFieldIdx, TagEncoding},
6868
method_resolution::{self, TyFingerprint},
6969
mir::{self, interpret_mir},
7070
primitive::UintTy,
@@ -4540,15 +4540,31 @@ impl Layout {
45404540
Some(self.0.largest_niche?.available(&*self.1))
45414541
}
45424542

4543-
pub fn field_offset(&self, idx: usize) -> Option<u64> {
4543+
pub fn field_offset(&self, field: Field) -> Option<u64> {
45444544
match self.0.fields {
45454545
layout::FieldsShape::Primitive => None,
45464546
layout::FieldsShape::Union(_) => Some(0),
45474547
layout::FieldsShape::Array { stride, count } => {
4548-
let i = u64::try_from(idx).ok()?;
4548+
let i = u64::try_from(field.index()).ok()?;
45494549
(i < count).then_some((stride * i).bytes())
45504550
}
4551-
layout::FieldsShape::Arbitrary { ref offsets, .. } => Some(offsets.get(idx)?.bytes()),
4551+
layout::FieldsShape::Arbitrary { ref offsets, .. } => {
4552+
Some(offsets.get(RustcFieldIdx(field.id))?.bytes())
4553+
}
4554+
}
4555+
}
4556+
4557+
pub fn tuple_field_offset(&self, field: usize) -> Option<u64> {
4558+
match self.0.fields {
4559+
layout::FieldsShape::Primitive => None,
4560+
layout::FieldsShape::Union(_) => Some(0),
4561+
layout::FieldsShape::Array { stride, count } => {
4562+
let i = u64::try_from(field).ok()?;
4563+
(i < count).then_some((stride * i).bytes())
4564+
}
4565+
layout::FieldsShape::Arbitrary { ref offsets, .. } => {
4566+
Some(offsets.get(RustcFieldIdx::new(field))?.bytes())
4567+
}
45524568
}
45534569
}
45544570

crates/ide/src/hover/render.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -402,10 +402,9 @@ pub(super) fn definition(
402402
|&it| it.layout(db),
403403
|_| {
404404
let var_def = it.parent_def(db);
405-
let id = it.index();
406405
match var_def {
407406
hir::VariantDef::Struct(s) => {
408-
Adt::from(s).layout(db).ok().and_then(|layout| layout.field_offset(id))
407+
Adt::from(s).layout(db).ok().and_then(|layout| layout.field_offset(it))
409408
}
410409
_ => None,
411410
}

0 commit comments

Comments
 (0)