diff options
author | Richard Stallman <rms@gnu.org> | 1992-08-01 18:08:36 +0000 |
---|---|---|
committer | Richard Stallman <rms@gnu.org> | 1992-08-01 18:08:36 +0000 |
commit | e2301a83da536afd6b5d82b748019dd48d9cabc7 (patch) | |
tree | 40e73f0a23fc59f5585a281fd729089ba68d8b9c /gcc | |
parent | 88dd95c1c02029e682ed32d94452a21eac8c559a (diff) | |
download | gcc-e2301a83da536afd6b5d82b748019dd48d9cabc7.zip gcc-e2301a83da536afd6b5d82b748019dd48d9cabc7.tar.gz gcc-e2301a83da536afd6b5d82b748019dd48d9cabc7.tar.bz2 |
(layout_record): Take account of
maximum_field_alignment when using the field's alignment.
From-SVN: r1739
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/stor-layout.c | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index e220284..b2e3303 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -327,7 +327,13 @@ layout_record (rec) /* A named bit field of declared type `int' forces the entire structure to have `int' alignment. */ if (DECL_NAME (field) != 0) - record_align = MAX (record_align, TYPE_ALIGN (TREE_TYPE (field))); + { + int type_align = TYPE_ALIGN (TREE_TYPE (field)); + if (maximum_field_alignment != 0) + type_align = MIN (type_align, maximum_field_alignment); + + record_align = MAX (record_align, type_align); + } } else record_align = MAX (record_align, desired_align); @@ -371,8 +377,15 @@ layout_record (rec) register tree dsize = DECL_SIZE (field); int field_size = TREE_INT_CST_LOW (dsize); + if (maximum_field_alignment != 0) + type_align = MIN (type_align, maximum_field_alignment); + /* A bit field may not span the unit of alignment of its type. Advance to next boundary if necessary. */ + /* ??? There is some uncertainty here as to what + should be done if type_align is less than the width of the type. + That can happen because the width exceeds BIGGEST_ALIGNMENT + or because it exceeds maximum_field_alignment. */ if (const_size / type_align != (const_size + field_size - 1) / type_align) const_size = CEIL (const_size, type_align) * type_align; @@ -393,6 +406,9 @@ layout_record (rec) register tree dsize = DECL_SIZE (field); int field_size = TREE_INT_CST_LOW (dsize); + if (maximum_field_alignment != 0) + type_align = MIN (type_align, maximum_field_alignment); + /* A bit field may not span the unit of alignment of its type. Advance to next boundary if necessary. */ if (const_size / type_align |