Skip to content

Commit 75121fc

Browse files
committed
Separate generator info from MIR body.
1 parent 0568b0a commit 75121fc

34 files changed

+282
-735
lines changed

compiler/rustc_borrowck/src/type_check/input_output.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -115,28 +115,26 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
115115
}
116116
}
117117

118+
let body_yield_ty = body.yield_ty(self.tcx());
118119
debug!(
119120
"equate_inputs_and_outputs: body.yield_ty {:?}, universal_regions.yield_ty {:?}",
120-
body.yield_ty(),
121-
universal_regions.yield_ty
121+
body_yield_ty, universal_regions.yield_ty
122122
);
123123

124124
// We will not have a universal_regions.yield_ty if we yield (by accident)
125125
// outside of a generator and return an `impl Trait`, so emit a delay_span_bug
126126
// because we don't want to panic in an assert here if we've already got errors.
127-
if body.yield_ty().is_some() != universal_regions.yield_ty.is_some() {
127+
if body_yield_ty.is_some() != universal_regions.yield_ty.is_some() {
128128
self.tcx().sess.delay_span_bug(
129129
body.span,
130130
&format!(
131131
"Expected body to have yield_ty ({:?}) iff we have a UR yield_ty ({:?})",
132-
body.yield_ty(),
133-
universal_regions.yield_ty,
132+
body_yield_ty, universal_regions.yield_ty,
134133
),
135134
);
136135
}
137136

138-
if let (Some(mir_yield_ty), Some(ur_yield_ty)) =
139-
(body.yield_ty(), universal_regions.yield_ty)
137+
if let (Some(mir_yield_ty), Some(ur_yield_ty)) = (body_yield_ty, universal_regions.yield_ty)
140138
{
141139
let yield_span = body.local_decls[RETURN_PLACE].source_info.span;
142140
self.equate_normalized_input_or_output(ur_yield_ty, mir_yield_ty, yield_span);

compiler/rustc_borrowck/src/type_check/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1473,7 +1473,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
14731473
self.check_operand(value, term_location);
14741474

14751475
let value_ty = value.ty(body, tcx);
1476-
match body.yield_ty() {
1476+
match body.yield_ty(tcx) {
14771477
None => span_mirbug!(self, term, "yield in non-generator"),
14781478
Some(ty) => {
14791479
if let Err(terr) = self.sub_types(

compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1235,8 +1235,8 @@ fn generator_layout_and_saved_local_names<'tcx>(
12351235
tcx: TyCtxt<'tcx>,
12361236
def_id: DefId,
12371237
) -> (&'tcx GeneratorLayout<'tcx>, IndexVec<mir::GeneratorSavedLocal, Option<Symbol>>) {
1238+
let generator_layout = &tcx.mir_generator_info(def_id).generator_layout;
12381239
let body = tcx.optimized_mir(def_id);
1239-
let generator_layout = body.generator_layout().unwrap();
12401240
let mut generator_saved_local_names = IndexVec::from_elem(None, &generator_layout.field_tys);
12411241

12421242
let state_arg = mir::Local::new(1);

compiler/rustc_const_eval/src/transform/check_consts/check.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,7 @@ impl<'mir, 'tcx> Checker<'mir, 'tcx> {
222222

223223
// `async` functions cannot be `const fn`. This is checked during AST lowering, so there's
224224
// no need to emit duplicate errors here.
225-
if self.ccx.is_async() || body.generator.is_some() {
225+
if self.ccx.is_async() || tcx.generator_kind(def_id).is_some() {
226226
tcx.sess.delay_span_bug(body.span, "`async` functions cannot be `const fn`");
227227
return;
228228
}

compiler/rustc_const_eval/src/transform/promote_consts.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -973,7 +973,6 @@ pub fn promote_candidates<'tcx>(
973973
0,
974974
vec![],
975975
body.span,
976-
body.generator_kind(),
977976
body.tainted_by_errors,
978977
);
979978
promoted.phase = MirPhase::Analysis(AnalysisPhase::Initial);

compiler/rustc_const_eval/src/transform/validate.rs

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ impl<'tcx> MirPass<'tcx> for Validator {
6565
storage_liveness,
6666
place_cache: Vec::new(),
6767
value_cache: Vec::new(),
68+
is_generator: tcx.generator_kind(def_id).is_some(),
6869
}
6970
.visit_body(body);
7071
}
@@ -117,6 +118,7 @@ struct TypeChecker<'a, 'tcx> {
117118
storage_liveness: ResultsCursor<'a, 'tcx, MaybeStorageLive>,
118119
place_cache: Vec<PlaceRef<'tcx>>,
119120
value_cache: Vec<u128>,
121+
is_generator: bool,
120122
}
121123

122124
impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
@@ -323,16 +325,8 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
323325
}
324326
&ty::Generator(def_id, substs, _) => {
325327
let f_ty = if let Some(var) = parent_ty.variant_index {
326-
let gen_body = if def_id == self.body.source.def_id() {
327-
self.body
328-
} else {
329-
self.tcx.optimized_mir(def_id)
330-
};
331-
332-
let Some(layout) = gen_body.generator_layout() else {
333-
self.fail(location, format!("No generator layout for {:?}", parent_ty));
334-
return;
335-
};
328+
let generator_info = self.tcx.mir_generator_info(def_id);
329+
let layout = &generator_info.generator_layout;
336330

337331
let Some(&local) = layout.variant_fields[var].get(f) else {
338332
fail_out_of_bounds(self, location);
@@ -836,10 +830,10 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
836830
}
837831
}
838832
TerminatorKind::Yield { resume, drop, .. } => {
839-
if self.body.generator.is_none() {
833+
if !self.is_generator {
840834
self.fail(location, "`Yield` cannot appear outside generator bodies");
841835
}
842-
if self.mir_phase >= MirPhase::Runtime(RuntimePhase::Initial) {
836+
if self.mir_phase >= MirPhase::Runtime(RuntimePhase::GeneratorsLowered) {
843837
self.fail(location, "`Yield` should have been replaced by generator lowering");
844838
}
845839
self.check_edge(location, *resume, EdgeKind::Normal);
@@ -878,10 +872,10 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
878872
}
879873
}
880874
TerminatorKind::GeneratorDrop => {
881-
if self.body.generator.is_none() {
875+
if !self.is_generator {
882876
self.fail(location, "`GeneratorDrop` cannot appear outside generator bodies");
883877
}
884-
if self.mir_phase >= MirPhase::Runtime(RuntimePhase::Initial) {
878+
if self.mir_phase >= MirPhase::Runtime(RuntimePhase::GeneratorsLowered) {
885879
self.fail(
886880
location,
887881
"`GeneratorDrop` should have been replaced by generator lowering",

compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@ provide! { tcx, def_id, other, cdata,
203203
thir_abstract_const => { table }
204204
optimized_mir => { table }
205205
mir_for_ctfe => { table }
206+
mir_generator_info => { table }
206207
promoted_mir => { table }
207208
def_span => { table }
208209
def_ident_span => { table }

compiler/rustc_metadata/src/rmeta/encoder.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1387,6 +1387,10 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
13871387
debug!("EntryBuilder::encode_mir({:?})", def_id);
13881388
if encode_opt {
13891389
record!(self.tables.optimized_mir[def_id.to_def_id()] <- tcx.optimized_mir(def_id));
1390+
1391+
if let DefKind::Generator = self.tcx.def_kind(def_id) {
1392+
record!(self.tables.mir_generator_info[def_id.to_def_id()] <- tcx.mir_generator_info(def_id));
1393+
}
13901394
}
13911395
if encode_const {
13921396
record!(self.tables.mir_for_ctfe[def_id.to_def_id()] <- tcx.mir_for_ctfe(def_id));

compiler/rustc_metadata/src/rmeta/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,7 @@ define_tables! {
361361
object_lifetime_default: Table<DefIndex, LazyValue<ObjectLifetimeDefault>>,
362362
optimized_mir: Table<DefIndex, LazyValue<mir::Body<'static>>>,
363363
mir_for_ctfe: Table<DefIndex, LazyValue<mir::Body<'static>>>,
364+
mir_generator_info: Table<DefIndex, LazyValue<mir::GeneratorInfo<'static>>>,
364365
promoted_mir: Table<DefIndex, LazyValue<IndexVec<mir::Promoted, mir::Body<'static>>>>,
365366
// FIXME(compiler-errors): Why isn't this a LazyArray?
366367
thir_abstract_const: Table<DefIndex, LazyValue<&'static [ty::abstract_const::Node<'static>]>>,

compiler/rustc_middle/src/arena.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ macro_rules! arena_types {
1313
[] steal_thir: rustc_data_structures::steal::Steal<rustc_middle::thir::Thir<'tcx>>,
1414
[] steal_mir: rustc_data_structures::steal::Steal<rustc_middle::mir::Body<'tcx>>,
1515
[decode] mir: rustc_middle::mir::Body<'tcx>,
16+
[decode] generator_info: rustc_middle::mir::GeneratorInfo<'tcx>,
17+
[] mir_generator_lowered: (
18+
rustc_data_structures::steal::Steal<rustc_middle::mir::Body<'tcx>>,
19+
Option<rustc_middle::mir::GeneratorInfo<'tcx>>,
20+
),
1621
[] steal_promoted:
1722
rustc_data_structures::steal::Steal<
1823
rustc_index::vec::IndexVec<

0 commit comments

Comments
 (0)