diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/sparc/sparc.c | 36 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/sparc/20160104-1.c | 16 |
4 files changed, 44 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4e05260..4b29c22 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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 diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index 02addbc..1d00a34 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.c @@ -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)); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 91499e3d..148ac10 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 diff --git a/gcc/testsuite/gcc.target/sparc/20160104-1.c b/gcc/testsuite/gcc.target/sparc/20160104-1.c new file mode 100644 index 0000000..0cc617a --- /dev/null +++ b/gcc/testsuite/gcc.target/sparc/20160104-1.c @@ -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) +{} |