Skip to content

Commit 77a6d29

Browse files
committed
Address review comments
1 parent 15dbe65 commit 77a6d29

File tree

9 files changed

+39
-51
lines changed

9 files changed

+39
-51
lines changed

src/librustc/mir/mod.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -2995,7 +2995,7 @@ pub struct UnsafetyCheckResult {
29952995
}
29962996

29972997
newtype_index! {
2998-
pub struct GeneratorField {
2998+
pub struct GeneratorSavedLocal {
29992999
derive [HashStable]
30003000
DEBUG_FORMAT = "_{}",
30013001
}
@@ -3005,18 +3005,18 @@ newtype_index! {
30053005
#[derive(Clone, Debug, RustcEncodable, RustcDecodable, HashStable)]
30063006
pub struct GeneratorLayout<'tcx> {
30073007
/// The type of every local stored inside the generator.
3008-
pub field_tys: IndexVec<GeneratorField, Ty<'tcx>>,
3008+
pub field_tys: IndexVec<GeneratorSavedLocal, Ty<'tcx>>,
30093009

30103010
/// Which of the above fields are in each variant. Note that one field may
30113011
/// be stored in multiple variants.
3012-
pub variant_fields: IndexVec<VariantIdx, IndexVec<Field, GeneratorField>>,
3012+
pub variant_fields: IndexVec<VariantIdx, IndexVec<Field, GeneratorSavedLocal>>,
30133013

30143014
/// Names and scopes of all the stored generator locals.
30153015
/// NOTE(tmandry) This is *strictly* a temporary hack for codegen
30163016
/// debuginfo generation, and will be removed at some point.
30173017
/// Do **NOT** use it for anything else, local information should not be
30183018
/// in the MIR, please rely on local crate HIR or other side-channels.
3019-
pub __local_debuginfo_codegen_only_do_not_use: IndexVec<GeneratorField, LocalDecl<'tcx>>,
3019+
pub __local_debuginfo_codegen_only_do_not_use: IndexVec<GeneratorSavedLocal, LocalDecl<'tcx>>,
30203020
}
30213021

30223022
#[derive(Clone, Debug, RustcEncodable, RustcDecodable, HashStable)]
@@ -3582,7 +3582,7 @@ impl<'tcx> TypeFoldable<'tcx> for Field {
35823582
}
35833583
}
35843584

3585-
impl<'tcx> TypeFoldable<'tcx> for GeneratorField {
3585+
impl<'tcx> TypeFoldable<'tcx> for GeneratorSavedLocal {
35863586
fn super_fold_with<'gcx: 'tcx, F: TypeFolder<'gcx, 'tcx>>(&self, _: &mut F) -> Self {
35873587
*self
35883588
}

src/librustc/ty/layout.rs

+9-3
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,12 @@ impl<'a, 'tcx> LayoutCx<'tcx, TyCtxt<'a, 'tcx, 'tcx>> {
605605
}
606606

607607
ty::Generator(def_id, ref substs, _) => {
608+
// FIXME(tmandry): For fields that are repeated in multiple
609+
// variants in the GeneratorLayout, we need code to ensure that
610+
// the offset of these fields never change. Right now this is
611+
// not an issue since every variant has every field, but once we
612+
// optimize this we have to be more careful.
613+
608614
let discr_index = substs.prefix_tys(def_id, tcx).count();
609615
let prefix_tys = substs.prefix_tys(def_id, tcx)
610616
.chain(iter::once(substs.discr_ty(tcx)));
@@ -1691,7 +1697,7 @@ impl<'a, 'tcx, C> TyLayoutMethods<'tcx, C> for Ty<'tcx>
16911697

16921698
fn field(this: TyLayout<'tcx>, cx: &C, i: usize) -> C::TyLayout {
16931699
let tcx = cx.tcx();
1694-
let handle_discriminant = |discr: &Scalar| -> C::TyLayout {
1700+
let discr_layout = |discr: &Scalar| -> C::TyLayout {
16951701
let layout = LayoutDetails::scalar(cx, discr.clone());
16961702
MaybeResult::from_ok(TyLayout {
16971703
details: tcx.intern_layout(layout),
@@ -1781,7 +1787,7 @@ impl<'a, 'tcx, C> TyLayoutMethods<'tcx, C> for Ty<'tcx>
17811787
}
17821788
Variants::Multiple { ref discr, discr_index, .. } => {
17831789
if i == discr_index {
1784-
return handle_discriminant(discr);
1790+
return discr_layout(discr);
17851791
}
17861792
substs.prefix_tys(def_id, tcx).nth(i).unwrap()
17871793
}
@@ -1805,7 +1811,7 @@ impl<'a, 'tcx, C> TyLayoutMethods<'tcx, C> for Ty<'tcx>
18051811
// Discriminant field for enums (where applicable).
18061812
Variants::Multiple { ref discr, .. } => {
18071813
assert_eq!(i, 0);
1808-
return handle_discriminant(discr);
1814+
return discr_layout(discr);
18091815
}
18101816
}
18111817
}

src/librustc/ty/sty.rs

+8-10
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use crate::util::captures::Captures;
1616
use crate::mir::interpret::{Scalar, Pointer};
1717

1818
use smallvec::SmallVec;
19+
use std::borrow::Cow;
1920
use std::cmp::Ordering;
2021
use std::marker::PhantomData;
2122
use std::ops::Range;
@@ -513,16 +514,13 @@ impl<'a, 'gcx, 'tcx> GeneratorSubsts<'tcx> {
513514
/// Calls `f` with a reference to the name of the enumerator for the given
514515
/// variant `v`.
515516
#[inline]
516-
pub fn map_variant_name<R>(&self, v: VariantIdx, f: impl FnOnce(&str) -> R) -> R {
517-
let name = match v.as_usize() {
518-
Self::UNRESUMED => Self::UNRESUMED_NAME,
519-
Self::RETURNED => Self::RETURNED_NAME,
520-
Self::POISONED => Self::POISONED_NAME,
521-
_ => {
522-
return f(&format!("variant#{}", v.as_usize()));
523-
}
524-
};
525-
f(name)
517+
pub fn variant_name(&self, v: VariantIdx) -> Cow<'static, str> {
518+
match v.as_usize() {
519+
Self::UNRESUMED => Cow::from(Self::UNRESUMED_NAME),
520+
Self::RETURNED => Cow::from(Self::RETURNED_NAME),
521+
Self::POISONED => Cow::from(Self::POISONED_NAME),
522+
_ => Cow::from(format!("Suspend{}", v.as_usize() - 3))
523+
}
526524
}
527525

528526
/// The type of the state discriminant used in the generator type.

src/librustc_codegen_llvm/debuginfo/metadata.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -1575,7 +1575,7 @@ impl<'tcx> VariantInfo<'tcx> {
15751575
match self {
15761576
VariantInfo::Adt(variant) => f(&variant.ident.as_str()),
15771577
VariantInfo::Generator(substs, _, variant_index) =>
1578-
substs.map_variant_name(*variant_index, f),
1578+
f(&substs.variant_name(*variant_index)),
15791579
}
15801580
}
15811581

@@ -1720,16 +1720,16 @@ fn prepare_enum_metadata(
17201720
.collect(),
17211721
ty::Generator(_, substs, _) => substs
17221722
.variant_range(enum_def_id, cx.tcx)
1723-
.map(|v| substs.map_variant_name(v, |name| {
1724-
let name = SmallCStr::new(name);
1723+
.map(|variant_index| {
1724+
let name = SmallCStr::new(&substs.variant_name(variant_index));
17251725
unsafe {
17261726
Some(llvm::LLVMRustDIBuilderCreateEnumerator(
17271727
DIB(cx),
17281728
name.as_ptr(),
17291729
// FIXME: what if enumeration has i128 discriminant?
1730-
v.as_usize() as u64))
1730+
variant_index.as_usize() as u64))
17311731
}
1732-
}))
1732+
})
17331733
.collect(),
17341734
_ => bug!(),
17351735
};

src/librustc_codegen_llvm/type_of.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,10 @@ fn uncached_llvm_type<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>,
6363
write!(&mut name, "::{}", def.variants[index].ident).unwrap();
6464
}
6565
}
66-
if let (&ty::Generator(..), &layout::Variants::Single { index })
66+
if let (&ty::Generator(_, substs, _), &layout::Variants::Single { index })
6767
= (&layout.ty.sty, &layout.variants)
6868
{
69-
write!(&mut name, "::variant#{:?}", index).unwrap();
69+
write!(&mut name, "::{}", substs.variant_name(index)).unwrap();
7070
}
7171
Some(name)
7272
}

src/librustc_mir/borrow_check/nll/type_check/mod.rs

+2-19
Original file line numberDiff line numberDiff line change
@@ -684,25 +684,8 @@ impl<'a, 'b, 'gcx, 'tcx> TypeVerifier<'a, 'b, 'gcx, 'tcx> {
684684
}
685685
}
686686
}
687-
ty::Generator(def_id, substs, _) => {
688-
let variants = substs.state_tys(def_id, tcx).count();
689-
if index.as_usize() >= variants {
690-
PlaceTy::from_ty(
691-
span_mirbug_and_err!(
692-
self,
693-
place,
694-
"cast to variant #{:?} but generator only has {:?}",
695-
index,
696-
variants
697-
),
698-
)
699-
} else {
700-
PlaceTy {
701-
ty: base_ty,
702-
variant_index: Some(index),
703-
}
704-
}
705-
}
687+
// We do not need to handle generators here, because this runs
688+
// before the generator transform stage.
706689
_ => {
707690
let ty = if let Some(name) = maybe_name {
708691
span_mirbug_and_err!(

src/librustc_mir/transform/deaggregator.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ impl MirPass for Deaggregator {
5858
}
5959
AggregateKind::Generator(..) => {
6060
// Right now we only support initializing generators to
61-
// variant#0.
61+
// variant 0 (Unresumed).
6262
let variant_index = VariantIdx::new(0);
6363
set_discriminant = Some(Statement {
6464
kind: StatementKind::SetDiscriminant {

src/librustc_mir/transform/generator.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -561,12 +561,13 @@ fn compute_layout<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
561561
remap.insert(local, (var.ty, variant_index, idx));
562562
decls.push(var);
563563
}
564-
let field_tys = decls.iter().map(|field| field.ty).collect::<IndexVec<GeneratorField, _>>();
564+
let field_tys = decls.iter().map(|field| field.ty).collect::<IndexVec<_, _>>();
565565

566566
// Put every var in each variant, for now.
567-
let all_vars = (0..field_tys.len()).map(GeneratorField::from).collect();
567+
let all_vars = (0..field_tys.len()).map(GeneratorSavedLocal::from).collect();
568568
let empty_variants = iter::repeat(IndexVec::new()).take(3);
569569
let state_variants = iter::repeat(all_vars).take(suspending_blocks.count());
570+
570571
let layout = GeneratorLayout {
571572
field_tys,
572573
variant_fields: empty_variants.chain(state_variants).collect(),

src/test/debuginfo/generator-objects.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@
1010

1111
// gdb-command:run
1212
// gdb-command:print b
13-
// gdb-check:$1 = generator_objects::main::generator {__0: 0x[...], <<variant>>: {__state: 0, 0: generator_objects::main::generator::Unresumed, 1: generator_objects::main::generator::Returned, 2: generator_objects::main::generator::Panicked, 3: generator_objects::main::generator::variant#3 {[...]}, 4: generator_objects::main::generator::variant#4 {[...]}}}
13+
// gdb-check:$1 = generator_objects::main::generator {__0: 0x[...], <<variant>>: {__state: 0, 0: generator_objects::main::generator::Unresumed, 1: generator_objects::main::generator::Returned, 2: generator_objects::main::generator::Panicked, 3: generator_objects::main::generator::Suspend0 {[...]}, 4: generator_objects::main::generator::Suspend1 {[...]}}}
1414
// gdb-command:continue
1515
// gdb-command:print b
16-
// gdb-check:$2 = generator_objects::main::generator {__0: 0x[...], <<variant>>: {__state: 3, 0: generator_objects::main::generator::Unresumed, 1: generator_objects::main::generator::Returned, 2: generator_objects::main::generator::Panicked, 3: generator_objects::main::generator::variant#3 {c: 6, d: 7}, 4: generator_objects::main::generator::variant#4 {[...]}}}
16+
// gdb-check:$2 = generator_objects::main::generator {__0: 0x[...], <<variant>>: {__state: 3, 0: generator_objects::main::generator::Unresumed, 1: generator_objects::main::generator::Returned, 2: generator_objects::main::generator::Panicked, 3: generator_objects::main::generator::Suspend0 {c: 6, d: 7}, 4: generator_objects::main::generator::Suspend1 {[...]}}}
1717
// gdb-command:continue
1818
// gdb-command:print b
19-
// gdb-check:$3 = generator_objects::main::generator {__0: 0x[...], <<variant>>: {__state: 4, 0: generator_objects::main::generator::Unresumed, 1: generator_objects::main::generator::Returned, 2: generator_objects::main::generator::Panicked, 3: generator_objects::main::generator::variant#3 {[...]}, 4: generator_objects::main::generator::variant#4 {c: 7, d: 8}}}
19+
// gdb-check:$3 = generator_objects::main::generator {__0: 0x[...], <<variant>>: {__state: 4, 0: generator_objects::main::generator::Unresumed, 1: generator_objects::main::generator::Returned, 2: generator_objects::main::generator::Panicked, 3: generator_objects::main::generator::Suspend0 {[...]}, 4: generator_objects::main::generator::Suspend1 {c: 7, d: 8}}}
2020
// gdb-command:continue
2121
// gdb-command:print b
22-
// gdb-check:$4 = generator_objects::main::generator {__0: 0x[...], <<variant>>: {__state: 1, 0: generator_objects::main::generator::Unresumed, 1: generator_objects::main::generator::Returned, 2: generator_objects::main::generator::Panicked, 3: generator_objects::main::generator::variant#3 {[...]}, 4: generator_objects::main::generator::variant#4 {[...]}}}
22+
// gdb-check:$4 = generator_objects::main::generator {__0: 0x[...], <<variant>>: {__state: 1, 0: generator_objects::main::generator::Unresumed, 1: generator_objects::main::generator::Returned, 2: generator_objects::main::generator::Panicked, 3: generator_objects::main::generator::Suspend0 {[...]}, 4: generator_objects::main::generator::Suspend1 {[...]}}}
2323

2424
// === LLDB TESTS ==================================================================================
2525

0 commit comments

Comments
 (0)