]> git.lizzy.rs Git - rust.git/commitdiff
debuginfo: Represent SIMD types as tuple structs instead of as fixed-sized arrays
authorMichael Woerister <michaelwoerister@posteo>
Wed, 26 Mar 2014 16:53:59 +0000 (17:53 +0100)
committerMichael Woerister <michaelwoerister@posteo>
Thu, 15 May 2014 07:37:43 +0000 (09:37 +0200)
src/librustc/middle/trans/debuginfo.rs

index e185d7702ff4d5d4789cb43654eb9b09ca51e4a4..c481efec8f1dfd63ff90caebcd654714f21fbc56 100644 (file)
@@ -1224,25 +1224,42 @@ fn create_member_descriptions(&self, cx: &CrateContext)
 }
 
 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()
     }
@@ -1278,6 +1295,7 @@ fn prepare_struct_metadata(cx: &CrateContext,
         file_metadata: file_metadata,
         member_description_factory: StructMD(StructMemberDescriptionFactory {
             fields: fields,
+            is_simd: ty::type_is_simd(cx.tcx(), struct_type),
             span: span,
         }),
     }
@@ -1690,7 +1708,7 @@ fn get_enum_discriminant_name(cx: &CrateContext, def_id: ast::DefId) -> token::I
 }
 
 enum MemberOffset {
-    FixedMemberOffset { bytes: uint },
+    FixedMemberOffset { bytes: u64 },
     // For ComputedMemberOffset, the offset is read from the llvm type definition
     ComputedMemberOffset
 }
@@ -2225,13 +2243,7 @@ fn create_pointer_to_box_metadata(cx: &CrateContext,
             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,