Skip to content

Commit 917d5ab

Browse files
committed
Add debug info for vectors
1 parent 3c08be9 commit 917d5ab

File tree

1 file changed

+102
-15
lines changed

1 file changed

+102
-15
lines changed

src/librustc/middle/trans/debuginfo.rs

Lines changed: 102 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -565,8 +565,8 @@ fn create_boxed_type(cx: @CrateContext, contents: ty::t,
565565
let fname = filename_from_span(cx, span);
566566
let file_node = create_file(cx, fname);
567567
//let cu_node = create_compile_unit_metadata(cx, fname);
568-
let uint_t = ty::mk_uint(cx.tcx);
569-
let refcount_type = create_basic_type(cx, uint_t, span);
568+
let int_t = ty::mk_int(cx.tcx);
569+
let refcount_type = create_basic_type(cx, int_t, span);
570570
let name = ty_to_str(cx.tcx, contents);
571571
let scx = create_structure(file_node, @fmt!("box<%s>", name), 0);
572572
add_member(scx, ~"refcnt", 0, sys::size_of::<uint>() as int,
@@ -621,33 +621,97 @@ fn create_composite_type(type_tag: int, name: &str, file: ValueRef,
621621
return llmdnode(lldata);
622622
}
623623

624-
fn create_vec(cx: @CrateContext, vec_t: ty::t, elem_t: ty::t,
625-
vec_ty_span: codemap::span) -> @Metadata<TyDescMetadata> {
624+
fn create_fixed_vec(cx: @CrateContext, vec_t: ty::t, elem_t: ty::t,
625+
len: int, span: span) -> @Metadata<TyDescMetadata> {
626+
let t_md = create_ty(cx, elem_t, span);
627+
let fname = filename_from_span(cx, span);
628+
let file_node = create_file(cx, fname);
629+
let (size, align) = size_and_align_of(cx, elem_t);
630+
let subrange = llmdnode(~[lltag(SubrangeTag), lli64(0), lli64(len - 1)]);
631+
let name = fmt!("[%s]", ty_to_str(cx.tcx, elem_t));
632+
let array = create_composite_type(ArrayTypeTag, name, file_node.node, 0,
633+
size * len, align, 0, Some(t_md.node),
634+
Some(~[subrange]));
635+
@Metadata {
636+
node: array,
637+
data: TyDescMetadata {
638+
hash: ty::type_id(vec_t)
639+
}
640+
}
641+
}
642+
643+
fn create_boxed_vec(cx: @CrateContext, vec_t: ty::t, elem_t: ty::t,
644+
vec_ty_span: codemap::span)
645+
-> @Metadata<TyDescMetadata> {
626646
let fname = filename_from_span(cx, vec_ty_span);
627647
let file_node = create_file(cx, fname);
628648
let elem_ty_md = create_ty(cx, elem_t, vec_ty_span);
629-
let scx = create_structure(file_node,
649+
let vec_scx = create_structure(file_node,
630650
@/*bad*/ copy ty_to_str(cx.tcx, vec_t), 0);
631651
let size_t_type = create_basic_type(cx, ty::mk_uint(cx.tcx), vec_ty_span);
632-
add_member(scx, ~"fill", 0, sys::size_of::<libc::size_t>() as int,
652+
add_member(vec_scx, ~"fill", 0, sys::size_of::<libc::size_t>() as int,
633653
sys::min_align_of::<libc::size_t>() as int, size_t_type.node);
634-
add_member(scx, ~"alloc", 0, sys::size_of::<libc::size_t>() as int,
654+
add_member(vec_scx, ~"alloc", 0, sys::size_of::<libc::size_t>() as int,
635655
sys::min_align_of::<libc::size_t>() as int, size_t_type.node);
636656
let subrange = llmdnode(~[lltag(SubrangeTag), lli64(0), lli64(0)]);
637657
let (arr_size, arr_align) = size_and_align_of(cx, elem_t);
638-
let data_ptr = create_composite_type(ArrayTypeTag, ~"", file_node.node, 0,
658+
let name = fmt!("[%s]", ty_to_str(cx.tcx, elem_t));
659+
let data_ptr = create_composite_type(ArrayTypeTag, name, file_node.node, 0,
639660
arr_size, arr_align, 0,
640661
Some(elem_ty_md.node),
641662
Some(~[subrange]));
642-
add_member(scx, ~"data", 0, 0, // clang says the size should be 0
663+
add_member(vec_scx, ~"data", 0, 0, // clang says the size should be 0
643664
sys::min_align_of::<u8>() as int, data_ptr);
665+
let llnode = finish_structure(vec_scx);
666+
let vec_md = @Metadata {
667+
node: llnode,
668+
data: TyDescMetadata {
669+
hash: ty::type_id(vec_t)
670+
}
671+
};
672+
673+
let box_scx = create_structure(file_node, @fmt!("box<%s>", name), 0);
674+
let int_t = ty::mk_int(cx.tcx);
675+
let refcount_type = create_basic_type(cx, int_t, vec_ty_span);
676+
add_member(box_scx, ~"refcnt", 0, sys::size_of::<uint>() as int,
677+
sys::min_align_of::<uint>() as int, refcount_type.node);
678+
let (vp, vpsize, vpalign) = voidptr();
679+
add_member(box_scx, ~"tydesc", 0, vpsize, vpalign, vp);
680+
add_member(box_scx, ~"prev", 0, vpsize, vpalign, vp);
681+
add_member(box_scx, ~"next", 0, vpsize, vpalign, vp);
682+
let size = 2 * sys::size_of::<int>() as int;
683+
let align = sys::min_align_of::<int>() as int;
684+
add_member(box_scx, ~"boxed", 0, size, align, vec_md.node);
685+
let llnode = finish_structure(box_scx);
686+
let mdval = @Metadata {
687+
node: llnode,
688+
data: TyDescMetadata {
689+
hash: ty::type_id(elem_t)
690+
}
691+
};
692+
return mdval;
693+
}
694+
695+
fn create_vec_slice(cx: @CrateContext, vec_t: ty::t, elem_t: ty::t, span: span)
696+
-> @Metadata<TyDescMetadata> {
697+
let fname = filename_from_span(cx, span);
698+
let file_node = create_file(cx, fname);
699+
let elem_ty_md = create_ty(cx, elem_t, span);
700+
let uint_type = create_basic_type(cx, ty::mk_uint(cx.tcx), span);
701+
let elem_ptr = create_pointer_type(cx, elem_t, span, elem_ty_md);
702+
let scx = create_structure(file_node, @ty_to_str(cx.tcx, vec_t), 0);
703+
let (_, ptr_size, ptr_align) = voidptr();
704+
add_member(scx, ~"vec", 0, ptr_size, ptr_align, elem_ptr.node);
705+
add_member(scx, ~"length", 0, sys::size_of::<uint>() as int,
706+
sys::min_align_of::<uint>() as int, uint_type.node);
644707
let llnode = finish_structure(scx);
645-
@Metadata {
708+
let mdval = @Metadata {
646709
node: llnode,
647710
data: TyDescMetadata {
648711
hash: ty::type_id(vec_t)
649712
}
650-
}
713+
};
714+
return mdval;
651715
}
652716

653717
fn create_ty(cx: @CrateContext, t: ty::t, span: span)
@@ -664,8 +728,20 @@ fn create_ty(cx: @CrateContext, t: ty::t, span: span)
664728
match sty {
665729
ty::ty_nil | ty::ty_bot | ty::ty_bool | ty::ty_int(_) | ty::ty_uint(_)
666730
| ty::ty_float(_) => create_basic_type(cx, t, span),
667-
ty::ty_estr(_vstore) => {
668-
cx.sess.span_bug(span, ~"debuginfo for estr NYI")
731+
ty::ty_estr(ref vstore) => {
732+
let i8_t = ty::mk_i8(cx.tcx);
733+
match *vstore {
734+
ty::vstore_fixed(len) => {
735+
create_fixed_vec(cx, t, i8_t, len as int + 1, span)
736+
},
737+
ty::vstore_uniq | ty::vstore_box => {
738+
let box_md = create_boxed_vec(cx, t, i8_t, span);
739+
create_pointer_type(cx, t, span, box_md)
740+
}
741+
ty::vstore_slice(_region) => {
742+
create_vec_slice(cx, t, i8_t, span)
743+
}
744+
}
669745
},
670746
ty::ty_enum(_did, ref _substs) => {
671747
cx.sess.span_bug(span, ~"debuginfo for enum NYI")
@@ -675,8 +751,19 @@ fn create_ty(cx: @CrateContext, t: ty::t, span: span)
675751
let box_md = create_boxed_type(cx, mt.ty, span, boxed);
676752
create_pointer_type(cx, t, span, box_md)
677753
},
678-
ty::ty_evec(ref _mt, ref _vstore) => {
679-
cx.sess.span_bug(span, ~"debuginfo for evec NYI")
754+
ty::ty_evec(ref mt, ref vstore) => {
755+
match *vstore {
756+
ty::vstore_fixed(len) => {
757+
create_fixed_vec(cx, t, mt.ty, len as int, span)
758+
},
759+
ty::vstore_uniq | ty::vstore_box => {
760+
let box_md = create_boxed_vec(cx, t, mt.ty, span);
761+
create_pointer_type(cx, t, span, box_md)
762+
},
763+
ty::vstore_slice(_region) => {
764+
create_vec_slice(cx, t, mt.ty, span)
765+
}
766+
}
680767
},
681768
ty::ty_ptr(ref mt) => {
682769
let pointee = create_ty(cx, mt.ty, span);

0 commit comments

Comments
 (0)