summaryrefslogtreecommitdiff
path: root/gcc/stor-layout.c
diff options
context:
space:
mode:
authoramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>2005-08-26 17:17:05 +0000
committeramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>2005-08-26 17:17:05 +0000
commite6be4aaafac14a477aa86cc3eaed48752c33dfec (patch)
tree1db0d7938aeda753d59d74176301b3e9bb5e91ee /gcc/stor-layout.c
parentba34341baa14414c1df48b2f3ccec26a611df6bf (diff)
downloadgcc-e6be4aaafac14a477aa86cc3eaed48752c33dfec.tar.gz
* stor-layout.c (finalize_type_size): Restore behaviour for
non-aggregate types to the status quo ante of the patch for pr 23467. Document why it matters. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@103527 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/stor-layout.c')
-rw-r--r--gcc/stor-layout.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c
index 0ec818d7fbd..81058558567 100644
--- a/gcc/stor-layout.c
+++ b/gcc/stor-layout.c
@@ -1399,23 +1399,23 @@ finalize_type_size (tree type)
/* Normally, use the alignment corresponding to the mode chosen.
However, where strict alignment is not required, avoid
over-aligning structures, since most compilers do not do this
- alignment. */
+ alignment. Also, we must avoid overriding a larger alignment
+ requirement coming from a user alignment of one of the fields. */
+ /* ??? The non-aggregate code is also needed to reduce the alignment
+ of java types with alignment less than 16 bits. The problem stems
+ from java/decl.c using char_type_node for the 16 bit character type,
+ while tree.c:make_node uses it as the type of the smallest addressable
+ unit to initialize the alignment of all types. */
+ unsigned mode_align = GET_MODE_ALIGNMENT (TYPE_MODE (type));
if (TYPE_MODE (type) != BLKmode && TYPE_MODE (type) != VOIDmode
- && (STRICT_ALIGNMENT
+ && ((STRICT_ALIGNMENT && mode_align >= TYPE_ALIGN (type))
|| (TREE_CODE (type) != RECORD_TYPE && TREE_CODE (type) != UNION_TYPE
&& TREE_CODE (type) != QUAL_UNION_TYPE
&& TREE_CODE (type) != ARRAY_TYPE)))
{
- unsigned mode_align = GET_MODE_ALIGNMENT (TYPE_MODE (type));
-
- /* Don't override a larger alignment requirement coming from a user
- alignment of one of the fields. */
- if (mode_align >= TYPE_ALIGN (type))
- {
- TYPE_ALIGN (type) = mode_align;
- TYPE_USER_ALIGN (type) = 0;
- }
+ TYPE_ALIGN (type) = mode_align;
+ TYPE_USER_ALIGN (type) = 0;
}
/* Do machine-dependent extra alignment. */