@@ -581,7 +581,8 @@ fn tuple_metadata(cx: &mut CrateContext,
581
581
fn enum_metadata ( cx : & mut CrateContext ,
582
582
enum_type : ty:: t ,
583
583
enum_def_id : ast:: def_id ,
584
- substs : & ty:: substs ,
584
+ // _substs is only needed in the other version. Will go away with new snapshot.
585
+ _substs : & ty:: substs ,
585
586
span : span )
586
587
-> DIType {
587
588
@@ -1017,10 +1018,10 @@ fn fixed_vec_metadata(cx: &mut CrateContext,
1017
1018
} ;
1018
1019
}
1019
1020
1020
- fn boxed_vec_metadata ( cx : & mut CrateContext ,
1021
- element_type : ty:: t ,
1022
- span : span )
1023
- -> DICompositeType {
1021
+ fn vec_metadata ( cx : & mut CrateContext ,
1022
+ element_type : ty:: t ,
1023
+ span : span )
1024
+ -> DICompositeType {
1024
1025
1025
1026
let element_type_metadata = type_metadata ( cx, element_type, span) ;
1026
1027
let element_llvm_type = type_of:: type_of ( cx, element_type) ;
@@ -1045,14 +1046,25 @@ fn boxed_vec_metadata(cx: &mut CrateContext,
1045
1046
// fill alloc elements
1046
1047
let member_type_metadata = & [ int_type_metadata, int_type_metadata, array_type_metadata] ;
1047
1048
1048
- let vec_metadata = composite_type_metadata (
1049
+ return composite_type_metadata (
1049
1050
cx,
1050
1051
vec_llvm_type,
1051
1052
vec_type_name,
1052
1053
member_llvm_types,
1053
1054
member_names,
1054
1055
member_type_metadata,
1055
1056
span) ;
1057
+ }
1058
+
1059
+ fn boxed_vec_metadata ( cx : & mut CrateContext ,
1060
+ element_type : ty:: t ,
1061
+ span : span )
1062
+ -> DICompositeType {
1063
+
1064
+ let element_llvm_type = type_of:: type_of ( cx, element_type) ;
1065
+ let vec_llvm_type = Type :: vec ( cx. sess . targ_cfg . arch , & element_llvm_type) ;
1066
+ let vec_type_name: & str = fmt ! ( "[%s]" , ty_to_str( cx. tcx, element_type) ) ;
1067
+ let vec_metadata = vec_metadata ( cx, element_type, span) ;
1056
1068
1057
1069
return boxed_type_metadata (
1058
1070
cx,
@@ -1197,10 +1209,13 @@ fn type_metadata(cx: &mut CrateContext,
1197
1209
ty:: vstore_fixed( len) => {
1198
1210
fixed_vec_metadata ( cx, i8_t, len + 1 , span)
1199
1211
} ,
1200
- ty:: vstore_uniq |
1212
+ ty:: vstore_uniq => {
1213
+ let vec_metadata = vec_metadata ( cx, i8_t, span) ;
1214
+ pointer_type_metadata ( cx, t, vec_metadata)
1215
+ }
1201
1216
ty:: vstore_box => {
1202
- let box_metadata = boxed_vec_metadata ( cx, i8_t, span) ;
1203
- pointer_type_metadata ( cx, t, box_metadata )
1217
+ let boxed_vec_metadata = boxed_vec_metadata ( cx, i8_t, span) ;
1218
+ pointer_type_metadata ( cx, t, boxed_vec_metadata )
1204
1219
}
1205
1220
ty:: vstore_slice( _region) => {
1206
1221
vec_slice_metadata ( cx, t, i8_t, span)
@@ -1217,12 +1232,19 @@ fn type_metadata(cx: &mut CrateContext,
1217
1232
match * vstore {
1218
1233
ty:: vstore_fixed( len) => {
1219
1234
fixed_vec_metadata ( cx, mt. ty , len, span)
1220
- } ,
1221
- ty:: vstore_uniq |
1222
- ty:: vstore_box => {
1223
- let box_metadata = boxed_vec_metadata ( cx, mt. ty , span) ;
1224
- pointer_type_metadata ( cx, t, box_metadata)
1225
- } ,
1235
+ }
1236
+ ty:: vstore_uniq if ty:: type_contents ( cx. tcx , mt. ty ) . contains_managed ( ) => {
1237
+ let boxed_vec_metadata = boxed_vec_metadata ( cx, mt. ty , span) ;
1238
+ pointer_type_metadata ( cx, t, boxed_vec_metadata)
1239
+ }
1240
+ ty:: vstore_uniq => {
1241
+ let vec_metadata = vec_metadata ( cx, mt. ty , span) ;
1242
+ pointer_type_metadata ( cx, t, vec_metadata)
1243
+ }
1244
+ ty:: vstore_box => {
1245
+ let boxed_vec_metadata = boxed_vec_metadata ( cx, mt. ty , span) ;
1246
+ pointer_type_metadata ( cx, t, boxed_vec_metadata)
1247
+ }
1226
1248
ty:: vstore_slice( _) => {
1227
1249
vec_slice_metadata ( cx, t, mt. ty , span)
1228
1250
}
0 commit comments