From daf0604921d723fc47a26524ea38c259eb1bdf42 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 8 Aug 2002 01:20:35 +0200 Subject: [PATCH] stor-layout.c (place_union_field): For bitfields if PCC_BITFIELD_TYPE_MATTERS and TYPE_USER_ALIGN... * stor-layout.c (place_union_field): For bitfields if PCC_BITFIELD_TYPE_MATTERS and TYPE_USER_ALIGN, set record's TYPE_USER_ALIGN. * gcc.dg/bitfld-3.c: New test. From-SVN: r56112 --- gcc/ChangeLog | 6 +++ gcc/stor-layout.c | 6 +++ gcc/testsuite/ChangeLog | 4 ++ gcc/testsuite/gcc.dg/bitfld-3.c | 67 +++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/bitfld-3.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3bf7245c5a9..998b227b90e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2002-08-08 Jakub Jelinek + + * stor-layout.c (place_union_field): For bitfields if + PCC_BITFIELD_TYPE_MATTERS and TYPE_USER_ALIGN, set record's + TYPE_USER_ALIGN. + 2002-08-07 John David Anglin * pa.c (struct deferred_plabel): Constify name field. diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index 5a4041e5af0..28d8f6218d1 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -694,6 +694,7 @@ place_union_field (rli, field) #endif rli->record_align = MAX (rli->record_align, type_align); rli->unpadded_align = MAX (rli->unpadded_align, type_align); + TYPE_USER_ALIGN (rli->t) |= TYPE_USER_ALIGN (TREE_TYPE (field)); } #endif @@ -849,6 +850,7 @@ place_field (rli, field) rli->unpadded_align = MAX (rli->unpadded_align, DECL_ALIGN (field)); if (warn_packed) rli->unpacked_align = MAX (rli->unpacked_align, TYPE_ALIGN (type)); + user_align |= TYPE_USER_ALIGN (type); } } else @@ -941,6 +943,8 @@ place_field (rli, field) - (offset * BITS_PER_UNIT + bit_offset) / type_align) > tree_low_cst (TYPE_SIZE (type), 1) / type_align) rli->bitpos = round_up (rli->bitpos, type_align); + + user_align |= TYPE_USER_ALIGN (type); } #endif @@ -982,6 +986,8 @@ place_field (rli, field) != ((offset * BITS_PER_UNIT + bit_offset + field_size - 1) / type_align)) rli->bitpos = round_up (rli->bitpos, type_align); + + user_align |= TYPE_USER_ALIGN (type); } #endif diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2438925246b..014919ddd33 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2002-08-08 Jakub Jelinek + + * gcc.dg/bitfld-3.c: New test. + 2002-08-07 Jakub Jelinek Richard Henderson diff --git a/gcc/testsuite/gcc.dg/bitfld-3.c b/gcc/testsuite/gcc.dg/bitfld-3.c new file mode 100644 index 00000000000..3843acb6e39 --- /dev/null +++ b/gcc/testsuite/gcc.dg/bitfld-3.c @@ -0,0 +1,67 @@ +/* Test for bitfield alignment in structs and unions. */ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +extern void abort (void); +extern void exit (int); + +typedef long la __attribute__((aligned (8))); + +struct A +{ + char a; + union UA + { + char x; + la y : 6; + } b; + char c; +} a; + +struct B +{ + char a; + union UB + { + char x; + long y : 6 __attribute__((aligned (8))); + } b; + char c; +} b; + +struct C +{ + char a; + struct UC + { + la y : 6; + } b; + char c; +} c; + +struct D +{ + char a; + struct UD + { + long y : 6 __attribute__((aligned (8))); + } b; + char c; +} d; + +int main (void) +{ + if (sizeof (a) != sizeof (b)) + abort (); + if (sizeof (a) != sizeof (c)) + abort (); + if (sizeof (a) != sizeof (d)) + abort (); + if ((&a.c - &a.a) != (&b.c - &b.a)) + abort (); + if ((&a.c - &a.a) != (&c.c - &c.a)) + abort (); + if ((&a.c - &a.a) != (&d.c - &d.a)) + abort (); + exit (0); +} -- 2.30.2