Skip to content

Commit 3fabb11

Browse files
debuginfo: Represent SIMD types as tuple structs instead of as fixed-sized arrays
1 parent 73a68cd commit 3fabb11

File tree

1 file changed

+25
-13
lines changed

1 file changed

+25
-13
lines changed

src/librustc/middle/trans/debuginfo.rs

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1224,25 +1224,42 @@ impl MemberDescriptionFactory {
12241224
}
12251225

12261226
struct StructMemberDescriptionFactory {
1227-
fields: Vec<ty::field> ,
1227+
fields: Vec<ty::field>,
1228+
is_simd: bool,
12281229
span: Span,
12291230
}
12301231

12311232
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)| {
12351245
let name = if field.ident.name == special_idents::unnamed_field.name {
12361246
"".to_strbuf()
12371247
} else {
12381248
token::get_ident(field.ident).get().to_strbuf()
12391249
};
12401250

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+
12411258
MemberDescription {
12421259
name: name,
12431260
llvm_type: type_of::type_of(cx, field.mt.ty),
12441261
type_metadata: type_metadata(cx, field.mt.ty, self.span),
1245-
offset: ComputedMemberOffset,
1262+
offset: offset,
12461263
}
12471264
}).collect()
12481265
}
@@ -1278,6 +1295,7 @@ fn prepare_struct_metadata(cx: &CrateContext,
12781295
file_metadata: file_metadata,
12791296
member_description_factory: StructMD(StructMemberDescriptionFactory {
12801297
fields: fields,
1298+
is_simd: ty::type_is_simd(cx.tcx(), struct_type),
12811299
span: span,
12821300
}),
12831301
}
@@ -1690,7 +1708,7 @@ fn prepare_enum_metadata(cx: &CrateContext,
16901708
}
16911709

16921710
enum MemberOffset {
1693-
FixedMemberOffset { bytes: uint },
1711+
FixedMemberOffset { bytes: u64 },
16941712
// For ComputedMemberOffset, the offset is read from the llvm type definition
16951713
ComputedMemberOffset
16961714
}
@@ -2225,13 +2243,7 @@ fn type_metadata(cx: &CrateContext,
22252243
trait_metadata(cx, def_id, t, substs, store, bounds)
22262244
}
22272245
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)
22352247
}
22362248
ty::ty_tup(ref elements) => {
22372249
prepare_tuple_metadata(cx,

0 commit comments

Comments
 (0)