diff options
author | Emilio Cobos Álvarez <emilio@crisal.io> | 2020-01-12 17:43:42 +0100 |
---|---|---|
committer | Emilio Cobos Álvarez <emilio@crisal.io> | 2020-01-13 02:33:01 +0100 |
commit | 7941b9107aa410e23cb172991085f1b1a0e83b07 (patch) | |
tree | da1fe45b37e98d041376553ec74d301e28e5a5d5 /src/codegen/struct_layout.rs | |
parent | 9a2ce1ca6e4dc740fdffa756e962af906e09a2a1 (diff) |
codegen: Max guaranteed alignment is 8 (with u64), not target pointer width.
Diffstat (limited to 'src/codegen/struct_layout.rs')
-rw-r--r-- | src/codegen/struct_layout.rs | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/src/codegen/struct_layout.rs b/src/codegen/struct_layout.rs index 45e779c9..6e3f57b2 100644 --- a/src/codegen/struct_layout.rs +++ b/src/codegen/struct_layout.rs @@ -9,6 +9,8 @@ use ir::ty::{Type, TypeKind}; use proc_macro2::{self, Ident, Span}; use std::cmp; +const MAX_GUARANTEED_ALIGN: usize = 8; + /// Trace the layout of struct. #[derive(Debug)] pub struct StructLayoutTracker<'a> { @@ -168,10 +170,10 @@ impl<'a> StructLayoutTracker<'a> { // much we can do about it. if let Some(layout) = self.ctx.resolve_type(inner).layout(self.ctx) { - if layout.align > self.ctx.target_pointer_size() { + if layout.align > MAX_GUARANTEED_ALIGN { field_layout.size = align_to(layout.size, layout.align) * len; - field_layout.align = self.ctx.target_pointer_size(); + field_layout.align = MAX_GUARANTEED_ALIGN; } } } @@ -191,7 +193,7 @@ impl<'a> StructLayoutTracker<'a> { // Otherwise the padding is useless. let need_padding = padding_bytes >= field_layout.align || - field_layout.align > self.ctx.target_pointer_size(); + field_layout.align > MAX_GUARANTEED_ALIGN; self.latest_offset += padding_bytes; @@ -213,10 +215,7 @@ impl<'a> StructLayoutTracker<'a> { if need_padding && padding_bytes != 0 { Some(Layout::new( padding_bytes, - cmp::min( - field_layout.align, - self.ctx.target_pointer_size(), - ), + cmp::min(field_layout.align, MAX_GUARANTEED_ALIGN), )) } else { None @@ -271,14 +270,14 @@ impl<'a> StructLayoutTracker<'a> { // regardless, because bitfields don't respect alignment as strictly as // other fields. if padding_bytes >= layout.align || - (self.last_field_was_bitfield && - padding_bytes >= self.latest_field_layout.unwrap().align) || - (!repr_align && layout.align > self.ctx.target_pointer_size()) + (self.last_field_was_bitfield && + padding_bytes >= self.latest_field_layout.unwrap().align) || + (!repr_align && layout.align > MAX_GUARANTEED_ALIGN) { let layout = if self.is_packed { Layout::new(padding_bytes, 1) } else if self.last_field_was_bitfield || - layout.align > self.ctx.target_pointer_size() + layout.align > MAX_GUARANTEED_ALIGN { // We've already given up on alignment here. Layout::for_size(self.ctx, padding_bytes) @@ -309,9 +308,9 @@ impl<'a> StructLayoutTracker<'a> { return false; } - // We can only generate up-to a word of alignment unless we support + // We can only generate up-to a 8-bytes of alignment unless we support // repr(align). - repr_align || layout.align <= self.ctx.target_pointer_size() + repr_align || layout.align <= MAX_GUARANTEED_ALIGN } fn padding_bytes(&self, layout: Layout) -> usize { |