@@ -207,7 +207,7 @@ use session::config::{self, FullDebugInfo, LimitedDebugInfo, NoDebugInfo};
207
207
use util:: nodemap:: { DefIdMap , NodeMap , FnvHashMap , FnvHashSet } ;
208
208
use util:: ppaux;
209
209
210
- use libc:: c_uint;
210
+ use libc:: { c_uint, c_longlong } ;
211
211
use std:: ffi:: CString ;
212
212
use std:: cell:: { Cell , RefCell } ;
213
213
use std:: ptr;
@@ -2764,7 +2764,7 @@ fn create_struct_stub(cx: &CrateContext,
2764
2764
fn fixed_vec_metadata < ' a , ' tcx > ( cx : & CrateContext < ' a , ' tcx > ,
2765
2765
unique_type_id : UniqueTypeId ,
2766
2766
element_type : Ty < ' tcx > ,
2767
- len : uint ,
2767
+ len : Option < u64 > ,
2768
2768
span : Span )
2769
2769
-> MetadataCreationResult {
2770
2770
let element_type_metadata = type_metadata ( cx, element_type, span) ;
@@ -2774,18 +2774,20 @@ fn fixed_vec_metadata<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,
2774
2774
let element_llvm_type = type_of:: type_of ( cx, element_type) ;
2775
2775
let ( element_type_size, element_type_align) = size_and_align_of ( cx, element_llvm_type) ;
2776
2776
2777
+ let ( array_size_in_bytes, upper_bound) = match len {
2778
+ Some ( len) => ( element_type_size * len, len as c_longlong ) ,
2779
+ None => ( 0 , -1 )
2780
+ } ;
2781
+
2777
2782
let subrange = unsafe {
2778
- llvm:: LLVMDIBuilderGetOrCreateSubrange (
2779
- DIB ( cx) ,
2780
- 0 ,
2781
- len as i64 )
2783
+ llvm:: LLVMDIBuilderGetOrCreateSubrange ( DIB ( cx) , 0 , upper_bound)
2782
2784
} ;
2783
2785
2784
2786
let subscripts = create_DIArray ( DIB ( cx) , & [ subrange] ) ;
2785
2787
let metadata = unsafe {
2786
2788
llvm:: LLVMDIBuilderCreateArrayType (
2787
2789
DIB ( cx) ,
2788
- bytes_to_bits ( element_type_size * ( len as u64 ) ) ,
2790
+ bytes_to_bits ( array_size_in_bytes ) ,
2789
2791
bytes_to_bits ( element_type_align) ,
2790
2792
element_type_metadata,
2791
2793
subscripts)
@@ -2991,12 +2993,12 @@ fn type_metadata<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,
2991
2993
ty:: ty_enum( def_id, _) => {
2992
2994
prepare_enum_metadata ( cx, t, def_id, unique_type_id, usage_site_span) . finalize ( cx)
2993
2995
}
2994
- ty:: ty_vec( typ, Some ( len) ) => {
2995
- fixed_vec_metadata ( cx, unique_type_id, typ, len, usage_site_span)
2996
+ ty:: ty_vec( typ, len) => {
2997
+ fixed_vec_metadata ( cx, unique_type_id, typ, len. map ( |x| x as u64 ) , usage_site_span)
2998
+ }
2999
+ ty:: ty_str => {
3000
+ fixed_vec_metadata ( cx, unique_type_id, cx. tcx ( ) . types . i8 , None , usage_site_span)
2996
3001
}
2997
- // FIXME Can we do better than this for unsized vec/str fields?
2998
- ty:: ty_vec( typ, None ) => fixed_vec_metadata ( cx, unique_type_id, typ, 0 , usage_site_span) ,
2999
- ty:: ty_str => fixed_vec_metadata ( cx, unique_type_id, cx. tcx ( ) . types . i8 , 0 , usage_site_span) ,
3000
3002
ty:: ty_trait( ..) => {
3001
3003
MetadataCreationResult :: new (
3002
3004
trait_pointer_metadata ( cx, t, None , unique_type_id) ,
0 commit comments