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 19, 2014
1 parent f9a4849 commit b048114
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 1 deletion.
3 changes: 3 additions & 0 deletions src/librustc_trans/trans/controlflow.rs
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,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 @@ -356,6 +357,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
Original file line number Diff line number Diff line change
Expand Up @@ -1051,6 +1051,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
Original file line number Diff line number Diff line change
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 b048114

Please sign in to comment.