Skip to content

Commit 7aab9e7

Browse files
committed
---
yaml --- r: 6825 b: refs/heads/master c: df6052c h: refs/heads/master i: 6823: bf720a1 v: v3
1 parent 4381a07 commit 7aab9e7

File tree

7 files changed

+173
-391
lines changed

7 files changed

+173
-391
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: c6f16ed2c418268f2acbb8728f265b3b960f8efd
2+
refs/heads/master: df6052c4f88fbc9118411967d236576ae45d7dc5

trunk/src/comp/middle/ast_map.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,15 @@ import syntax::{visit, codemap};
77
tag ast_node {
88
node_item(@item);
99
node_obj_ctor(@item);
10+
node_obj_method(@method);
1011
node_native_item(@native_item);
1112
node_method(@method);
1213
node_expr(@expr);
1314
// Locals are numbered, because the alias analysis needs to know in which
1415
// order they are introduced.
1516
node_arg(arg, uint);
1617
node_local(uint);
18+
node_res_ctor(@item);
1719
}
1820

1921
type map = std::map::hashmap<node_id, ast_node>;
@@ -63,9 +65,17 @@ fn map_arm(cx: ctx, arm: arm) {
6365
fn map_item(cx: ctx, i: @item) {
6466
cx.map.insert(i.id, node_item(i));
6567
alt i.node {
66-
item_obj(_, _, ctor_id) { cx.map.insert(ctor_id, node_obj_ctor(i)); }
68+
item_obj(ob, _, ctor_id) {
69+
cx.map.insert(ctor_id, node_obj_ctor(i));
70+
for m in ob.methods {
71+
cx.map.insert(m.node.id, node_obj_method(m));
72+
}
73+
}
6774
item_impl(_, _, ms) {
6875
for m in ms { cx.map.insert(m.node.id, node_method(m)); }
76+
item_res(_, dtor_id, _, ctor_id) {
77+
cx.map.insert(ctor_id, node_res_ctor(i));
78+
cx.map.insert(dtor_id, node_item(i));
6979
}
7080
_ { }
7181
}

trunk/src/comp/middle/debuginfo.rs

Lines changed: 57 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,7 @@ import util::ppaux::ty_to_str;
1111
export create_local_var;
1212
export create_function;
1313
export create_arg;
14-
export add_line_info;
1514
export update_source_pos;
16-
export invalidate_source_pos;
17-
export revalidate_source_pos;
1815
export debug_ctxt;
1916

2017
const LLVMDebugVersion: int = (9 << 16);
@@ -98,7 +95,7 @@ type metadata<T> = {node: ValueRef, data: T};
9895

9996
type file_md = {path: str};
10097
type compile_unit_md = {path: str};
101-
type subprogram_md = {name: str, file: str};
98+
type subprogram_md = {path: str};
10299
type local_var_md = {id: ast::node_id};
103100
type tydesc_md = {hash: uint};
104101
type block_md = {start: codemap::loc, end: codemap::loc};
@@ -232,7 +229,7 @@ fn create_block(cx: @block_ctxt) -> @metadata<block_md> {
232229
}
233230

234231
let parent = alt cx.parent {
235-
trans_common::parent_none. { function_metadata_from_block(cx).node }
232+
trans_common::parent_none. { create_function(cx.fcx).node }
236233
trans_common::parent_some(bcx) { create_block(cx).node }
237234
};
238235
let file_node = create_file(bcx_ccx(cx), fname);
@@ -595,14 +592,6 @@ fn create_ty(cx: @crate_ctxt, t: ty::t, ty: @ast::ty) -> @metadata<tydesc_md> {
595592
};
596593
}
597594

598-
fn function_metadata_from_block(bcx: @block_ctxt) -> @metadata<subprogram_md> {
599-
let cx = bcx_ccx(bcx);
600-
let fcx = bcx_fcx(bcx);
601-
let fn_node = cx.ast_map.get(fcx.id);
602-
let fn_item = alt fn_node { ast_map::node_item(item) { item } };
603-
ret create_function(fcx, fn_item, fcx.llfn);
604-
}
605-
606595
fn filename_from_span(cx: @crate_ctxt, sp: codemap::span) -> str {
607596
codemap::lookup_char_pos(cx.sess.get_codemap(), sp.lo).filename
608597
}
@@ -640,7 +629,7 @@ fn create_local_var(bcx: @block_ctxt, local: @ast::local)
640629
let tymd = create_ty(cx, ty, local.node.ty);
641630
let filemd = create_file(cx, loc.filename);
642631
let context = alt bcx.parent {
643-
trans_common::parent_none. { function_metadata_from_block(bcx).node }
632+
trans_common::parent_none. { create_function(bcx.fcx).node }
644633
trans_common::parent_some(_) { create_block(bcx).node }
645634
};
646635
let mdnode = create_var(tg, context, name, filemd.node,
@@ -662,7 +651,6 @@ fn create_local_var(bcx: @block_ctxt, local: @ast::local)
662651
ret mdval;
663652
}
664653

665-
//FIXME: consolidate with create_local_var
666654
fn create_arg(bcx: @block_ctxt, arg: ast::arg)
667655
-> @metadata<argument_md> unsafe {
668656
let fcx = bcx_fcx(bcx);
@@ -683,9 +671,7 @@ fn create_arg(bcx: @block_ctxt, arg: ast::arg)
683671
let ty = trans::node_id_type(cx, arg.id);
684672
let tymd = create_ty(cx, ty, arg.ty);
685673
let filemd = create_file(cx, loc.filename);
686-
let fn_node = cx.ast_map.get(fcx.id);
687-
let fn_item = alt fn_node { ast_map::node_item(item) { item } };
688-
let context = create_function(fcx, fn_item, fcx.llfn);
674+
let context = create_function(bcx.fcx);
689675
let mdnode = create_var(tg, context.node, arg.ident, filemd.node,
690676
loc.line as int, tymd.node);
691677
let mdval = @{node: mdnode, data: {id: arg.id}};
@@ -700,92 +686,76 @@ fn create_arg(bcx: @block_ctxt, arg: ast::arg)
700686
ret mdval;
701687
}
702688

703-
fn update_source_pos(cx: @block_ctxt, s: codemap::span) -> @debug_source_pos {
704-
let dsp = @debug_source_pos(cx);
689+
fn update_source_pos(cx: @block_ctxt, s: codemap::span) {
705690
if !bcx_ccx(cx).sess.get_opts().debuginfo {
706-
ret dsp;
691+
ret;
707692
}
708693
let cm = bcx_ccx(cx).sess.get_codemap();
709-
if vec::is_empty(cx.source_pos.pos) {
710-
cx.source_pos.usable = true;
711-
}
712-
cx.source_pos.pos += [codemap::lookup_char_pos(cm, s.lo)]; //XXX maybe hi
713-
ret dsp;
694+
let blockmd = create_block(cx);
695+
let loc = codemap::lookup_char_pos(cm, s.lo);
696+
let scopedata = [lli32(loc.line as int),
697+
lli32(loc.col as int),
698+
blockmd.node,
699+
llnull()];
700+
let dbgscope = llmdnode(scopedata);
701+
llvm::LLVMSetCurrentDebugLocation(trans_build::B(cx), dbgscope);
714702
}
715703

716-
fn invalidate_source_pos(cx: @block_ctxt) -> @invalidated_source_pos {
717-
let isp = @invalidated_source_pos(cx);
718-
if !bcx_ccx(cx).sess.get_opts().debuginfo {
719-
ret isp;
720-
}
721-
cx.source_pos.usable = false;
722-
ret isp;
723-
}
704+
fn create_function(fcx: @fn_ctxt) -> @metadata<subprogram_md> {
705+
let cx = fcx_ccx(fcx);
706+
let dbg_cx = option::get(cx.dbg_cx);
724707

725-
fn revalidate_source_pos(cx: @block_ctxt) {
726-
if !bcx_ccx(cx).sess.get_opts().debuginfo {
727-
ret;
728-
}
729-
cx.source_pos.usable = true;
730-
}
708+
log "~~";
709+
log fcx.id;
710+
log cx.sess.span_str(fcx.sp);
731711

732-
fn reset_source_pos(cx: @block_ctxt) {
733-
if !bcx_ccx(cx).sess.get_opts().debuginfo {
734-
ret;
735-
}
736-
vec::pop(cx.source_pos.pos);
737-
}
712+
let (ident, ret_ty, id) = alt cx.ast_map.get(fcx.id) {
713+
ast_map::node_item(item) {
714+
alt item.node {
715+
ast::item_fn(f, _) | ast::item_res(f, _, _, _) {
716+
(item.ident, f.decl.output, item.id)
717+
}
718+
}
719+
}
720+
ast_map::node_obj_method(method) {
721+
(method.node.ident, method.node.meth.decl.output, method.node.id)
722+
}
723+
ast_map::node_res_ctor(item) {
724+
alt item.node { ast::item_res(f, _, _, ctor_id) {
725+
(item.ident, f.decl.output, ctor_id)
726+
}}
727+
}
728+
ast_map::node_expr(expr) {
729+
alt expr.node {
730+
ast::expr_fn(f) {
731+
(dbg_cx.names.next("fn"), f.decl.output, expr.id)
732+
}
733+
}
734+
}
735+
};
738736

739-
resource debug_source_pos(bcx: @block_ctxt) {
740-
reset_source_pos(bcx);
741-
}
742-
resource invalidated_source_pos(bcx: @block_ctxt) {
743-
revalidate_source_pos(bcx);
744-
}
737+
log ident;
738+
log id;
739+
740+
let path = str::connect(fcx.lcx.path + [ident], "::");
745741

746-
fn add_line_info(cx: @block_ctxt, llinstr: ValueRef) {
747-
if !bcx_ccx(cx).sess.get_opts().debuginfo ||
748-
!cx.source_pos.usable ||
749-
vec::is_empty(cx.source_pos.pos) {
750-
ret;
751-
}
752-
let loc = option::get(vec::last(cx.source_pos.pos));
753-
let blockmd = create_block(cx);
754-
let kind = "dbg";
755-
str::as_buf(kind, {|sbuf|
756-
let kind_id = llvm::LLVMGetMDKindID(sbuf,
757-
str::byte_len(kind));
758-
let scopedata = [lli32(loc.line as int),
759-
lli32(loc.col as int),
760-
blockmd.node,
761-
llnull()];
762-
let dbgscope = llmdnode(scopedata);
763-
llvm::LLVMSetMetadata(llinstr, kind_id, dbgscope)
764-
});
765-
}
766-
767-
fn create_function(fcx: @fn_ctxt, item: @ast::item, llfndecl: ValueRef)
768-
-> @metadata<subprogram_md> {
769-
let cx = fcx_ccx(fcx);
770742
let cache = get_cache(cx);
771743
alt cached_metadata::<@metadata<subprogram_md>>(
772-
cache, SubprogramTag, {|md| md.data.name == item.ident &&
744+
cache, SubprogramTag, {|md| md.data.path == path &&
773745
/*md.data.path == ??*/ true}) {
774746
option::some(md) { ret md; }
775747
option::none. {}
776748
}
777749

778750
let loc = codemap::lookup_char_pos(cx.sess.get_codemap(),
779-
item.span.lo);
751+
fcx.sp.lo);
780752
let file_node = create_file(cx, loc.filename).node;
781-
let mangled = cx.item_symbols.get(item.id);
782-
let ret_ty = alt item.node {
783-
ast::item_fn(f, _) { f.decl.output }
784-
};
753+
let key = cx.item_symbols.contains_key(fcx.id) ? fcx.id : id;
754+
let mangled = cx.item_symbols.get(key);
785755
let ty_node = if cx.sess.get_opts().extra_debuginfo {
786756
alt ret_ty.node {
787757
ast::ty_nil. { llnull() }
788-
_ { create_ty(cx, ty::node_id_to_type(ccx_tcx(cx), item.id),
758+
_ { create_ty(cx, ty::node_id_to_type(ccx_tcx(cx), id),
789759
ret_ty).node }
790760
}
791761
} else {
@@ -798,8 +768,8 @@ fn create_function(fcx: @fn_ctxt, item: @ast::item, llfndecl: ValueRef)
798768
let fn_metadata = [lltag(SubprogramTag),
799769
llunused(),
800770
file_node,
801-
llstr(item.ident),
802-
llstr(item.ident), //XXX fully-qualified C++ name
771+
llstr(ident),
772+
llstr(path), //XXX fully-qualified C++ name
803773
llstr(mangled), //XXX MIPS name?????
804774
file_node,
805775
lli32(loc.line as int),
@@ -811,15 +781,14 @@ fn create_function(fcx: @fn_ctxt, item: @ast::item, llfndecl: ValueRef)
811781
llnull(), // base type with vtbl
812782
lli1(false), // artificial
813783
lli1(cx.sess.get_opts().optimize != 0u),
814-
llfndecl
784+
fcx.llfn
815785
//list of template params
816786
//func decl descriptor
817787
//list of func vars
818788
];
819789
let val = llmdnode(fn_metadata);
820790
add_named_metadata(cx, "llvm.dbg.sp", val);
821-
let mdval = @{node: val, data: {name: item.ident,
822-
file: loc.filename}};
791+
let mdval = @{node: val, data: {path: path}};
823792
update_cache(cache, SubprogramTag, subprogram_metadata(mdval));
824793
ret mdval;
825794
}

0 commit comments

Comments
 (0)