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:
parent
d7b3369c52
commit
3d025fc275
|
@ -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>
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
Loading…
Reference in New Issue