re PR target/69072 (ICE in function_arg_record_value on 7th packed structure)

PR target/69072
	* config/sparc/sparc.c (scan_record_type): Take into account subfields
	to compute the PACKED_P predicate.
	(function_arg_record_value): Minor tweaks.

From-SVN: r232049
This commit is contained in:
Eric Botcazou 2016-01-04 08:06:52 +00:00 committed by Eric Botcazou
parent a10f2c253c
commit e8d65a35d5
4 changed files with 44 additions and 19 deletions

View File

@ -1,3 +1,10 @@
2016-01-04 Eric Botcazou <ebotcazou@adacore.com>
PR target/69072
* config/sparc/sparc.c (scan_record_type): Take into account subfields
to compute the PACKED_P predicate.
(function_arg_record_value): Minor tweaks.
2016-01-04 Thomas Preud'homme <thomas.preudhomme@arm.com>
* doc/install.texi (--with-multilib-list): Describe the meaning of the

View File

@ -6140,30 +6140,28 @@ sparc_strict_argument_naming (cumulative_args_t ca ATTRIBUTE_UNUSED)
that is eligible for promotion in integer registers.
- FP_REGS_P: the record contains at least one field or sub-field
that is eligible for promotion in floating-point registers.
- PACKED_P: the record contains at least one field that is packed.
Sub-fields are not taken into account for the PACKED_P predicate. */
- PACKED_P: the record contains at least one field that is packed. */
static void
scan_record_type (const_tree type, int *intregs_p, int *fpregs_p,
int *packed_p)
{
tree field;
for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
for (tree field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
{
if (TREE_CODE (field) == FIELD_DECL)
{
if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
scan_record_type (TREE_TYPE (field), intregs_p, fpregs_p, 0);
else if ((FLOAT_TYPE_P (TREE_TYPE (field))
|| TREE_CODE (TREE_TYPE (field)) == VECTOR_TYPE)
tree field_type = TREE_TYPE (field);
if (TREE_CODE (field_type) == RECORD_TYPE)
scan_record_type (field_type, intregs_p, fpregs_p, packed_p);
else if ((FLOAT_TYPE_P (field_type)
|| TREE_CODE (field_type) == VECTOR_TYPE)
&& TARGET_FPU)
*fpregs_p = 1;
else
*intregs_p = 1;
if (packed_p && DECL_PACKED (field))
if (DECL_PACKED (field))
*packed_p = 1;
}
}
@ -6647,9 +6645,10 @@ function_arg_record_value (const_tree type, machine_mode mode,
parms.nregs += intslots;
}
nregs = parms.nregs;
/* Allocate the vector and handle some annoying special cases. */
nregs = parms.nregs;
if (nregs == 0)
{
/* ??? Empty structure has no value? Duh? */
@ -6661,16 +6660,15 @@ function_arg_record_value (const_tree type, machine_mode mode,
load. */
return gen_rtx_REG (mode, regbase);
}
else
{
/* ??? C++ has structures with no fields, and yet a size. Give up
for now and pass everything back in integer registers. */
nregs = (typesize + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
}
/* ??? C++ has structures with no fields, and yet a size. Give up
for now and pass everything back in integer registers. */
nregs = (typesize + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
if (nregs + slotno > SPARC_INT_ARG_MAX)
nregs = SPARC_INT_ARG_MAX - slotno;
}
gcc_assert (nregs != 0);
gcc_assert (nregs > 0);
parms.ret = gen_rtx_PARALLEL (mode, rtvec_alloc (parms.stack + nregs));

View File

@ -1,3 +1,7 @@
2016-01-04 Eric Botcazou <ebotcazou@adacore.com>
* gcc.target/sparc/20160104-1.c: New test.
2016-01-03 Paul Thomas <pault@gcc.gnu.org>
PR fortran/65045

View File

@ -0,0 +1,16 @@
/* PR target/69072 */
/* Reported by Zdenek Sojka <zsojka@seznam.cz> */
/* { dg-do compile } */
typedef struct
{
struct
{
double d;
} __attribute__((packed)) a;
} S;
void
foo (S s1, S s2, S s3, S s4, S s5, S s6, S s7)
{}