diff options
author | Flier Lu <flier.lu@gmail.com> | 2017-02-19 16:14:50 +0800 |
---|---|---|
committer | Flier Lu <flier.lu@gmail.com> | 2017-02-19 16:14:50 +0800 |
commit | 0494698adde7f35856145cd6a5f99f0adbfbe053 (patch) | |
tree | 802a66ad61463720a3062a902ea201c41fcb5d59 /src | |
parent | 99974add51bc247a11dffb14887cf2bf71816328 (diff) |
force pad bytes before large align field
Diffstat (limited to 'src')
-rw-r--r-- | src/codegen/struct_layout.rs | 6 | ||||
-rw-r--r-- | src/ir/layout.rs | 2 |
2 files changed, 5 insertions, 3 deletions
diff --git a/src/codegen/struct_layout.rs b/src/codegen/struct_layout.rs index 24938c16..724bef98 100644 --- a/src/codegen/struct_layout.rs +++ b/src/codegen/struct_layout.rs @@ -197,7 +197,7 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { }; // Otherwise the padding is useless. - let need_padding = padding_bytes >= field_layout.align; + let need_padding = padding_bytes >= field_layout.align || field_layout.align > mem::size_of::<*mut ()>(); self.latest_offset += padding_bytes; @@ -213,7 +213,7 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { field_layout); if need_padding && padding_bytes != 0 { - Some(Layout::new(padding_bytes, field_layout.align)) + Some(Layout::new(padding_bytes, cmp::min(field_layout.align, mem::size_of::<*mut ()>()))) } else { None } @@ -262,6 +262,8 @@ impl<'a, 'ctx> StructLayoutTracker<'a, 'ctx> { Layout::new(padding_bytes, layout.align) }; + debug!("pad bytes to struct {}, {:?}", name, layout); + Some(self.padding_field(layout)) } else { None diff --git a/src/ir/layout.rs b/src/ir/layout.rs index 38379261..f21a501c 100644 --- a/src/ir/layout.rs +++ b/src/ir/layout.rs @@ -38,7 +38,7 @@ impl Layout { /// alignment possible. pub fn for_size(size: usize) -> Self { let mut next_align = 2; - while size % next_align == 0 && next_align <= 2 * mem::size_of::<*mut ()>() { + while size % next_align == 0 && next_align <= mem::size_of::<*mut ()>() { next_align *= 2; } Layout { |