re PR c/63495 (struct __attribute__ ((aligned (8))) broken on x86)

PR c/63495
	* stor-layout.c (min_align_of_type): Don't decrease alignment
	through BIGGEST_FIELD_ALIGNMENT or ADJUST_FIELD_ALIGN if
	TYPE_USER_ALIGN is set.

	* gcc.target/i386/pr63495.c: New test.

From-SVN: r216101
This commit is contained in:
Jakub Jelinek 2014-10-10 19:43:21 +02:00 committed by Jakub Jelinek
parent 878f5596b3
commit 1740f8a1cd
4 changed files with 27 additions and 7 deletions

View File

@ -1,3 +1,10 @@
2014-10-10 Jakub Jelinek <jakub@redhat.com>
PR c/63495
* stor-layout.c (min_align_of_type): Don't decrease alignment
through BIGGEST_FIELD_ALIGNMENT or ADJUST_FIELD_ALIGN if
TYPE_USER_ALIGN is set.
2014-10-10 Uros Bizjak <ubizjak@gmail.com>
PR rtl-optimization/63483

View File

@ -2400,17 +2400,19 @@ min_align_of_type (tree type)
{
unsigned int align = TYPE_ALIGN (type);
align = MIN (align, BIGGEST_ALIGNMENT);
if (!TYPE_USER_ALIGN (type))
{
#ifdef BIGGEST_FIELD_ALIGNMENT
align = MIN (align, BIGGEST_FIELD_ALIGNMENT);
align = MIN (align, BIGGEST_FIELD_ALIGNMENT);
#endif
unsigned int field_align = align;
unsigned int field_align = align;
#ifdef ADJUST_FIELD_ALIGN
tree field = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL_TREE,
type);
field_align = ADJUST_FIELD_ALIGN (field, field_align);
ggc_free (field);
tree field = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL_TREE, type);
field_align = ADJUST_FIELD_ALIGN (field, field_align);
ggc_free (field);
#endif
align = MIN (align, field_align);
align = MIN (align, field_align);
}
return align / BITS_PER_UNIT;
}

View File

@ -1,3 +1,8 @@
2014-10-10 Jakub Jelinek <jakub@redhat.com>
PR c/63495
* gcc.target/i386/pr63495.c: New test.
2014-10-10 Marek Polacek <polacek@redhat.com>
* c-c++-common/ubsan/object-size-1.c: New test.

View File

@ -0,0 +1,6 @@
/* PR c/63495 */
/* { dg-do compile { target { i?86-*-linux* x86_64-*-linux* } } } */
/* { dg-options "-std=gnu11" } */
struct __attribute__ ((aligned (8))) S { char c; };
_Static_assert (_Alignof (struct S) >= 8, "wrong alignment");