@@ -414,7 +414,8 @@ fn create_pointer_type(cx: @CrateContext, t: ty::t, span: span,
414
414
let fname = filename_from_span ( cx, span) ;
415
415
let file_node = create_file ( cx, fname) ;
416
416
//let cu_node = create_compile_unit(cx, fname);
417
- let llnode = create_derived_type ( tg, file_node. node , ~"", 0 , size * 8 ,
417
+ let name = ty_to_str ( cx. tcx , t) ;
418
+ let llnode = create_derived_type ( tg, file_node. node , name, 0 , size * 8 ,
418
419
align * 8 , 0 , pointee. node ) ;
419
420
let mdval = @Metadata {
420
421
node : llnode,
@@ -536,33 +537,48 @@ fn create_tuple(cx: @CrateContext, t: ty::t, elements: &[ty::t], span: span)
536
537
return mdval;
537
538
}
538
539
539
- fn create_boxed_type ( cx : @CrateContext , outer : ty:: t , _inner : ty:: t ,
540
+ // returns (void* type as a ValueRef, size in bytes, align in bytes)
541
+ fn voidptr ( ) -> ( ValueRef , int , int ) {
542
+ let null = ptr:: null ( ) ;
543
+ let size = sys:: size_of :: < ValueRef > ( ) as int ;
544
+ let align = sys:: min_align_of :: < ValueRef > ( ) as int ;
545
+ let vp = create_derived_type ( PointerTypeTag , null, ~"", 0 ,
546
+ size, align, 0 , null) ;
547
+ return ( vp, size, align) ;
548
+ }
549
+
550
+ fn create_boxed_type ( cx : @CrateContext , contents : ty:: t ,
540
551
span : span , boxed : @Metadata < TyDescMetadata > )
541
552
-> @Metadata < TyDescMetadata > {
542
553
//let tg = StructureTypeTag;
543
554
/*let cache = cx.llmetadata;
544
555
match cached_metadata::<@Metadata<TyDescMetadata>>(
545
- cache, tg, {|md| ty::hash_ty(outer ) == ty::hash_ty(md.data.hash)}) {
556
+ cache, tg, {|md| ty::hash_ty(contents ) == ty::hash_ty(md.data.hash)}) {
546
557
option::Some(md) { return md; }
547
558
option::None {}
548
559
}*/
549
560
let fname = filename_from_span ( cx, span) ;
550
561
let file_node = create_file ( cx, fname) ;
551
562
//let cu_node = create_compile_unit_metadata(cx, fname);
552
- let uint_t = ty:: mk_uint ( cx. tcx ) ;
553
- let refcount_type = create_basic_type ( cx, uint_t , span) ;
554
- let scx = create_structure ( file_node ,
555
- @/ * bad * / copy ty_to_str ( cx . tcx , outer ) , 0 ) ;
563
+ let int_t = ty:: mk_int ( cx. tcx ) ;
564
+ let refcount_type = create_basic_type ( cx, int_t , span) ;
565
+ let name = ty_to_str ( cx . tcx , contents ) ;
566
+ let scx = create_structure ( file_node , @ fmt ! ( "box<%s>" , name ) , 0 ) ;
556
567
add_member ( scx, ~"refcnt", 0 , sys:: size_of :: < uint > ( ) as int ,
557
568
sys:: min_align_of :: < uint > ( ) as int , refcount_type. node ) ;
558
- add_member ( scx, ~"boxed", 0 , 8 , //XXX member_size_and_align(??)
559
- 8 , //XXX just a guess
560
- boxed. node ) ;
569
+ // the tydesc and other pointers should be irrelevant to the
570
+ // debugger, so treat them as void* types
571
+ let ( vp, vpsize, vpalign) = voidptr ( ) ;
572
+ add_member ( scx, ~"tydesc", 0 , vpsize, vpalign, vp) ;
573
+ add_member ( scx, ~"prev", 0 , vpsize, vpalign, vp) ;
574
+ add_member ( scx, ~"next", 0 , vpsize, vpalign, vp) ;
575
+ let ( size, align) = size_and_align_of ( cx, contents) ;
576
+ add_member ( scx, ~"boxed", 0 , size, align, boxed. node ) ;
561
577
let llnode = finish_structure ( scx) ;
562
578
let mdval = @Metadata {
563
579
node : llnode,
564
580
data : TyDescMetadata {
565
- hash : ty:: type_id ( outer )
581
+ hash : ty:: type_id ( contents )
566
582
}
567
583
} ;
568
584
//update_cache(cache, tg, tydesc_metadata(mdval));
@@ -600,33 +616,117 @@ fn create_composite_type(type_tag: int, name: &str, file: ValueRef,
600
616
return llmdnode ( lldata) ;
601
617
}
602
618
603
- fn create_vec ( cx : @CrateContext , vec_t : ty:: t , elem_t : ty:: t ,
604
- vec_ty_span : codemap:: span ) -> @Metadata < TyDescMetadata > {
619
+ fn create_fixed_vec ( cx : @CrateContext , vec_t : ty:: t , elem_t : ty:: t ,
620
+ len : int , span : span ) -> @Metadata < TyDescMetadata > {
621
+ let t_md = create_ty ( cx, elem_t, span) ;
622
+ let fname = filename_from_span ( cx, span) ;
623
+ let file_node = create_file ( cx, fname) ;
624
+ let ( size, align) = size_and_align_of ( cx, elem_t) ;
625
+ let subrange = llmdnode ( ~[ lltag ( SubrangeTag ) , lli64 ( 0 ) , lli64 ( len - 1 ) ] ) ;
626
+ let name = fmt ! ( "[%s]" , ty_to_str( cx. tcx, elem_t) ) ;
627
+ let array = create_composite_type ( ArrayTypeTag , name, file_node. node , 0 ,
628
+ size * len, align, 0 , Some ( t_md. node ) ,
629
+ Some ( ~[ subrange] ) ) ;
630
+ @Metadata {
631
+ node : array,
632
+ data : TyDescMetadata {
633
+ hash : ty:: type_id ( vec_t)
634
+ }
635
+ }
636
+ }
637
+
638
+ fn create_boxed_vec ( cx : @CrateContext , vec_t : ty:: t , elem_t : ty:: t ,
639
+ vec_ty_span : codemap:: span )
640
+ -> @Metadata < TyDescMetadata > {
605
641
let fname = filename_from_span ( cx, vec_ty_span) ;
606
642
let file_node = create_file ( cx, fname) ;
607
643
let elem_ty_md = create_ty ( cx, elem_t, vec_ty_span) ;
608
- let scx = create_structure ( file_node,
644
+ let vec_scx = create_structure ( file_node,
609
645
@/* bad* / copy ty_to_str ( cx. tcx , vec_t) , 0 ) ;
610
646
let size_t_type = create_basic_type ( cx, ty:: mk_uint ( cx. tcx ) , vec_ty_span) ;
611
- add_member ( scx , ~"fill", 0 , sys:: size_of :: < libc:: size_t > ( ) as int ,
647
+ add_member ( vec_scx , ~"fill", 0 , sys:: size_of :: < libc:: size_t > ( ) as int ,
612
648
sys:: min_align_of :: < libc:: size_t > ( ) as int , size_t_type. node ) ;
613
- add_member ( scx , ~"alloc", 0 , sys:: size_of :: < libc:: size_t > ( ) as int ,
649
+ add_member ( vec_scx , ~"alloc", 0 , sys:: size_of :: < libc:: size_t > ( ) as int ,
614
650
sys:: min_align_of :: < libc:: size_t > ( ) as int , size_t_type. node ) ;
615
651
let subrange = llmdnode ( ~[ lltag ( SubrangeTag ) , lli64 ( 0 ) , lli64 ( 0 ) ] ) ;
616
652
let ( arr_size, arr_align) = size_and_align_of ( cx, elem_t) ;
617
- let data_ptr = create_composite_type ( ArrayTypeTag , ~"", file_node. node , 0 ,
653
+ let name = fmt ! ( "[%s]" , ty_to_str( cx. tcx, elem_t) ) ;
654
+ let data_ptr = create_composite_type ( ArrayTypeTag , name, file_node. node , 0 ,
618
655
arr_size, arr_align, 0 ,
619
656
Some ( elem_ty_md. node ) ,
620
657
Some ( ~[ subrange] ) ) ;
621
- add_member ( scx , ~"data", 0 , 0 , // clang says the size should be 0
658
+ add_member ( vec_scx , ~"data", 0 , 0 , // clang says the size should be 0
622
659
sys:: min_align_of :: < u8 > ( ) as int , data_ptr) ;
660
+ let llnode = finish_structure ( vec_scx) ;
661
+ let vec_md = @Metadata {
662
+ node : llnode,
663
+ data : TyDescMetadata {
664
+ hash : ty:: type_id ( vec_t)
665
+ }
666
+ } ;
667
+
668
+ let box_scx = create_structure ( file_node, @fmt ! ( "box<%s>" , name) , 0 ) ;
669
+ let int_t = ty:: mk_int ( cx. tcx ) ;
670
+ let refcount_type = create_basic_type ( cx, int_t, vec_ty_span) ;
671
+ add_member ( box_scx, ~"refcnt", 0 , sys:: size_of :: < uint > ( ) as int ,
672
+ sys:: min_align_of :: < uint > ( ) as int , refcount_type. node ) ;
673
+ let ( vp, vpsize, vpalign) = voidptr ( ) ;
674
+ add_member ( box_scx, ~"tydesc", 0 , vpsize, vpalign, vp) ;
675
+ add_member ( box_scx, ~"prev", 0 , vpsize, vpalign, vp) ;
676
+ add_member ( box_scx, ~"next", 0 , vpsize, vpalign, vp) ;
677
+ let size = 2 * sys:: size_of :: < int > ( ) as int ;
678
+ let align = sys:: min_align_of :: < int > ( ) as int ;
679
+ add_member ( box_scx, ~"boxed", 0 , size, align, vec_md. node ) ;
680
+ let llnode = finish_structure ( box_scx) ;
681
+ let mdval = @Metadata {
682
+ node : llnode,
683
+ data : TyDescMetadata {
684
+ hash : ty:: type_id ( elem_t)
685
+ }
686
+ } ;
687
+ return mdval;
688
+ }
689
+
690
+ fn create_vec_slice ( cx : @CrateContext , vec_t : ty:: t , elem_t : ty:: t , span : span )
691
+ -> @Metadata < TyDescMetadata > {
692
+ let fname = filename_from_span ( cx, span) ;
693
+ let file_node = create_file ( cx, fname) ;
694
+ let elem_ty_md = create_ty ( cx, elem_t, span) ;
695
+ let uint_type = create_basic_type ( cx, ty:: mk_uint ( cx. tcx ) , span) ;
696
+ let elem_ptr = create_pointer_type ( cx, elem_t, span, elem_ty_md) ;
697
+ let scx = create_structure ( file_node, @ty_to_str ( cx. tcx , vec_t) , 0 ) ;
698
+ let ( _, ptr_size, ptr_align) = voidptr ( ) ;
699
+ add_member ( scx, ~"vec", 0 , ptr_size, ptr_align, elem_ptr. node ) ;
700
+ add_member ( scx, ~"length", 0 , sys:: size_of :: < uint > ( ) as int ,
701
+ sys:: min_align_of :: < uint > ( ) as int , uint_type. node ) ;
623
702
let llnode = finish_structure ( scx) ;
624
- @Metadata {
703
+ let mdval = @Metadata {
625
704
node : llnode,
626
705
data : TyDescMetadata {
627
706
hash : ty:: type_id ( vec_t)
628
707
}
629
- }
708
+ } ;
709
+ return mdval;
710
+ }
711
+
712
+ fn create_fn_ty ( cx : @CrateContext , fn_ty : ty:: t , inputs : ~[ ty:: t ] , output : ty:: t ,
713
+ span : span ) -> @Metadata < TyDescMetadata > {
714
+ let fname = filename_from_span ( cx, span) ;
715
+ let file_node = create_file ( cx, fname) ;
716
+ let ( vp, _, _) = voidptr ( ) ;
717
+ let output_md = create_ty ( cx, output, span) ;
718
+ let output_ptr_md = create_pointer_type ( cx, output, span, output_md) ;
719
+ let inputs_vals = do inputs. map |arg| { create_ty ( cx, * arg, span) . node } ;
720
+ let members = ~[ output_ptr_md. node , vp] + inputs_vals;
721
+ let llnode = create_composite_type ( SubroutineTag , ~"", file_node. node ,
722
+ 0 , 0 , 0 , 0 , None , Some ( members) ) ;
723
+ let mdval = @Metadata {
724
+ node : llnode,
725
+ data : TyDescMetadata {
726
+ hash : ty:: type_id ( fn_ty)
727
+ }
728
+ } ;
729
+ return mdval;
630
730
}
631
731
632
732
fn create_ty( cx : @CrateContext , t : ty:: t , span : span )
@@ -643,20 +743,42 @@ fn create_ty(cx: @CrateContext, t: ty::t, span: span)
643
743
match sty {
644
744
ty:: ty_nil | ty:: ty_bot | ty:: ty_bool | ty:: ty_int( _) | ty:: ty_uint( _)
645
745
| ty:: ty_float( _) => create_basic_type ( cx, t, span) ,
646
- ty:: ty_estr( _vstore) => {
647
- cx. sess . span_bug ( span, ~"debuginfo for estr NYI ")
746
+ ty:: ty_estr( ref vstore) => {
747
+ let i8_t = ty:: mk_i8 ( cx. tcx ) ;
748
+ match * vstore {
749
+ ty:: vstore_fixed( len) => {
750
+ create_fixed_vec ( cx, t, i8_t, len as int + 1 , span)
751
+ } ,
752
+ ty:: vstore_uniq | ty:: vstore_box => {
753
+ let box_md = create_boxed_vec ( cx, t, i8_t, span) ;
754
+ create_pointer_type ( cx, t, span, box_md)
755
+ }
756
+ ty:: vstore_slice( _region) => {
757
+ create_vec_slice ( cx, t, i8_t, span)
758
+ }
759
+ }
648
760
} ,
649
761
ty:: ty_enum( _did, ref _substs) => {
650
762
cx. sess . span_bug ( span, ~"debuginfo for enum NYI ")
651
763
}
652
- ty:: ty_box( ref _mt) => {
653
- cx. sess . span_bug ( span, ~"debuginfo for box NYI ")
764
+ ty:: ty_box( ref mt) | ty:: ty_uniq( ref mt) => {
765
+ let boxed = create_ty ( cx, mt. ty , span) ;
766
+ let box_md = create_boxed_type ( cx, mt. ty , span, boxed) ;
767
+ create_pointer_type ( cx, t, span, box_md)
654
768
} ,
655
- ty:: ty_uniq( ref _mt) => {
656
- cx. sess . span_bug ( span, ~"debuginfo for uniq NYI ")
657
- } ,
658
- ty:: ty_evec( ref _mt, ref _vstore) => {
659
- cx. sess . span_bug ( span, ~"debuginfo for evec NYI ")
769
+ ty:: ty_evec ( ref mt, ref vstore) => {
770
+ match * vstore {
771
+ ty:: vstore_fixed( len) => {
772
+ create_fixed_vec ( cx, t, mt. ty , len as int , span)
773
+ } ,
774
+ ty:: vstore_uniq | ty:: vstore_box => {
775
+ let box_md = create_boxed_vec ( cx, t, mt. ty , span) ;
776
+ create_pointer_type ( cx, t, span, box_md)
777
+ } ,
778
+ ty:: vstore_slice( _region) => {
779
+ create_vec_slice ( cx, t, mt. ty , span)
780
+ }
781
+ }
660
782
} ,
661
783
ty:: ty_ptr ( ref mt) => {
662
784
let pointee = create_ty ( cx, mt. ty , span) ;
@@ -665,8 +787,10 @@ fn create_ty(cx: @CrateContext, t: ty::t, span: span)
665
787
ty:: ty_rptr ( ref _region, ref _mt) => {
666
788
cx. sess . span_bug ( span, ~"debuginfo for rptr NYI ")
667
789
} ,
668
- ty:: ty_bare_fn( ref _barefnty) => {
669
- cx. sess . span_bug ( span, ~"debuginfo for bare_fn NYI ")
790
+ ty:: ty_bare_fn( ref barefnty) => {
791
+ let inputs = do barefnty. sig . inputs . map |a| { a. ty } ;
792
+ let output = barefnty. sig . output ;
793
+ create_fn_ty ( cx, t, inputs, output, span)
670
794
} ,
671
795
ty:: ty_closure ( ref _closurety) => {
672
796
cx. sess . span_bug ( span, ~"debuginfo for closure NYI ")
@@ -812,7 +936,7 @@ pub fn create_arg(bcx: block, arg: ast::arg, sp: span)
812
936
}
813
937
814
938
pub fn update_source_pos(cx: block, s: span) {
815
- if !cx.sess().opts.debuginfo {
939
+ if !cx.sess().opts.debuginfo || (*s.lo == 0 && *s.hi == 0) {
816
940
return;
817
941
}
818
942
let cm = cx.sess().codemap;
0 commit comments