Commit 9954e17f by Kai Tietz Committed by Kai Tietz

re PR target/52238 (-mms-bitfields: __attribute__ ((aligned (n))) ignored for struct members)

	PR target/52238
	* stor-layout.c (place_field): Handle desired_align for
	ms-bitfields, too.

	* gcc.dg/bf-ms-layout-3.c: New testcase.

From-SVN: r184409
parent d7470374
2012-02-20 Kai Tietz <ktietz@redhat.com>
PR target/52238
* stor-layout.c (place_field): Handle desired_align for
ms-bitfields, too.
2012-02-20 Richard Guenther <rguenther@suse.de> 2012-02-20 Richard Guenther <rguenther@suse.de>
PR tree-optimization/52298 PR tree-optimization/52298
......
...@@ -1141,15 +1141,14 @@ place_field (record_layout_info rli, tree field) ...@@ -1141,15 +1141,14 @@ place_field (record_layout_info rli, tree field)
} }
/* Does this field automatically have alignment it needs by virtue /* Does this field automatically have alignment it needs by virtue
of the fields that precede it and the record's own alignment? of the fields that precede it and the record's own alignment? */
We already align ms_struct fields, so don't re-align them. */ if (known_align < desired_align)
if (known_align < desired_align
&& !targetm.ms_bitfield_layout_p (rli->t))
{ {
/* No, we need to skip space before this field. /* No, we need to skip space before this field.
Bump the cumulative size to multiple of field alignment. */ Bump the cumulative size to multiple of field alignment. */
if (DECL_SOURCE_LOCATION (field) != BUILTINS_LOCATION) if (!targetm.ms_bitfield_layout_p (rli->t)
&& DECL_SOURCE_LOCATION (field) != BUILTINS_LOCATION)
warning (OPT_Wpadded, "padding struct to align %q+D", field); warning (OPT_Wpadded, "padding struct to align %q+D", field);
/* If the alignment is still within offset_align, just align /* If the alignment is still within offset_align, just align
...@@ -1171,7 +1170,8 @@ place_field (record_layout_info rli, tree field) ...@@ -1171,7 +1170,8 @@ place_field (record_layout_info rli, tree field)
if (! TREE_CONSTANT (rli->offset)) if (! TREE_CONSTANT (rli->offset))
rli->offset_align = desired_align; rli->offset_align = desired_align;
if (targetm.ms_bitfield_layout_p (rli->t))
rli->prev_field = NULL;
} }
/* Handle compatibility with PCC. Note that if the record has any /* Handle compatibility with PCC. Note that if the record has any
......
2012-02-20 Kai Tietz <ktietz@redhat.com>
* gcc.dg/bf-ms-layout-3.c: New testcase.
2012-02-20 Thomas Koenig <tkoenig@gcc.gnu.org> 2012-02-20 Thomas Koenig <tkoenig@gcc.gnu.org>
PR testsuite/52229 PR testsuite/52229
......
/* Test for MS bitfield layout */
/* { dg-do run { target *-*-interix* *-*-mingw* *-*-cygwin* i?86-*-* x86_64-*-* } } */
extern void abort();
struct s1_t {
char a;
char b __attribute__ ((aligned (16)));
} __attribute__ ((ms_struct));
struct s1_t s1;
struct s2_t {
char a;
char b;
} __attribute__ ((ms_struct));
struct s2_t s2;
struct s3_t {
char a : 6;
char b __attribute__ ((aligned (16)));
} __attribute__ ((ms_struct));
struct s3_t s3;
struct s4_t {
char a : 6;
char b __attribute__ ((aligned (2)));
} __attribute__ ((ms_struct));
struct s4_t s4;
struct s5_t {
char a : 6;
char b __attribute__ ((aligned (1)));
} __attribute__ ((ms_struct));
struct s5_t s5;
__PTRDIFF_TYPE__ offs (const void *a, const void *b)
{
return (__PTRDIFF_TYPE__) ((const char*)a - (const char*)b);
}
int main()
{
if (offs (&s1.b, &s1) != 16
|| offs (&s2.b, &s2) != 1
|| offs (&s3.b, &s3) != 16
|| offs (&s4.b, &s4) != 2
|| offs (&s5.b, &s5) != 1)
abort ();
return 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