@@ -565,8 +565,8 @@ fn create_boxed_type(cx: @CrateContext, contents: ty::t,
565
565
let fname = filename_from_span ( cx, span) ;
566
566
let file_node = create_file ( cx, fname) ;
567
567
//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) ;
570
570
let name = ty_to_str ( cx. tcx , contents) ;
571
571
let scx = create_structure ( file_node, @fmt ! ( "box<%s>" , name) , 0 ) ;
572
572
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,
621
621
return llmdnode ( lldata) ;
622
622
}
623
623
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 > {
626
646
let fname = filename_from_span ( cx, vec_ty_span) ;
627
647
let file_node = create_file ( cx, fname) ;
628
648
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,
630
650
@/* bad* / copy ty_to_str ( cx. tcx , vec_t) , 0 ) ;
631
651
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 ,
633
653
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 ,
635
655
sys:: min_align_of :: < libc:: size_t > ( ) as int , size_t_type. node ) ;
636
656
let subrange = llmdnode ( ~[ lltag ( SubrangeTag ) , lli64 ( 0 ) , lli64 ( 0 ) ] ) ;
637
657
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 ,
639
660
arr_size, arr_align, 0 ,
640
661
Some ( elem_ty_md. node ) ,
641
662
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
643
664
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 ) ;
644
707
let llnode = finish_structure ( scx) ;
645
- @Metadata {
708
+ let mdval = @Metadata {
646
709
node : llnode,
647
710
data : TyDescMetadata {
648
711
hash : ty:: type_id ( vec_t)
649
712
}
650
- }
713
+ } ;
714
+ return mdval;
651
715
}
652
716
653
717
fn create_ty( cx : @CrateContext , t : ty:: t , span : span )
@@ -664,8 +728,20 @@ fn create_ty(cx: @CrateContext, t: ty::t, span: span)
664
728
match sty {
665
729
ty:: ty_nil | ty:: ty_bot | ty:: ty_bool | ty:: ty_int( _) | ty:: ty_uint( _)
666
730
| 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
+ }
669
745
} ,
670
746
ty:: ty_enum( _did, ref _substs) => {
671
747
cx. sess . span_bug ( span, ~"debuginfo for enum NYI ")
@@ -675,8 +751,19 @@ fn create_ty(cx: @CrateContext, t: ty::t, span: span)
675
751
let box_md = create_boxed_type ( cx, mt. ty , span, boxed) ;
676
752
create_pointer_type ( cx, t, span, box_md)
677
753
} ,
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
+ }
680
767
} ,
681
768
ty:: ty_ptr ( ref mt) => {
682
769
let pointee = create_ty ( cx, mt. ty , span) ;
0 commit comments