Fix up local variable support so it actually works.

This commit is contained in:
Josh Matthews 2011-11-18 02:55:01 -05:00
parent e95c56f855
commit 0b303523bd
3 changed files with 36 additions and 22 deletions

View File

@ -221,7 +221,7 @@ fn get_ty_metadata(cx: @crate_ctxt, t: ty::t, ty: @ast::ty) -> @metadata<tydesc_
option::some(md) { ret md; }
option::none. {}
}
let (name, size, flags) = alt ty.node {
let (name, size, encoding) = alt ty.node {
ast::ty_bool. { ("bool", 1, DW_ATE_boolean) }
ast::ty_int. { ("int", 32, DW_ATE_signed) } //XXX machine-dependent?
ast::ty_uint. { ("uint", 32, DW_ATE_unsigned) } //XXX machine-dependent?
@ -240,15 +240,19 @@ fn get_ty_metadata(cx: @crate_ctxt, t: ty::t, ty: @ast::ty) -> @metadata<tydesc_
} }
ast::ty_char. { ("char", 32, DW_ATE_unsigned) }
};
let fname = filename_from_span(cx, ty.span);
let file_node = get_file_metadata(cx, fname);
let cu_node = get_compile_unit_metadata(cx, fname);
let lldata = [lltag(BasicTypeDescriptorTag),
llunused(), //XXX scope context
cu_node.node,
llstr(name),
llnull(), //XXX basic types only
file_node.node,
lli32(0), //XXX basic types only
lli64(size),
lli64(32), //XXX alignment?
lli64(0), //XXX offset?
lli32(flags)];
lli32(0), //XXX flags?
lli32(encoding)];
let llnode = llmdnode(lldata);
let mdval = @{node: llnode, data: {hash: ty::hash_ty(t)}};
update_cache(cache, BasicTypeDescriptorTag, tydesc_metadata(mdval));
@ -266,6 +270,10 @@ fn function_metadata_from_block(bcx: @block_ctxt) -> @metadata<subprogram_md> {
get_function_metadata(cx, fn_item, fcx.llfn)
}
fn filename_from_span(cx: @crate_ctxt, sp: codemap::span) -> str {
codemap::lookup_char_pos(cx.sess.get_codemap(), sp.lo).filename
}
fn get_local_var_metadata(bcx: @block_ctxt, local: @ast::local)
-> @metadata<local_var_md> unsafe {
let cx = bcx_ccx(bcx);
@ -293,8 +301,7 @@ fn get_local_var_metadata(bcx: @block_ctxt, local: @ast::local)
filemd.node,
lli32(loc.line as int), // line
tymd.node,
lli32(0), //XXX flags
llnull() // inline loc reference
lli32(0) //XXX flags
];
let mdnode = llmdnode(lldata);
let mdval = @{node: mdnode, data: {id: local.node.id}};
@ -310,9 +317,6 @@ fn get_local_var_metadata(bcx: @block_ctxt, local: @ast::local)
let declargs = [llmdnode([llptr]), mdnode];
trans_build::Call(bcx, cx.intrinsics.get("llvm.dbg.declare"),
declargs);
llvm::LLVMAddNamedMetadataOperand(cx.llmod, as_buf("llvm.dbg.vars"),
str::byte_len("llvm.dbg.vars"),
mdnode);
ret mdval;
}

View File

