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:
parent
a82cf59bad
commit
68d44cbc5b
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue