}
struct StructMemberDescriptionFactory {
- fields: Vec<ty::field> ,
+ fields: Vec<ty::field>,
+ is_simd: bool,
span: Span,
}
impl StructMemberDescriptionFactory {
- fn create_member_descriptions(&self, cx: &CrateContext)
- -> Vec<MemberDescription> {
- self.fields.iter().map(|field| {
+ fn create_member_descriptions(&self, cx: &CrateContext) -> Vec<MemberDescription> {
+ if self.fields.len() == 0 {
+ return Vec::new();
+ }
+
+ let field_size = if self.is_simd {
+ machine::llsize_of_alloc(cx, type_of::type_of(cx, self.fields.get(0).mt.ty))
+ } else {
+ 0xdeadbeef
+ };
+
+ self.fields.iter().enumerate().map(|(i, field)| {
let name = if field.ident.name == special_idents::unnamed_field.name {
"".to_strbuf()
} else {
token::get_ident(field.ident).get().to_strbuf()
};
+ let offset = if self.is_simd {
+ assert!(field_size != 0xdeadbeef);
+ FixedMemberOffset { bytes: i as u64 * field_size }
+ } else {
+ ComputedMemberOffset
+ };
+
MemberDescription {
name: name,
llvm_type: type_of::type_of(cx, field.mt.ty),
type_metadata: type_metadata(cx, field.mt.ty, self.span),
- offset: ComputedMemberOffset,
+ offset: offset,
}
}).collect()
}
file_metadata: file_metadata,
member_description_factory: StructMD(StructMemberDescriptionFactory {
fields: fields,
+ is_simd: ty::type_is_simd(cx.tcx(), struct_type),
span: span,
}),
}
}
enum MemberOffset {
- FixedMemberOffset { bytes: uint },
+ FixedMemberOffset { bytes: u64 },
// For ComputedMemberOffset, the offset is read from the llvm type definition
ComputedMemberOffset
}
trait_metadata(cx, def_id, t, substs, store, bounds)
}
ty::ty_struct(def_id, ref substs) => {
- if ty::type_is_simd(cx.tcx(), t) {
- let element_type = ty::simd_type(cx.tcx(), t);
- let len = ty::simd_size(cx.tcx(), t);
- fixed_vec_metadata(cx, element_type, len, usage_site_span)
- } else {
- prepare_struct_metadata(cx, t, def_id, substs, usage_site_span).finalize(cx)
- }
+ prepare_struct_metadata(cx, t, def_id, substs, usage_site_span).finalize(cx)
}
ty::ty_tup(ref elements) => {
prepare_tuple_metadata(cx,