Commit daf06049 by Jakub Jelinek Committed by Jakub Jelinek

stor-layout.c (place_union_field): For bitfields if PCC_BITFIELD_TYPE_MATTERS…

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
parent 043d39a6
2002-08-08 Jakub Jelinek <jakub@redhat.com>
* 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 <dave@hiauly1.hia.nrc.ca> 2002-08-07 John David Anglin <dave@hiauly1.hia.nrc.ca>
* pa.c (struct deferred_plabel): Constify name field. * pa.c (struct deferred_plabel): Constify name field.
......
...@@ -694,6 +694,7 @@ place_union_field (rli, field) ...@@ -694,6 +694,7 @@ place_union_field (rli, field)
#endif #endif
rli->record_align = MAX (rli->record_align, type_align); rli->record_align = MAX (rli->record_align, type_align);
rli->unpadded_align = MAX (rli->unpadded_align, type_align); rli->unpadded_align = MAX (rli->unpadded_align, type_align);
TYPE_USER_ALIGN (rli->t) |= TYPE_USER_ALIGN (TREE_TYPE (field));
} }
#endif #endif
...@@ -849,6 +850,7 @@ place_field (rli, field) ...@@ -849,6 +850,7 @@ place_field (rli, field)
rli->unpadded_align = MAX (rli->unpadded_align, DECL_ALIGN (field)); rli->unpadded_align = MAX (rli->unpadded_align, DECL_ALIGN (field));
if (warn_packed) if (warn_packed)
rli->unpacked_align = MAX (rli->unpacked_align, TYPE_ALIGN (type)); rli->unpacked_align = MAX (rli->unpacked_align, TYPE_ALIGN (type));
user_align |= TYPE_USER_ALIGN (type);
} }
} }
else else
...@@ -941,6 +943,8 @@ place_field (rli, field) ...@@ -941,6 +943,8 @@ place_field (rli, field)
- (offset * BITS_PER_UNIT + bit_offset) / type_align) - (offset * BITS_PER_UNIT + bit_offset) / type_align)
> tree_low_cst (TYPE_SIZE (type), 1) / type_align) > tree_low_cst (TYPE_SIZE (type), 1) / type_align)
rli->bitpos = round_up (rli->bitpos, type_align); rli->bitpos = round_up (rli->bitpos, type_align);
user_align |= TYPE_USER_ALIGN (type);
} }
#endif #endif
...@@ -982,6 +986,8 @@ place_field (rli, field) ...@@ -982,6 +986,8 @@ place_field (rli, field)
!= ((offset * BITS_PER_UNIT + bit_offset + field_size - 1) != ((offset * BITS_PER_UNIT + bit_offset + field_size - 1)
/ type_align)) / type_align))
rli->bitpos = round_up (rli->bitpos, type_align); rli->bitpos = round_up (rli->bitpos, type_align);
user_align |= TYPE_USER_ALIGN (type);
} }
#endif #endif
......
2002-08-08 Jakub Jelinek <jakub@redhat.com>
* gcc.dg/bitfld-3.c: New test.
2002-08-07 Jakub Jelinek <jakub@redhat.com> 2002-08-07 Jakub Jelinek <jakub@redhat.com>
Richard Henderson <rth@redhat.com> Richard Henderson <rth@redhat.com>
......
/* 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);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment