backport: re PR target/39545 (Structures with flexible array member passed/returned incorrectly)

gcc/

2009-03-29  H.J. Lu  <hongjiu.lu@intel.com>

	Backport from mainline:
	2009-03-29  H.J. Lu  <hongjiu.lu@intel.com>

	PR target/39545
	* config/i386/i386.c (classify_argument): Ignore flexible array
	member in struct and warn ABI change.

gcc/testsuite/

2009-03-29  H.J. Lu  <hongjiu.lu@intel.com>

	Backport from mainline:
	2009-03-29  H.J. Lu  <hongjiu.lu@intel.com>

	PR target/39545
	* gcc.c-torture/compile/pr16566-2.c: Add -Wno-psabi for x86-64.

	* gcc.target/i386/pr39545-1.c: New.
	* gcc.target/i386/pr39545-2.c: Likewise.

	* gcc.target/x86_64/abi/test_passing_structs.c (flex1_struct): New.
	(flex2_struct): Likewise.
	(check_struct_passing7): Likewise.
	(check_struct_passing8): Likewise.
	(f1s): Likewise.
	(f2s): Likewise.
	(main): Call check_struct_passing7 and check_struct_passing8.

From-SVN: r145239
This commit is contained in:
H.J. Lu 2009-03-29 15:54:55 +00:00 committed by H.J. Lu
parent a82cf59bad
commit 68d44cbc5b
7 changed files with 134 additions and 2 deletions

View File

@ -1,3 +1,12 @@
2009-03-29 H.J. Lu <hongjiu.lu@intel.com>
Backport from mainline:
2009-03-29 H.J. Lu <hongjiu.lu@intel.com>
PR target/39545
* config/i386/i386.c (classify_argument): Ignore flexible array
member in struct and warn ABI change.
2009-03-29 Joseph Myers <joseph@codesourcery.com>
* doc/invoke.texi, doc/standards.texi: Refer to

View File

@ -4923,8 +4923,30 @@ classify_argument (enum machine_mode mode, const_tree type,
}
else
{
num = classify_argument (TYPE_MODE (TREE_TYPE (field)),
TREE_TYPE (field), subclasses,
type = TREE_TYPE (field);
/* Flexible array member is ignored. */
if (TYPE_MODE (type) == BLKmode
&& TREE_CODE (type) == ARRAY_TYPE
&& TYPE_SIZE (type) == NULL_TREE
&& TYPE_DOMAIN (type) != NULL_TREE
&& (TYPE_MAX_VALUE (TYPE_DOMAIN (type))
== NULL_TREE))
{
static bool warned;
if (!warned && warn_psabi)
{
warned = true;
inform (input_location,
"The ABI of passing struct with"
" a flexible array member has"
" changed in GCC 4.4");
}
continue;
}
num = classify_argument (TYPE_MODE (type), type,
subclasses,
(int_bit_position (field)
+ bit_offset) % 256);
if (!num)

View File

@ -1,3 +1,22 @@
2009-03-29 H.J. Lu <hongjiu.lu@intel.com>
Backport from mainline:
2009-03-29 H.J. Lu <hongjiu.lu@intel.com>
PR target/39545
* gcc.c-torture/compile/pr16566-2.c: Add -Wno-psabi for x86-64.
* gcc.target/i386/pr39545-1.c: New.
* gcc.target/i386/pr39545-2.c: Likewise.
* gcc.target/x86_64/abi/test_passing_structs.c (flex1_struct): New.
(flex2_struct): Likewise.
(check_struct_passing7): Likewise.
(check_struct_passing8): Likewise.
(f1s): Likewise.
(f2s): Likewise.
(main): Call check_struct_passing7 and check_struct_passing8.
2009-03-28 Jakub Jelinek <jakub@redhat.com>
* gcc.target/powerpc/altivec-28.c: New test.

View File

@ -1,5 +1,6 @@
/* ICE with flexible arrays in non-lvalue structures. Bug 16566
(comment #5). */
/* { dg-options "-Wno-psabi" { target { { i?86-*-* x86_64-*-* } && lp64 } } } */
struct A
{

View File

@ -0,0 +1,24 @@
/* PR target/39545 */
/* { dg-do compile } */
/* { dg-require-effective-target lp64 } */
/* { dg-options "-O2" } */
struct flex
{
int i;
int flex [];
};
int
foo (struct flex s) /* { dg-message "note: The ABI of passing struct with a flexible array member has changed in GCC 4.4" } */
{
return s.i;
}
struct flex
bar (int x)
{
struct flex s;
s.i = x;
return s;
}

View File

@ -0,0 +1,18 @@
/* PR target/39545 */
/* { dg-do compile } */
/* { dg-require-effective-target lp64 } */
/* { dg-options "-O2" } */
struct flex
{
int i;
int flex [];
};
struct flex
foo (int x)
{ /* { dg-message "note: The ABI of passing struct with a flexible array member has changed in GCC 4.4" } */
struct flex s;
s.i = x;
return s;
}

View File

@ -92,6 +92,33 @@ check_struct_passing6 (struct m128_2_struct ms ATTRIBUTE_UNUSED)
}
#endif
struct flex1_struct
{
long i;
long flex[];
};
struct flex2_struct
{
long i;
long flex[0];
};
void
check_struct_passing7 (struct flex1_struct is ATTRIBUTE_UNUSED)
{
check_int_arguments;
}
void
check_struct_passing8 (struct flex2_struct is ATTRIBUTE_UNUSED)
{
check_int_arguments;
}
static struct flex1_struct f1s = { 60, { } };
static struct flex2_struct f2s = { 61, { } };
int
main (void)
{
@ -146,5 +173,17 @@ main (void)
WRAP_CALL (check_struct_passing6)(m128_2s);
#endif
clear_struct_registers;
iregs.I0 = f1s.i;
num_iregs = 1;
clear_int_hardware_registers;
WRAP_CALL (check_struct_passing7)(f1s);
clear_struct_registers;
iregs.I0 = f2s.i;
num_iregs = 1;
clear_int_hardware_registers;
WRAP_CALL (check_struct_passing8)(f2s);
return 0;
}