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: r56111
This commit is contained in:
Jakub Jelinek 2002-08-08 01:16:44 +02:00 committed by Jakub Jelinek
parent d7b3369c52
commit 3d025fc275
4 changed files with 83 additions and 0 deletions

View File

@ -1,3 +1,9 @@
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 Jakub Jelinek <jakub@redhat.com>
Richard Henderson <rth@redhat.com>

View File

@ -692,6 +692,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
@ -847,6 +848,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
@ -939,6 +941,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
@ -980,6 +984,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

View File

@ -1,3 +1,7 @@
2002-08-08 Jakub Jelinek <jakub@redhat.com>
* gcc.dg/bitfld-3.c: New test.
2002-08-07 Jakub Jelinek <jakub@redhat.com>
Richard Henderson <rth@redhat.com>

View File

@ -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);
}