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 H.J. Lu <hongjiu.lu@intel.com>
+
* config/i386/i386-protos.h (ix86_agi_dependent): New.
* config/i386/i386.c (ix86_agi_dependent): Rewrite.
}
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)
+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-29 Richard Guenther <rguenther@suse.de>
* gcc.c-torture/execute/20090113-1.c: New testcase.
/* ICE with flexible arrays in non-lvalue structures. Bug 16566
(comment #5). */
+/* { dg-options "-Wno-psabi" { target { { i?86-*-* x86_64-*-* } && lp64 } } } */
struct A
{
--- /dev/null
+/* 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;
+}
--- /dev/null
+/* 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;
+}
}
#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)
{
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;
}