From: Eric Botcazou Date: Sat, 18 Oct 2003 07:39:56 +0000 (+0200) Subject: sparc.c (function_arg_record_value_1): New fourth parameter packed_p. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=cde85594f0979f7295cc6c01d0211ad49f5ab08e;p=gcc.git sparc.c (function_arg_record_value_1): New fourth parameter packed_p. * config/sparc/sparc.c (function_arg_record_value_1): New fourth parameter packed_p. Search for a DECL_PACKED field only if packed_p is false. Pass packed_p recursively. (function_arg_record_value_2): Likewise. (function_arg_record_value): Update calls to function_arg_record_value_1 and function_arg_record_value_2. From-SVN: r72636 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3fd42ab28c3..d451f0b4005 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2003-10-18 Eric Botcazou + + * config/sparc/sparc.c (function_arg_record_value_1): New fourth + parameter packed_p. Search for a DECL_PACKED field only if + packed_p is false. Pass packed_p recursively. + (function_arg_record_value_2): Likewise. + (function_arg_record_value): Update calls to + function_arg_record_value_1 and function_arg_record_value_2. + 2003-10-18 Eric Botcazou * cse.c (cse_insn) [src_folded]: Check that the tentative replacement diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index 1332817e0fa..82244d8daba 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.c @@ -4910,9 +4910,9 @@ struct function_arg_record_value_parms static void function_arg_record_value_3 (HOST_WIDE_INT, struct function_arg_record_value_parms *); static void function_arg_record_value_2 - (tree, HOST_WIDE_INT, struct function_arg_record_value_parms *); + (tree, HOST_WIDE_INT, struct function_arg_record_value_parms *, bool); static void function_arg_record_value_1 - (tree, HOST_WIDE_INT, struct function_arg_record_value_parms *); + (tree, HOST_WIDE_INT, struct function_arg_record_value_parms *, bool); static rtx function_arg_record_value (tree, enum machine_mode, int, int, int); /* A subroutine of function_arg_record_value. Traverse the structure @@ -4920,27 +4920,27 @@ static rtx function_arg_record_value (tree, enum machine_mode, int, int, int); static void function_arg_record_value_1 (tree type, HOST_WIDE_INT startbitpos, - struct function_arg_record_value_parms *parms) + struct function_arg_record_value_parms *parms, + bool packed_p) { tree field; - /* The ABI obviously doesn't specify how packed structures are - passed. These are defined to be passed in int regs if possible, - otherwise memory. */ - int packed_p = 0; - /* We need to compute how many registers are needed so we can allocate the PARALLEL but before we can do that we need to know - whether there are any packed fields. If there are, int regs are - used regardless of whether there are fp values present. */ - for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field)) - { - if (TREE_CODE (field) == FIELD_DECL && DECL_PACKED (field)) - { - packed_p = 1; - break; - } - } + whether there are any packed fields. The ABI obviously doesn't + specify how structures are passed in this case, so they are + defined to be passed in int regs if possible, otherwise memory, + regardless of whether there are fp values present. */ + + if (! packed_p) + for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field)) + { + if (TREE_CODE (field) == FIELD_DECL && DECL_PACKED (field)) + { + packed_p = true; + break; + } + } /* Compute how many registers we need. */ for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field)) @@ -4956,7 +4956,10 @@ function_arg_record_value_1 (tree type, HOST_WIDE_INT startbitpos, /* ??? FIXME: else assume zero offset. */ if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE) - function_arg_record_value_1 (TREE_TYPE (field), bitpos, parms); + function_arg_record_value_1 (TREE_TYPE (field), + bitpos, + parms, + packed_p); else if ((TREE_CODE (TREE_TYPE (field)) == REAL_TYPE || (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE && (TREE_CODE (TREE_TYPE (TREE_TYPE (field))) @@ -5062,19 +5065,20 @@ function_arg_record_value_3 (HOST_WIDE_INT bitpos, static void function_arg_record_value_2 (tree type, HOST_WIDE_INT startbitpos, - struct function_arg_record_value_parms *parms) + struct function_arg_record_value_parms *parms, + bool packed_p) { tree field; - int packed_p = 0; - for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field)) - { - if (TREE_CODE (field) == FIELD_DECL && DECL_PACKED (field)) - { - packed_p = 1; - break; - } - } + if (! packed_p) + for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field)) + { + if (TREE_CODE (field) == FIELD_DECL && DECL_PACKED (field)) + { + packed_p = true; + break; + } + } for (field = TYPE_FIELDS (type); field; field = TREE_CHAIN (field)) { @@ -5089,7 +5093,10 @@ function_arg_record_value_2 (tree type, HOST_WIDE_INT startbitpos, /* ??? FIXME: else assume zero offset. */ if (TREE_CODE (TREE_TYPE (field)) == RECORD_TYPE) - function_arg_record_value_2 (TREE_TYPE (field), bitpos, parms); + function_arg_record_value_2 (TREE_TYPE (field), + bitpos, + parms, + packed_p); else if ((TREE_CODE (TREE_TYPE (field)) == REAL_TYPE || (TREE_CODE (TREE_TYPE (field)) == COMPLEX_TYPE && (TREE_CODE (TREE_TYPE (TREE_TYPE (field))) @@ -5170,7 +5177,7 @@ function_arg_record_value (tree type, enum machine_mode mode, /* Compute how many registers we need. */ parms.nregs = 0; parms.intoffset = 0; - function_arg_record_value_1 (type, 0, &parms); + function_arg_record_value_1 (type, 0, &parms, false); if (parms.intoffset != -1) { @@ -5232,7 +5239,7 @@ function_arg_record_value (tree type, enum machine_mode mode, /* Fill in the entries. */ parms.nregs = 0; parms.intoffset = 0; - function_arg_record_value_2 (type, 0, &parms); + function_arg_record_value_2 (type, 0, &parms, false); function_arg_record_value_3 (typesize * BITS_PER_UNIT, &parms); if (parms.nregs != nregs)