提交 c4d9ada7 编写于 作者: E Eduard-Mihai Burtescu

rustc: place ZSTs first during struct field reordering.

上级 cdeb4b0d
...@@ -964,40 +964,37 @@ enum StructKind { ...@@ -964,40 +964,37 @@ enum StructKind {
let mut align = base_align; let mut align = base_align;
let mut primitive_align = base_align; let mut primitive_align = base_align;
let mut sized = true; let mut sized = true;
let mut offsets = vec![Size::from_bytes(0); fields.len()];
let mut inverse_memory_index: Vec<u32> = (0..fields.len() as u32).collect();
// Anything with repr(C) or repr(packed) doesn't optimize. // Anything with repr(C) or repr(packed) doesn't optimize.
// Neither do 1-member and 2-member structs. let optimize = match kind {
// In addition, code in trans assume that 2-element structs can become pairs.
// It's easier to just short-circuit here.
let (mut optimize, sort_ascending) = match kind {
StructKind::AlwaysSized | StructKind::AlwaysSized |
StructKind::MaybeUnsized => (fields.len() > 2, false), StructKind::MaybeUnsized |
StructKind::EnumVariant(discr) => { StructKind::EnumVariant(I8) => {
(discr.size().bytes() == 1, true) (repr.flags & ReprFlags::IS_UNOPTIMISABLE).is_empty()
} }
StructKind::EnumVariant(_) => false
}; };
optimize &= (repr.flags & ReprFlags::IS_UNOPTIMISABLE).is_empty();
let mut offsets = vec![Size::from_bytes(0); fields.len()];
let mut inverse_memory_index: Vec<u32> = (0..fields.len() as u32).collect();
if optimize { if optimize {
let end = if let StructKind::MaybeUnsized = kind { let end = if let StructKind::MaybeUnsized = kind {
fields.len() - 1 fields.len() - 1
} else { } else {
fields.len() fields.len()
}; };
if end > 0 { let optimizing = &mut inverse_memory_index[..end];
let optimizing = &mut inverse_memory_index[..end]; match kind {
if sort_ascending { StructKind::AlwaysSized |
StructKind::MaybeUnsized => {
optimizing.sort_by_key(|&x| {
// Place ZSTs first to avoid "interesting offsets",
// especially with only one or two non-ZST fields.
let f = &fields[x as usize];
(!f.is_zst(), cmp::Reverse(f.align.abi()))
})
}
StructKind::EnumVariant(_) => {
optimizing.sort_by_key(|&x| fields[x as usize].align.abi()); optimizing.sort_by_key(|&x| fields[x as usize].align.abi());
} else {
optimizing.sort_by(| &a, &b | {
let a = fields[a as usize].align.abi();
let b = fields[b as usize].align.abi();
b.cmp(&a)
});
} }
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册