From a8ceab9cd78aa276ac988866be8344e92322e09c Mon Sep 17 00:00:00 2001 From: Eduard-Mihai Burtescu Date: Mon, 21 May 2018 18:30:55 +0300 Subject: [PATCH 1/2] rustc_codegen_llvm: remove debuginfo::VariableKind::CapturedVariable. --- src/librustc_codegen_llvm/debuginfo/mod.rs | 12 ++---------- src/librustc_codegen_llvm/mir/mod.rs | 2 +- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/src/librustc_codegen_llvm/debuginfo/mod.rs b/src/librustc_codegen_llvm/debuginfo/mod.rs index 294d8cbbd932d..803966145f773 100644 --- a/src/librustc_codegen_llvm/debuginfo/mod.rs +++ b/src/librustc_codegen_llvm/debuginfo/mod.rs @@ -147,7 +147,6 @@ pub enum VariableAccess<'a> { pub enum VariableKind { ArgumentVariable(usize /*index*/), LocalVariable, - CapturedVariable, } /// Create any deferred debug metadata nodes @@ -478,6 +477,7 @@ pub fn declare_local<'a, 'tcx>(bx: &Builder<'a, 'tcx>, variable_access: VariableAccess, variable_kind: VariableKind, span: Span) { + assert!(!dbg_context.get_ref(span).source_locations_enabled.get()); let cx = bx.cx; let file = span_start(cx, span).file; @@ -490,8 +490,7 @@ pub fn declare_local<'a, 'tcx>(bx: &Builder<'a, 'tcx>, let (argument_index, dwarf_tag) = match variable_kind { ArgumentVariable(index) => (index as c_uint, DW_TAG_arg_variable), - LocalVariable | - CapturedVariable => (0, DW_TAG_auto_variable) + LocalVariable => (0, DW_TAG_auto_variable) }; let align = cx.align_of(variable_type); @@ -529,14 +528,7 @@ pub fn declare_local<'a, 'tcx>(bx: &Builder<'a, 'tcx>, llvm::LLVMSetInstDebugLocation(bx.llbuilder, instr); } - } - } - - match variable_kind { - ArgumentVariable(_) | CapturedVariable => { - assert!(!dbg_context.get_ref(span).source_locations_enabled.get()); source_loc::set_debug_location(bx, UnknownLocation); } - _ => { /* nothing to do */ } } } diff --git a/src/librustc_codegen_llvm/mir/mod.rs b/src/librustc_codegen_llvm/mir/mod.rs index 47b153203110c..a91a6e251aa7d 100644 --- a/src/librustc_codegen_llvm/mir/mod.rs +++ b/src/librustc_codegen_llvm/mir/mod.rs @@ -634,7 +634,7 @@ fn arg_local_refs<'a, 'tcx>(bx: &Builder<'a, 'tcx>, ty, scope, variable_access, - VariableKind::CapturedVariable, + VariableKind::LocalVariable, DUMMY_SP ); } From da579ef75e4a8ca11fb98b24a0a3ea0c7ccffeeb Mon Sep 17 00:00:00 2001 From: Eduard-Mihai Burtescu Date: Mon, 21 May 2018 20:38:41 +0300 Subject: [PATCH 2/2] rustc_codegen_llvm: remove closure env alloca hack around upvar debuginfo. --- src/librustc_codegen_llvm/mir/mod.rs | 24 ++---------------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/src/librustc_codegen_llvm/mir/mod.rs b/src/librustc_codegen_llvm/mir/mod.rs index a91a6e251aa7d..d34f881bf9dd8 100644 --- a/src/librustc_codegen_llvm/mir/mod.rs +++ b/src/librustc_codegen_llvm/mir/mod.rs @@ -583,23 +583,6 @@ fn arg_local_refs<'a, 'tcx>(bx: &Builder<'a, 'tcx>, }; let upvar_tys = upvar_substs.upvar_tys(def_id, tcx); - // Store the pointer to closure data in an alloca for debuginfo - // because that's what the llvm.dbg.declare intrinsic expects. - - // FIXME(eddyb) this shouldn't be necessary but SROA seems to - // mishandle DW_OP_plus not preceded by DW_OP_deref, i.e. it - // doesn't actually strip the offset when splitting the closure - // environment into its components so it ends up out of bounds. - let env_ptr = if !env_ref { - let scratch = PlaceRef::alloca(bx, - bx.cx.layout_of(tcx.mk_mut_ptr(arg.layout.ty)), - "__debuginfo_env_ptr"); - bx.store(place.llval, scratch.llval, scratch.align); - scratch.llval - } else { - place.llval - }; - 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(); @@ -611,10 +594,7 @@ fn arg_local_refs<'a, 'tcx>(bx: &Builder<'a, 'tcx>, }; // The environment and the capture can each be indirect. - - // FIXME(eddyb) see above why we have to keep - // a pointer in an alloca for debuginfo atm. - let mut ops = if env_ref || true { &ops[..] } else { &ops[1..] }; + let mut ops = if env_ref { &ops[..] } else { &ops[1..] }; let ty = if let (true, &ty::TyRef(_, ty, _)) = (decl.by_ref, &ty.sty) { ty @@ -624,7 +604,7 @@ fn arg_local_refs<'a, 'tcx>(bx: &Builder<'a, 'tcx>, }; let variable_access = VariableAccess::IndirectVariable { - alloca: env_ptr, + alloca: place.llval, address_operations: &ops }; declare_local(