mips: Fix an ICE caused by r12-7962

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.
This commit is contained in:
Xi Ruoyao 2022-04-02 18:39:51 +08:00
parent 2a82301d40
commit be07535d0f
No known key found for this signature in database
GPG key ID: D95E4716CCBB34DC
2 changed files with 12 additions and 1 deletions

View 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;

View file

@ -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" }