From 6790d1bd90d6d41631034507a42a42d04f1d4003 Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Sat, 29 Dec 2001 21:00:51 +0000 Subject: [PATCH] stor-layout.c (layout_decl): Don't misalign field of variable size for packed record. * stor-layout.c (layout_decl): Don't misalign field of variable size for packed record. From-SVN: r48384 --- gcc/ChangeLog | 3 +++ gcc/stor-layout.c | 10 +++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e4f8b813a9c..5ba989d534f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,8 @@ Sat Dec 29 15:48:54 2001 Richard Kenner + * stor-layout.c (layout_decl): Don't misalign field of variable size + for packed record. + * dwarf2out.c (compute_section_prefix): Avoid cast warning. (gen_decl_die): Only check DECL_IGNORED_P on decls. (dwarf2out_decl): Check for DECL_IGNORED_P only when needed. diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index f657463bfd0..fe9ed2c9ca8 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -389,7 +389,15 @@ layout_decl (decl, known_align) DECL_BIT_FIELD_TYPE (decl) = DECL_BIT_FIELD (decl) ? type : 0; if (maximum_field_alignment != 0) DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), maximum_field_alignment); - else if (DECL_PACKED (decl)) + + /* If the field is of variable size, we can't misalign it since we + have no way to make a temporary to align the result. But this + isn't an issue if the decl is not addressable. Likewise if it + is of unknown size. */ + else if (DECL_PACKED (decl) + && (DECL_NONADDRESSABLE_P (decl) + || DECL_SIZE_UNIT (decl) == 0 + || TREE_CODE (DECL_SIZE_UNIT (decl)) == INTEGER_CST)) { DECL_ALIGN (decl) = MIN (DECL_ALIGN (decl), BITS_PER_UNIT); DECL_USER_ALIGN (decl) = 0;