about summary refs log tree commit diff
path: root/src/librustc_codegen_ssa
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2019-03-02 08:40:14 +0000
committerbors <bors@rust-lang.org>2019-03-02 08:40:14 +0000
commit9cfed5da12bf65212eb9a4ae9141c2f39f995381 (patch)
treeb9826ff6f20dc5d997320efbeb31895d74c84202 /src/librustc_codegen_ssa
parenta21d82438b72a0394a670b6bfe95e3e62ee08802 (diff)
parent61097bce0dd4d394129ba15d2bbd41ec2dc526ef (diff)
downloadrust-9cfed5da12bf65212eb9a4ae9141c2f39f995381.tar.gz
rust-9cfed5da12bf65212eb9a4ae9141c2f39f995381.zip
Auto merge of #58077 - Nemo157:generator-state-debug-info, r=Zoxc
Add debug-info to access variables from generator state
Diffstat (limited to 'src/librustc_codegen_ssa')
-rw-r--r--src/librustc_codegen_ssa/mir/mod.rs35
1 files changed, 31 insertions, 4 deletions
diff --git a/src/librustc_codegen_ssa/mir/mod.rs b/src/librustc_codegen_ssa/mir/mod.rs
index dc77d4673cd..870b97401f4 100644
--- a/src/librustc_codegen_ssa/mir/mod.rs
+++ b/src/librustc_codegen_ssa/mir/mod.rs
@@ -659,15 +659,42 @@ fn arg_local_refs<'a, 'tcx: 'a, Bx: BuilderMethods<'a, 'tcx>>(
             };
             let upvar_tys = upvar_substs.upvar_tys(def_id, tcx);
 
-            for (i, (decl, ty)) in mir.upvar_decls.iter().zip(upvar_tys).enumerate() {
-                let byte_offset_of_var_in_env = closure_layout.fields.offset(i).bytes();
+            let extra_locals = {
+                let upvars = mir.upvar_decls
+                    .iter()
+                    .zip(upvar_tys)
+                    .enumerate()
+                    .map(|(i, (decl, ty))| (i, decl.debug_name, decl.by_ref, ty));
+
+                let generator_fields = mir.generator_layout.as_ref().map(|generator_layout| {
+                    let (def_id, gen_substs) = match closure_layout.ty.sty {
+                        ty::Generator(def_id, substs, _) => (def_id, substs),
+                        _ => bug!("generator layout without generator substs"),
+                    };
+                    let state_tys = gen_substs.state_tys(def_id, tcx);
+
+                    let upvar_count = mir.upvar_decls.len();
+                    generator_layout.fields
+                        .iter()
+                        .zip(state_tys)
+                        .enumerate()
+                        .filter_map(move |(i, (decl, ty))| {
+                            decl.name.map(|name| (i + upvar_count + 1, name, false, ty))
+                        })
+                }).into_iter().flatten();
+
+                upvars.chain(generator_fields)
+            };
+
+            for (field, name, by_ref, ty) in extra_locals {
+                let byte_offset_of_var_in_env = closure_layout.fields.offset(field).bytes();
 
                 let ops = bx.debuginfo_upvar_decls_ops_sequence(byte_offset_of_var_in_env);
 
                 // The environment and the capture can each be indirect.
                 let mut ops = if env_ref { &ops[..] } else { &ops[1..] };
 
-                let ty = if let (true, &ty::Ref(_, ty, _)) = (decl.by_ref, &ty.sty) {
+                let ty = if let (true, &ty::Ref(_, ty, _)) = (by_ref, &ty.sty) {
                     ty
                 } else {
                     ops = &ops[..ops.len() - 1];
@@ -680,7 +707,7 @@ fn arg_local_refs<'a, 'tcx: 'a, Bx: BuilderMethods<'a, 'tcx>>(
                 };
                 bx.declare_local(
                     &fx.debug_context,
-                    decl.debug_name,
+                    name,
                     ty,
                     scope,
                     variable_access,