Skip to content

Commit 3a1edd8

Browse files
committed
Store generator field names in GeneratorLayout.
1 parent 7d5b2e4 commit 3a1edd8

File tree

7 files changed

+36
-63
lines changed

7 files changed

+36
-63
lines changed

compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/cpp_like.rs

+1-3
Original file line numberDiff line numberDiff line change
@@ -676,8 +676,7 @@ fn build_union_fields_for_direct_tag_generator<'ll, 'tcx>(
676676
_ => unreachable!(),
677677
};
678678

679-
let (generator_layout, state_specific_upvar_names) =
680-
cx.tcx.generator_layout_and_saved_local_names(generator_def_id);
679+
let generator_layout = cx.tcx.optimized_mir(generator_def_id).generator_layout().unwrap();
681680

682681
let common_upvar_names = cx.tcx.closure_saved_names_of_captured_variables(generator_def_id);
683682
let variant_range = generator_substs.variant_range(generator_def_id, cx.tcx);
@@ -714,7 +713,6 @@ fn build_union_fields_for_direct_tag_generator<'ll, 'tcx>(
714713
generator_type_and_layout,
715714
generator_type_di_node,
716715
generator_layout,
717-
&state_specific_upvar_names,
718716
&common_upvar_names,
719717
);
720718

compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/mod.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use rustc_hir::def::CtorKind;
66
use rustc_index::IndexSlice;
77
use rustc_middle::{
88
bug,
9-
mir::{GeneratorLayout, GeneratorSavedLocal},
9+
mir::GeneratorLayout,
1010
ty::{
1111
self,
1212
layout::{IntegerExt, LayoutOf, PrimitiveExt, TyAndLayout},
@@ -323,7 +323,6 @@ pub fn build_generator_variant_struct_type_di_node<'ll, 'tcx>(
323323
generator_type_and_layout: TyAndLayout<'tcx>,
324324
generator_type_di_node: &'ll DIType,
325325
generator_layout: &GeneratorLayout<'tcx>,
326-
state_specific_upvar_names: &IndexSlice<GeneratorSavedLocal, Option<Symbol>>,
327326
common_upvar_names: &IndexSlice<FieldIdx, Symbol>,
328327
) -> &'ll DIType {
329328
let variant_name = GeneratorSubsts::variant_name(variant_index);
@@ -357,7 +356,7 @@ pub fn build_generator_variant_struct_type_di_node<'ll, 'tcx>(
357356
.map(|field_index| {
358357
let generator_saved_local = generator_layout.variant_fields[variant_index]
359358
[FieldIdx::from_usize(field_index)];
360-
let field_name_maybe = state_specific_upvar_names[generator_saved_local];
359+
let field_name_maybe = generator_layout.field_names[generator_saved_local];
361360
let field_name = field_name_maybe
362361
.as_ref()
363362
.map(|s| Cow::from(s.as_str()))

compiler/rustc_codegen_llvm/src/debuginfo/metadata/enums/native.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,8 @@ pub(super) fn build_generator_di_node<'ll, 'tcx>(
155155
DIFlags::FlagZero,
156156
),
157157
|cx, generator_type_di_node| {
158-
let (generator_layout, state_specific_upvar_names) =
159-
cx.tcx.generator_layout_and_saved_local_names(generator_def_id);
158+
let generator_layout =
159+
cx.tcx.optimized_mir(generator_def_id).generator_layout().unwrap();
160160

161161
let Variants::Multiple { tag_encoding: TagEncoding::Direct, ref variants, .. } = generator_type_and_layout.variants else {
162162
bug!(
@@ -195,7 +195,6 @@ pub(super) fn build_generator_di_node<'ll, 'tcx>(
195195
generator_type_and_layout,
196196
generator_type_di_node,
197197
generator_layout,
198-
&state_specific_upvar_names,
199198
&common_upvar_names,
200199
),
201200
source_info,

compiler/rustc_middle/src/mir/query.rs

+4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use rustc_hir as hir;
99
use rustc_hir::def_id::LocalDefId;
1010
use rustc_index::bit_set::BitMatrix;
1111
use rustc_index::{Idx, IndexVec};
12+
use rustc_span::symbol::Symbol;
1213
use rustc_span::Span;
1314
use rustc_target::abi::{FieldIdx, VariantIdx};
1415
use smallvec::SmallVec;
@@ -150,6 +151,9 @@ pub struct GeneratorLayout<'tcx> {
150151
/// The type of every local stored inside the generator.
151152
pub field_tys: IndexVec<GeneratorSavedLocal, GeneratorSavedTy<'tcx>>,
152153

154+
/// The name for debuginfo.
155+
pub field_names: IndexVec<GeneratorSavedLocal, Option<Symbol>>,
156+
153157
/// Which of the above fields are in each variant. Note that one field may
154158
/// be stored in multiple variants.
155159
pub variant_fields: IndexVec<VariantIdx, IndexVec<FieldIdx, GeneratorSavedLocal>>,

compiler/rustc_middle/src/ty/util.rs

-44
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
//! Miscellaneous type-system utilities that are too small to deserve their own modules.
22
33
use crate::middle::codegen_fn_attrs::CodegenFnAttrFlags;
4-
use crate::mir;
54
use crate::query::Providers;
65
use crate::ty::layout::IntegerExt;
76
use crate::ty::{
@@ -17,7 +16,6 @@ use rustc_hir as hir;
1716
use rustc_hir::def::{CtorOf, DefKind, Res};
1817
use rustc_hir::def_id::{CrateNum, DefId, LocalDefId};
1918
use rustc_index::bit_set::GrowableBitSet;
20-
use rustc_index::{Idx, IndexVec};
2119
use rustc_macros::HashStable;
2220
use rustc_session::Limit;
2321
use rustc_span::sym;
@@ -738,48 +736,6 @@ impl<'tcx> TyCtxt<'tcx> {
738736
if visitor.found_recursion { Err(expanded_type) } else { Ok(expanded_type) }
739737
}
740738

741-
// FIXME(eddyb) maybe precompute this? Right now it's computed once
742-
// per generator monomorphization, but it doesn't depend on substs.
743-
pub fn generator_layout_and_saved_local_names(
744-
self,
745-
def_id: DefId,
746-
) -> (
747-
&'tcx ty::GeneratorLayout<'tcx>,
748-
IndexVec<mir::GeneratorSavedLocal, Option<rustc_span::Symbol>>,
749-
) {
750-
let tcx = self;
751-
let body = tcx.optimized_mir(def_id);
752-
let generator_layout = body.generator_layout().unwrap();
753-
let mut generator_saved_local_names =
754-
IndexVec::from_elem(None, &generator_layout.field_tys);
755-
756-
let state_arg = mir::Local::new(1);
757-
for var in &body.var_debug_info {
758-
let mir::VarDebugInfoContents::Place(place) = &var.value else { continue };
759-
if place.local != state_arg {
760-
continue;
761-
}
762-
match place.projection[..] {
763-
[
764-
// Deref of the `Pin<&mut Self>` state argument.
765-
mir::ProjectionElem::Field(..),
766-
mir::ProjectionElem::Deref,
767-
// Field of a variant of the state.
768-
mir::ProjectionElem::Downcast(_, variant),
769-
mir::ProjectionElem::Field(field, _),
770-
] => {
771-
let name = &mut generator_saved_local_names
772-
[generator_layout.variant_fields[variant][field]];
773-
if name.is_none() {
774-
name.replace(var.name);
775-
}
776-
}
777-
_ => {}
778-
}
779-
}
780-
(generator_layout, generator_saved_local_names)
781-
}
782-
783739
/// Query and get an English description for the item's kind.
784740
pub fn def_descr(self, def_id: DefId) -> &'static str {
785741
self.def_kind_descr(self.def_kind(def_id), def_id)

compiler/rustc_mir_transform/src/generator.rs

+22-6
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ struct TransformVisitor<'tcx> {
230230

231231
// Mapping from Local to (type of local, generator struct index)
232232
// FIXME(eddyb) This should use `IndexVec<Local, Option<_>>`.
233-
remap: FxHashMap<Local, (Ty<'tcx>, VariantIdx, usize)>,
233+
remap: FxHashMap<Local, (Ty<'tcx>, VariantIdx, FieldIdx)>,
234234

235235
// A map from a suspension point in a block to the locals which have live storage at that point
236236
storage_liveness: IndexVec<BasicBlock, Option<BitSet<Local>>>,
@@ -295,11 +295,11 @@ impl<'tcx> TransformVisitor<'tcx> {
295295
}
296296

297297
// Create a Place referencing a generator struct field
298-
fn make_field(&self, variant_index: VariantIdx, idx: usize, ty: Ty<'tcx>) -> Place<'tcx> {
298+
fn make_field(&self, variant_index: VariantIdx, idx: FieldIdx, ty: Ty<'tcx>) -> Place<'tcx> {
299299
let self_place = Place::from(SELF_ARG);
300300
let base = self.tcx.mk_place_downcast_unnamed(self_place, variant_index);
301301
let mut projection = base.projection.to_vec();
302-
projection.push(ProjectionElem::Field(FieldIdx::new(idx), ty));
302+
projection.push(ProjectionElem::Field(idx, ty));
303303

304304
Place { local: base.local, projection: self.tcx.mk_place_elems(&projection) }
305305
}
@@ -904,7 +904,7 @@ fn compute_layout<'tcx>(
904904
liveness: LivenessInfo,
905905
body: &Body<'tcx>,
906906
) -> (
907-
FxHashMap<Local, (Ty<'tcx>, VariantIdx, usize)>,
907+
FxHashMap<Local, (Ty<'tcx>, VariantIdx, FieldIdx)>,
908908
GeneratorLayout<'tcx>,
909909
IndexVec<BasicBlock, Option<BitSet<Local>>>,
910910
) {
@@ -982,6 +982,7 @@ fn compute_layout<'tcx>(
982982
// just use the first one here. That's fine; fields do not move
983983
// around inside generators, so it doesn't matter which variant
984984
// index we access them by.
985+
let idx = FieldIdx::from_usize(idx);
985986
remap.entry(locals[saved_local]).or_insert((tys[saved_local].ty, variant_index, idx));
986987
}
987988
variant_fields.push(fields);
@@ -990,8 +991,23 @@ fn compute_layout<'tcx>(
990991
debug!("generator variant_fields = {:?}", variant_fields);
991992
debug!("generator storage_conflicts = {:#?}", storage_conflicts);
992993

993-
let layout =
994-
GeneratorLayout { field_tys: tys, variant_fields, variant_source_info, storage_conflicts };
994+
let mut field_names = IndexVec::from_elem(None, &tys);
995+
for var in &body.var_debug_info {
996+
let VarDebugInfoContents::Place(place) = &var.value else { continue };
997+
let Some(local) = place.as_local() else { continue };
998+
let Some(&(_, variant, field)) = remap.get(&local) else { continue };
999+
1000+
let saved_local = variant_fields[variant][field];
1001+
field_names.get_or_insert_with(saved_local, || var.name);
1002+
}
1003+
1004+
let layout = GeneratorLayout {
1005+
field_tys: tys,
1006+
field_names,
1007+
variant_fields,
1008+
variant_source_info,
1009+
storage_conflicts,
1010+
};
9951011
debug!(?layout);
9961012

9971013
(remap, layout, storage_liveness)

compiler/rustc_ty_utils/src/layout.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -944,7 +944,7 @@ fn variant_info_for_generator<'tcx>(
944944
return (vec![], None);
945945
};
946946

947-
let (generator, state_specific_names) = cx.tcx.generator_layout_and_saved_local_names(def_id);
947+
let generator = cx.tcx.optimized_mir(def_id).generator_layout().unwrap();
948948
let upvar_names = cx.tcx.closure_saved_names_of_captured_variables(def_id);
949949

950950
let mut upvars_size = Size::ZERO;
@@ -983,9 +983,10 @@ fn variant_info_for_generator<'tcx>(
983983
variant_size = variant_size.max(offset + field_layout.size);
984984
FieldInfo {
985985
kind: FieldKind::GeneratorLocal,
986-
name: state_specific_names.get(*local).copied().flatten().unwrap_or(
987-
Symbol::intern(&format!(".generator_field{}", local.as_usize())),
988-
),
986+
name: generator.field_names[*local].unwrap_or(Symbol::intern(&format!(
987+
".generator_field{}",
988+
local.as_usize()
989+
))),
989990
offset: offset.bytes(),
990991
size: field_layout.size.bytes(),
991992
align: field_layout.align.abi.bytes(),

0 commit comments

Comments
 (0)