@ -23,7 +23,7 @@ import front::attr;
import middle::{ty, gc, resolve, debuginfo};
import middle::freevars::*;
import back::{link, abi, upcall};
import syntax::{ast, ast_util};
import syntax::{ast, ast_util, codemap};
import syntax::visit;
import syntax::codemap::span;
import syntax::print::pprust::{expr_to_str, stmt_to_str};
@ -4038,10 +4038,22 @@ fn trans_stmt(cx: @block_ctxt, s: ast::stmt) -> @block_ctxt {
_ { bcx_ccx(cx).sess.unimpl("stmt variant"); }
}
//debuginfo::reset_source_pos(cx);
ret bcx;
}
fn source_pos_from_block_parent(parent: block_parent)
-> (bool, [codemap::loc]) {
alt parent {
parent_none. { (false, []) }
parent_some(bcx) { (bcx.source_pos.usable,
alt vec::last(bcx.source_pos.pos) {
option::some(p) { [p] }
option::none. { [] }
})
}
}
}
// You probably don't want to use this one. See the
// next three functions instead.
fn new_block_ctxt(cx: @fn_ctxt, parent: block_parent, kind: block_kind,
@ -4053,6 +4065,7 @@ fn new_block_ctxt(cx: @fn_ctxt, parent: block_parent, kind: block_kind,
}
let llbb: BasicBlockRef =
str::as_buf(s, {|buf| llvm::LLVMAppendBasicBlock(cx.llfn, buf) });
let (usable, pos) = source_pos_from_block_parent(parent);
let bcx = @{llbb: llbb,
mutable terminated: false,
mutable unreachable: false,
@ -4063,8 +4076,7 @@ fn new_block_ctxt(cx: @fn_ctxt, parent: block_parent, kind: block_kind,
mutable lpad: option::none,
sp: cx.sp,
fcx: cx,
source_pos: {mutable usable: false,
mutable pos: []}};
source_pos: {mutable usable: usable, mutable pos: pos}};
alt parent {
parent_some(cx) {
if cx.unreachable { Unreachable(bcx); }
@ -4099,6 +4111,7 @@ fn new_sub_block_ctxt(bcx: @block_ctxt, n: str) -> @block_ctxt {
}
fn new_raw_block_ctxt(fcx: @fn_ctxt, llbb: BasicBlockRef) -> @block_ctxt {
let (usable, pos) = source_pos_from_block_parent(parent_none);
ret @{llbb: llbb,
mutable terminated: false,
mutable unreachable: false,
@ -4109,8 +4122,7 @@ fn new_raw_block_ctxt(fcx: @fn_ctxt, llbb: BasicBlockRef) -> @block_ctxt {
mutable lpad: option::none,
sp: fcx.sp,
fcx: fcx,
source_pos: {mutable usable: false,
mutable pos: []}};
source_pos: {mutable usable: usable, mutable pos: pos}};
}
@ -4168,6 +4180,7 @@ fn block_locals(b: ast::blk, it: block(@ast::local)) {
}
fn llstaticallocas_block_ctxt(fcx: @fn_ctxt) -> @block_ctxt {
let (usable, pos) = source_pos_from_block_parent(parent_none);
ret @{llbb: fcx.llstaticallocas,
mutable terminated: false,
mutable unreachable: false,
@ -4178,11 +4191,11 @@ fn llstaticallocas_block_ctxt(fcx: @fn_ctxt) -> @block_ctxt {
mutable lpad: option::none,
sp: fcx.sp,
fcx: fcx,
source_pos: {mutable usable: false,
mutable pos: []}};
source_pos: {mutable usable: usable, mutable pos: pos}};
}
fn llderivedtydescs_block_ctxt(fcx: @fn_ctxt) -> @block_ctxt {
let (usable, pos) = source_pos_from_block_parent(parent_none);
ret @{llbb: fcx.llderivedtydescs,
mutable terminated: false,
mutable unreachable: false,
@ -4193,8 +4206,7 @@ fn llderivedtydescs_block_ctxt(fcx: @fn_ctxt) -> @block_ctxt {
mutable lpad: option::none,
sp: fcx.sp,
fcx: fcx,
source_pos: {mutable usable: false,
mutable pos: []}};
source_pos: {mutable usable: usable, mutable pos: pos}};
}
@ -4271,14 +4283,12 @@ fn trans_block_dps(bcx: @block_ctxt, b: ast::blk, dest: dest)
for s: @ast::stmt in b.node.stmts {
let _s = debuginfo::update_source_pos(bcx, b.span);
bcx = trans_stmt(bcx, *s);
//debuginfo::reset_source_pos(bcx);
}
alt b.node.expr {
some(e) {
let bt = ty::type_is_bot(bcx_tcx(bcx), ty::expr_ty(bcx_tcx(bcx), e));
let _s = debuginfo::update_source_pos(bcx, e.span);
bcx = trans_expr(bcx, e, bt ? ignore : dest);
//debuginfo::reset_source_pos(bcx);
}
_ { assert dest == ignore || bcx.unreachable; }
}

View File

@ -670,7 +670,7 @@ fn Call(cx: @block_ctxt, Fn: ValueRef, Args: [ValueRef]) -> ValueRef {
unsafe {
let instr = llvm::LLVMBuildCall(B(cx), Fn, vec::to_ptr(Args),
vec::len(Args), noname());
//debuginfo::add_line_info(cx, instr);
debuginfo::add_line_info(cx, instr);
ret instr;
}
}