Skip to content

Commit

Permalink
debuginfo: Create debuginfo for for-loop variables again.
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelwoerister committed Dec 23, 2014
1 parent 62fb41c commit 6f88258
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 2 deletions.
3 changes: 2 additions & 1 deletion src/librustc_trans/trans/_match.rs
Expand Up @@ -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);
Expand Down
3 changes: 3 additions & 0 deletions src/librustc_trans/trans/controlflow.rs
Expand Up @@ -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.
Expand Down Expand Up @@ -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 =
Expand Down
37 changes: 37 additions & 0 deletions src/librustc_trans/trans/debuginfo.rs
Expand Up @@ -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,
Expand Down
1 change: 0 additions & 1 deletion src/test/debuginfo/lexical-scope-in-for-loop.rs
Expand Up @@ -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
Expand Down

0 comments on commit 6f88258

Please sign in to comment.