@@ -1224,25 +1224,42 @@ impl MemberDescriptionFactory {
1224
1224
}
1225
1225
1226
1226
struct StructMemberDescriptionFactory {
1227
- fields : Vec < ty:: field > ,
1227
+ fields : Vec < ty:: field > ,
1228
+ is_simd : bool ,
1228
1229
span : Span ,
1229
1230
}
1230
1231
1231
1232
impl StructMemberDescriptionFactory {
1232
- fn create_member_descriptions ( & self , cx : & CrateContext )
1233
- -> Vec < MemberDescription > {
1234
- self . fields . iter ( ) . map ( |field| {
1233
+ fn create_member_descriptions ( & self , cx : & CrateContext ) -> Vec < MemberDescription > {
1234
+ if self . fields . len ( ) == 0 {
1235
+ return Vec :: new ( ) ;
1236
+ }
1237
+
1238
+ let field_size = if self . is_simd {
1239
+ machine:: llsize_of_alloc ( cx, type_of:: type_of ( cx, self . fields . get ( 0 ) . mt . ty ) )
1240
+ } else {
1241
+ 0xdeadbeef
1242
+ } ;
1243
+
1244
+ self . fields . iter ( ) . enumerate ( ) . map ( |( i, field) | {
1235
1245
let name = if field. ident . name == special_idents:: unnamed_field. name {
1236
1246
"" . to_strbuf ( )
1237
1247
} else {
1238
1248
token:: get_ident ( field. ident ) . get ( ) . to_strbuf ( )
1239
1249
} ;
1240
1250
1251
+ let offset = if self . is_simd {
1252
+ assert ! ( field_size != 0xdeadbeef ) ;
1253
+ FixedMemberOffset { bytes : i as u64 * field_size }
1254
+ } else {
1255
+ ComputedMemberOffset
1256
+ } ;
1257
+
1241
1258
MemberDescription {
1242
1259
name : name,
1243
1260
llvm_type : type_of:: type_of ( cx, field. mt . ty ) ,
1244
1261
type_metadata : type_metadata ( cx, field. mt . ty , self . span ) ,
1245
- offset : ComputedMemberOffset ,
1262
+ offset : offset ,
1246
1263
}
1247
1264
} ) . collect ( )
1248
1265
}
@@ -1278,6 +1295,7 @@ fn prepare_struct_metadata(cx: &CrateContext,
1278
1295
file_metadata : file_metadata,
1279
1296
member_description_factory : StructMD ( StructMemberDescriptionFactory {
1280
1297
fields : fields,
1298
+ is_simd : ty:: type_is_simd ( cx. tcx ( ) , struct_type) ,
1281
1299
span : span,
1282
1300
} ) ,
1283
1301
}
@@ -1690,7 +1708,7 @@ fn prepare_enum_metadata(cx: &CrateContext,
1690
1708
}
1691
1709
1692
1710
enum MemberOffset {
1693
- FixedMemberOffset { bytes : uint } ,
1711
+ FixedMemberOffset { bytes : u64 } ,
1694
1712
// For ComputedMemberOffset, the offset is read from the llvm type definition
1695
1713
ComputedMemberOffset
1696
1714
}
@@ -2225,13 +2243,7 @@ fn type_metadata(cx: &CrateContext,
2225
2243
trait_metadata ( cx, def_id, t, substs, store, bounds)
2226
2244
}
2227
2245
ty:: ty_struct( def_id, ref substs) => {
2228
- if ty:: type_is_simd ( cx. tcx ( ) , t) {
2229
- let element_type = ty:: simd_type ( cx. tcx ( ) , t) ;
2230
- let len = ty:: simd_size ( cx. tcx ( ) , t) ;
2231
- fixed_vec_metadata ( cx, element_type, len, usage_site_span)
2232
- } else {
2233
- prepare_struct_metadata ( cx, t, def_id, substs, usage_site_span) . finalize ( cx)
2234
- }
2246
+ prepare_struct_metadata ( cx, t, def_id, substs, usage_site_span) . finalize ( cx)
2235
2247
}
2236
2248
ty:: ty_tup( ref elements) => {
2237
2249
prepare_tuple_metadata ( cx,
0 commit comments