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:
parent
a10f2c253c
commit
e8d65a35d5
|
@ -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>
|
2016-01-04 Thomas Preud'homme <thomas.preudhomme@arm.com>
|
||||||
|
|
||||||
* doc/install.texi (--with-multilib-list): Describe the meaning of the
|
* doc/install.texi (--with-multilib-list): Describe the meaning of the
|
||||||
|
|
|
@ -6140,30 +6140,28 @@ sparc_strict_argument_naming (cumulative_args_t ca ATTRIBUTE_UNUSED)
|
||||||
that is eligible for promotion in integer registers.
|
that is eligible for promotion in integer registers.
|
||||||
- FP_REGS_P: the record contains at least one field or sub-field
|
- FP_REGS_P: the record contains at least one field or sub-field
|
||||||
that is eligible for promotion in floating-point registers.
|
that is eligible for promotion in floating-point registers.
|
||||||
- PACKED_P: the record contains at least one field that is packed.
|
- PACKED_P: the record contains at least one field that is packed. */
|
||||||
|
|
||||||
Sub-fields are not taken into account for the PACKED_P predicate. */
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
scan_record_type (const_tree type, int *intregs_p, int *fpregs_p,
|
scan_record_type (const_tree type, int *intregs_p, int *fpregs_p,
|
||||||
int *packed_p)
|
int *packed_p)
|
||||||
{
|
{
|
||||||
tree field;
|
for (tree field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
|
||||||
|
|
||||||
for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
|
|
||||||
{
|
{
|
||||||
if (TREE_CODE (field) == FIELD_DECL)
|
if (TREE_CODE (field) == FIELD_DECL)
|
||||||
{
|
{
|
||||||
if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE)
|
tree field_type = TREE_TYPE (field);
|
||||||
scan_record_type (TREE_TYPE (field), intregs_p, fpregs_p, 0);
|
|
||||||
else if ((FLOAT_TYPE_P (TREE_TYPE (field))
|
if (TREE_CODE (field_type) == RECORD_TYPE)
|
||||||
|| TREE_CODE (TREE_TYPE (field)) == VECTOR_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)
|
&& TARGET_FPU)
|
||||||
*fpregs_p = 1;
|
*fpregs_p = 1;
|
||||||
else
|
else
|
||||||
*intregs_p = 1;
|
*intregs_p = 1;
|
||||||
|
|
||||||
if (packed_p && DECL_PACKED (field))
|
if (DECL_PACKED (field))
|
||||||
*packed_p = 1;
|
*packed_p = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6647,9 +6645,10 @@ function_arg_record_value (const_tree type, machine_mode mode,
|
||||||
|
|
||||||
parms.nregs += intslots;
|
parms.nregs += intslots;
|
||||||
}
|
}
|
||||||
nregs = parms.nregs;
|
|
||||||
|
|
||||||
/* Allocate the vector and handle some annoying special cases. */
|
/* Allocate the vector and handle some annoying special cases. */
|
||||||
|
nregs = parms.nregs;
|
||||||
|
|
||||||
if (nregs == 0)
|
if (nregs == 0)
|
||||||
{
|
{
|
||||||
/* ??? Empty structure has no value? Duh? */
|
/* ??? Empty structure has no value? Duh? */
|
||||||
|
@ -6661,16 +6660,15 @@ function_arg_record_value (const_tree type, machine_mode mode,
|
||||||
load. */
|
load. */
|
||||||
return gen_rtx_REG (mode, regbase);
|
return gen_rtx_REG (mode, regbase);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
/* ??? C++ has structures with no fields, and yet a size. Give up
|
||||||
/* ??? C++ has structures with no fields, and yet a size. Give up
|
for now and pass everything back in integer registers. */
|
||||||
for now and pass everything back in integer registers. */
|
nregs = (typesize + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
|
||||||
nregs = (typesize + UNITS_PER_WORD - 1) / UNITS_PER_WORD;
|
|
||||||
}
|
|
||||||
if (nregs + slotno > SPARC_INT_ARG_MAX)
|
if (nregs + slotno > SPARC_INT_ARG_MAX)
|
||||||
nregs = SPARC_INT_ARG_MAX - slotno;
|
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));
|
parms.ret = gen_rtx_PARALLEL (mode, rtvec_alloc (parms.stack + nregs));
|
||||||
|
|
||||||
|
|
|
@ -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>
|
2016-01-03 Paul Thomas <pault@gcc.gnu.org>
|
||||||
|
|
||||||
PR fortran/65045
|
PR fortran/65045
|
||||||
|
|
|
@ -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)
|
||||||
|
{}
|
Loading…
Reference in New Issue