mips: Fix an ICE caused by r12-7962
authorXi Ruoyao <xry111@mengyan1223.wang>
Sat, 2 Apr 2022 10:39:51 +0000 (18:39 +0800)
committerXi Ruoyao <xry111@mengyan1223.wang>
Sat, 2 Apr 2022 11:16:03 +0000 (19:16 +0800)
DECL_SIZE(x) is NULL if x is a flexible array member, but I forgot to
check it in r12-7962.  Then if we increase the size of a struct with
flexible array member (by using aligned attribute), the code will
dereference NULL trying to use the "size" of the flexible array member.

gcc/

* config/mips/mips.cc (mips_function_arg): Check if DECL_SIZE is
NULL before dereferencing it.

gcc/testsuite/

* gcc.target/mips/pr102024-4.c: New test.

gcc/config/mips/mips.cc
gcc/testsuite/gcc.target/mips/pr102024-4.c [new file with mode: 0644]

index 7681983..0f24922 100644 (file)
@@ -6054,7 +6054,8 @@ mips_function_arg (cumulative_args_t cum_v, const function_arg_info &arg)
                     an ABI change.  */
                  if (DECL_FIELD_CXX_ZERO_WIDTH_BIT_FIELD (field))
                    continue;
-                 if (integer_zerop (DECL_SIZE (field)))
+                 if (DECL_SIZE (field)
+                     && integer_zerop (DECL_SIZE (field)))
                    {
                      zero_width_field_abi_change = true;
                      continue;
diff --git a/gcc/testsuite/gcc.target/mips/pr102024-4.c b/gcc/testsuite/gcc.target/mips/pr102024-4.c
new file mode 100644 (file)
index 0000000..2147cc7
--- /dev/null
@@ -0,0 +1,10 @@
+// { dg-do compile }
+// { dg-options "-mabi=64 -mhard-float" }
+
+struct __attribute__((aligned(16))) test {
+  int x[0];
+  double b;
+  int f[];
+};
+
+void check(struct test) {} // { dg-message "the ABI for passing a value containing zero-width fields before an adjacent 64-bit floating-point field was changed in GCC 12.1" }