Skip to content

Commit fa1b622

Browse files
committed
Separate generator info from MIR body.
1 parent 024207a commit fa1b622

File tree

27 files changed

+264
-257
lines changed

27 files changed

+264
-257
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
@@ -110,28 +110,26 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
110110
}
111111
}
112112

113+
let body_yield_ty = body.yield_ty(self.tcx());
113114
debug!(
114115
"equate_inputs_and_outputs: body.yield_ty {:?}, universal_regions.yield_ty {:?}",
115-
body.yield_ty(),
116-
universal_regions.yield_ty
116+
body_yield_ty, universal_regions.yield_ty
117117
);
118118

119119
// We will not have a universal_regions.yield_ty if we yield (by accident)
120120
// outside of a generator and return an `impl Trait`, so emit a delay_span_bug
121121
// because we don't want to panic in an assert here if we've already got errors.
122-
if body.yield_ty().is_some() != universal_regions.yield_ty.is_some() {
122+
if body_yield_ty.is_some() != universal_regions.yield_ty.is_some() {
123123
self.tcx().sess.delay_span_bug(
124124
body.span,
125125
&format!(
126126
"Expected body to have yield_ty ({:?}) iff we have a UR yield_ty ({:?})",
127-
body.yield_ty(),
128-
universal_regions.yield_ty,
127+
body_yield_ty, universal_regions.yield_ty,
129128
),
130129
);
131130
}
132131

133-
if let (Some(mir_yield_ty), Some(ur_yield_ty)) =
134-
(body.yield_ty(), universal_regions.yield_ty)
132+
if let (Some(mir_yield_ty), Some(ur_yield_ty)) = (body_yield_ty, universal_regions.yield_ty)
135133
{
136134
let yield_span = body.local_decls[RETURN_PLACE].source_info.span;
137135
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
@@ -1507,7 +1507,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
15071507
self.check_operand(value, term_location);
15081508

15091509
let value_ty = value.ty(body, tcx);
1510-
match body.yield_ty() {
1510+
match body.yield_ty(tcx) {
15111511
None => span_mirbug!(self, term, "yield in non-generator"),
15121512
Some(ty) => {
15131513
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
@@ -225,7 +225,7 @@ impl<'mir, 'tcx> Checker<'mir, 'tcx> {
225225

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

compiler/rustc_const_eval/src/transform/promote_consts.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -964,7 +964,6 @@ pub fn promote_candidates<'tcx>(
964964
0,
965965
vec![],
966966
body.span,
967-
body.generator_kind(),
968967
body.tainted_by_errors,
969968
);
970969
promoted.phase = MirPhase::Analysis(AnalysisPhase::Initial);

compiler/rustc_const_eval/src/transform/validate.rs

Lines changed: 6 additions & 12 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
}
@@ -118,6 +119,7 @@ struct TypeChecker<'a, 'tcx> {
118119
storage_liveness: ResultsCursor<'a, 'tcx, MaybeStorageLive>,
119120
place_cache: Vec<PlaceRef<'tcx>>,
120121
value_cache: Vec<u128>,
122+
is_generator: bool,
121123
}
122124

123125
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);
@@ -861,7 +855,7 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
861855
}
862856
}
863857
TerminatorKind::Yield { resume, drop, .. } => {
864-
if self.body.generator.is_none() {
858+
if !self.is_generator {
865859
self.fail(location, "`Yield` cannot appear outside generator bodies");
866860
}
867861
if self.mir_phase >= MirPhase::Runtime(RuntimePhase::Initial) {
@@ -903,7 +897,7 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> {
903897
}
904898
}
905899
TerminatorKind::GeneratorDrop => {
906-
if self.body.generator.is_none() {
900+
if !self.is_generator {
907901
self.fail(location, "`GeneratorDrop` cannot appear outside generator bodies");
908902
}
909903
if self.mir_phase >= MirPhase::Runtime(RuntimePhase::Initial) {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ provide! { tcx, def_id, other, cdata,
202202
thir_abstract_const => { table }
203203
optimized_mir => { table }
204204
mir_for_ctfe => { table }
205+
mir_generator_info => { table }
205206
promoted_mir => { table }
206207
def_span => { table }
207208
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
@@ -1426,6 +1426,10 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
14261426
debug!("EntryBuilder::encode_mir({:?})", def_id);
14271427
if encode_opt {
14281428
record!(self.tables.optimized_mir[def_id.to_def_id()] <- tcx.optimized_mir(def_id));
1429+
1430+
if let DefKind::Generator = self.tcx.def_kind(def_id) {
1431+
record!(self.tables.mir_generator_info[def_id.to_def_id()] <- tcx.mir_generator_info(def_id));
1432+
}
14291433
}
14301434
if encode_const {
14311435
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
@@ -363,6 +363,7 @@ define_tables! {
363363
object_lifetime_default: Table<DefIndex, LazyValue<ObjectLifetimeDefault>>,
364364
optimized_mir: Table<DefIndex, LazyValue<mir::Body<'static>>>,
365365
mir_for_ctfe: Table<DefIndex, LazyValue<mir::Body<'static>>>,
366+
mir_generator_info: Table<DefIndex, LazyValue<mir::GeneratorInfo<'static>>>,
366367
promoted_mir: Table<DefIndex, LazyValue<IndexVec<mir::Promoted, mir::Body<'static>>>>,
367368
// FIXME(compiler-errors): Why isn't this a LazyArray?
368369
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)