diff options
| -rw-r--r-- | src/librustc_trans/trans/_match.rs | 3 | ||||
| -rw-r--r-- | src/librustc_trans/trans/controlflow.rs | 3 | ||||
| -rw-r--r-- | src/librustc_trans/trans/debuginfo.rs | 37 | ||||
| -rw-r--r-- | src/test/debuginfo/lexical-scope-in-for-loop.rs | 1 |
4 files changed, 42 insertions, 2 deletions
diff --git a/src/librustc_trans/trans/_match.rs b/src/librustc_trans/trans/_match.rs index 33fd14a441b..fb8006905f9 100644 --- a/src/librustc_trans/trans/_match.rs +++ b/src/librustc_trans/trans/_match.rs @@ -1554,7 +1554,8 @@ pub fn store_for_loop_binding<'blk, 'tcx>(bcx: Block<'blk, 'tcx>, -> Block<'blk, 'tcx> { let _icx = push_ctxt("match::store_for_loop_binding"); - if simple_identifier(&*pat).is_some() { + if simple_identifier(&*pat).is_some() && + bcx.sess().opts.debuginfo != FullDebugInfo { // Generate nicer LLVM for the common case of a `for` loop pattern // like `for x in blahblah { ... }`. let binding_type = node_id_type(bcx, pat.id); diff --git a/src/librustc_trans/trans/controlflow.rs b/src/librustc_trans/trans/controlflow.rs index b19faf4df1f..3b24ded6717 100644 --- a/src/librustc_trans/trans/controlflow.rs +++ b/src/librustc_trans/trans/controlflow.rs @@ -286,6 +286,7 @@ pub fn trans_for<'blk, 'tcx>(mut bcx: Block<'blk, 'tcx>, debug!("iterator type is {}, datum type is {}", ppaux::ty_to_string(bcx.tcx(), iterator_type), ppaux::ty_to_string(bcx.tcx(), iterator_datum.ty)); + let lliterator = load_ty(bcx, iterator_datum.val, iterator_datum.ty); // Create our basic blocks and set up our loop cleanups. @@ -365,6 +366,8 @@ pub fn trans_for<'blk, 'tcx>(mut bcx: Block<'blk, 'tcx>, llpayload, binding_cleanup_scope_id); + debuginfo::create_for_loop_var_metadata(body_bcx_in, pat); + // Codegen the body. body_bcx_out = trans_block(body_bcx_out, body, expr::Ignore); body_bcx_out = diff --git a/src/librustc_trans/trans/debuginfo.rs b/src/librustc_trans/trans/debuginfo.rs index 6226aace8a8..be4d584acb7 100644 --- a/src/librustc_trans/trans/debuginfo.rs +++ b/src/librustc_trans/trans/debuginfo.rs @@ -1049,6 +1049,43 @@ pub fn create_argument_metadata(bcx: Block, arg: &ast::Arg) { }) } +/// Creates debug information for the given for-loop variable. +/// +/// Adds the created metadata nodes directly to the crate's IR. +pub fn create_for_loop_var_metadata(bcx: Block, pat: &ast::Pat) { + if fn_should_be_ignored(bcx.fcx) { + return; + } + + let def_map = &bcx.tcx().def_map; + + pat_util::pat_bindings(def_map, pat, |_, node_id, span, spanned_ident| { + let datum = match bcx.fcx.lllocals.borrow().get(&node_id).cloned() { + Some(datum) => datum, + None => { + bcx.sess().span_bug(span, + format!("no entry in lllocals table for {}", + node_id).as_slice()); + } + }; + + if unsafe { llvm::LLVMIsAAllocaInst(datum.val) } == ptr::null_mut() { + bcx.sess().span_bug(span, "debuginfo::create_for_loop_var_metadata() - \ + Referenced variable location is not an alloca!"); + } + + let scope_metadata = scope_metadata(bcx.fcx, node_id, span); + + declare_local(bcx, + spanned_ident.node, + datum.ty, + scope_metadata, + DirectVariable { alloca: datum.val }, + LocalVariable, + span); + }) +} + pub fn get_cleanup_debug_loc_for_ast_node<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>, node_id: ast::NodeId, node_span: Span, diff --git a/src/test/debuginfo/lexical-scope-in-for-loop.rs b/src/test/debuginfo/lexical-scope-in-for-loop.rs index bcaebb5c153..7636ffdb07d 100644 --- a/src/test/debuginfo/lexical-scope-in-for-loop.rs +++ b/src/test/debuginfo/lexical-scope-in-for-loop.rs @@ -9,7 +9,6 @@ // except according to those terms. // ignore-android: FIXME(#10381) -// ignore-test: Not sure what is going on here --pcwalton // min-lldb-version: 310 // compile-flags:-g |
