Skip to content

Commit 61097bc

Browse files
committed
Add debug-info to access variables from generator state
1 parent 3e58dab commit 61097bc

File tree

2 files changed

+39
-6
lines changed

2 files changed

+39
-6
lines changed

src/librustc_codegen_ssa/mir/mod.rs

+31-4
Original file line numberDiff line numberDiff line change
@@ -607,15 +607,42 @@ fn arg_local_refs<'a, 'tcx: 'a, Bx: BuilderMethods<'a, 'tcx>>(
607607
};
608608
let upvar_tys = upvar_substs.upvar_tys(def_id, tcx);
609609

610-
for (i, (decl, ty)) in mir.upvar_decls.iter().zip(upvar_tys).enumerate() {
611-
let byte_offset_of_var_in_env = closure_layout.fields.offset(i).bytes();
610+
let extra_locals = {
611+
let upvars = mir.upvar_decls
612+
.iter()
613+
.zip(upvar_tys)
614+
.enumerate()
615+
.map(|(i, (decl, ty))| (i, decl.debug_name, decl.by_ref, ty));
616+
617+
let generator_fields = mir.generator_layout.as_ref().map(|generator_layout| {
618+
let (def_id, gen_substs) = match closure_layout.ty.sty {
619+
ty::Generator(def_id, substs, _) => (def_id, substs),
620+
_ => bug!("generator layout without generator substs"),
621+
};
622+
let state_tys = gen_substs.state_tys(def_id, tcx);
623+
624+
let upvar_count = mir.upvar_decls.len();
625+
generator_layout.fields
626+
.iter()
627+
.zip(state_tys)
628+
.enumerate()
629+
.filter_map(move |(i, (decl, ty))| {
630+
decl.name.map(|name| (i + upvar_count + 1, name, false, ty))
631+
})
632+
}).into_iter().flatten();
633+
634+
upvars.chain(generator_fields)
635+
};
636+
637+
for (field, name, by_ref, ty) in extra_locals {
638+
let byte_offset_of_var_in_env = closure_layout.fields.offset(field).bytes();
612639

613640
let ops = bx.debuginfo_upvar_decls_ops_sequence(byte_offset_of_var_in_env);
614641

615642
// The environment and the capture can each be indirect.
616643
let mut ops = if env_ref { &ops[..] } else { &ops[1..] };
617644

618-
let ty = if let (true, &ty::Ref(_, ty, _)) = (decl.by_ref, &ty.sty) {
645+
let ty = if let (true, &ty::Ref(_, ty, _)) = (by_ref, &ty.sty) {
619646
ty
620647
} else {
621648
ops = &ops[..ops.len() - 1];
@@ -628,7 +655,7 @@ fn arg_local_refs<'a, 'tcx: 'a, Bx: BuilderMethods<'a, 'tcx>>(
628655
};
629656
bx.declare_local(
630657
&fx.debug_context,
631-
decl.debug_name,
658+
name,
632659
ty,
633660
scope,
634661
variable_access,

src/test/debuginfo/generators.rs

+8-2
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,20 @@
77
// gdb-command:run
88
// gdb-command:print a
99
// gdb-check:$1 = 5
10+
// gdb-command:print d
11+
// gdb-check:$2 = 6
1012

1113
// === LLDB TESTS ==================================================================================
1214

1315
// lldb-command:run
1416
// lldb-command:print a
1517
// lldbg-check:(int) $0 = 5
1618
// lldbr-check:(int) a = 5
19+
// lldb-command:print d
20+
// lldbg-check:(int) $1 = 6
21+
// lldbr-check:(int) d = 6
1722

18-
#![feature(omit_gdb_pretty_printer_section, generators, generator_trait, pin)]
23+
#![feature(omit_gdb_pretty_printer_section, generators, generator_trait)]
1924
#![omit_gdb_pretty_printer_section]
2025

2126
use std::ops::Generator;
@@ -24,9 +29,10 @@ use std::pin::Pin;
2429
fn main() {
2530
let mut a = 5;
2631
let mut b = || {
32+
let d = 6;
2733
yield;
2834
_zzz(); // #break
29-
a = 6;
35+
a = d;
3036
};
3137
Pin::new(&mut b).resume();
3238
Pin::new(&mut b).resume();

0 commit comments

Comments
 (0)