debuginfo: Create debuginfo for for-loop variables again.

This commit is contained in:
Michael Woerister 2014-12-19 09:48:28 +01:00
parent 62fb41c32b
commit 6f88258f1d
4 changed files with 42 additions and 2 deletions

View File

@ -1554,7 +1554,8 @@ pub fn store_for_loop_binding<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
-> Block<'blk, 'tcx> { -> Block<'blk, 'tcx> {
let _icx = push_ctxt("match::store_for_loop_binding"); 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 // Generate nicer LLVM for the common case of a `for` loop pattern
// like `for x in blahblah { ... }`. // like `for x in blahblah { ... }`.
let binding_type = node_id_type(bcx, pat.id); let binding_type = node_id_type(bcx, pat.id);

View File

@ -286,6 +286,7 @@ pub fn trans_for<'blk, 'tcx>(mut bcx: Block<'blk, 'tcx>,
debug!("iterator type is {}, datum type is {}", debug!("iterator type is {}, datum type is {}",
ppaux::ty_to_string(bcx.tcx(), iterator_type), ppaux::ty_to_string(bcx.tcx(), iterator_type),
ppaux::ty_to_string(bcx.tcx(), iterator_datum.ty)); ppaux::ty_to_string(bcx.tcx(), iterator_datum.ty));
let lliterator = load_ty(bcx, iterator_datum.val, iterator_datum.ty); let lliterator = load_ty(bcx, iterator_datum.val, iterator_datum.ty);
// Create our basic blocks and set up our loop cleanups. // 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, llpayload,
binding_cleanup_scope_id); binding_cleanup_scope_id);
debuginfo::create_for_loop_var_metadata(body_bcx_in, pat);
// Codegen the body. // Codegen the body.
body_bcx_out = trans_block(body_bcx_out, body, expr::Ignore); body_bcx_out = trans_block(body_bcx_out, body, expr::Ignore);
body_bcx_out = body_bcx_out =

View File

@ -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>, pub fn get_cleanup_debug_loc_for_ast_node<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,
node_id: ast::NodeId, node_id: ast::NodeId,
node_span: Span, node_span: Span,

View File

@ -9,7 +9,6 @@
// except according to those terms. // except according to those terms.
// ignore-android: FIXME(#10381) // ignore-android: FIXME(#10381)
// ignore-test: Not sure what is going on here --pcwalton
// min-lldb-version: 310 // min-lldb-version: 310
// compile-flags:-g // compile-flags:-g