diff options
42 files changed, 99 insertions, 70 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a1edf05..30be17e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,32 @@ +2004-02-06 Alan Modra <amodra@bigpond.net.au> + + * doc/tm.texi (INIT_CUMULATIVE_ARGS): Update doco. + * calls.c (expand_call): Pass n_named_args to INIT_CUMULATIVE_ARGS. + (emit_library_call_value_1): Likewise pass nargs. + * expr.c (block_move_libcall_safe_for_call_parm): Pass 3 here. + * function.c (assign_parms): Pass -1 to INIT_CUMULATIVE_ARGS. + * config/rs6000/rs6000.c (init_cumulative_args): Use n_named_args + parameter instead of scanning TYPE_ARGS_TYPES to count args. + * config/rs6000/rs6000-protos.h (init_cumulative_args): Update + prototype. + * config/rs6000/rs6000.h (INIT_CUMULATIVE_ARGS): Pass extra arg. + (INIT_CUMULATIVE_INCOMING_ARGS): Set extra arg to 1000. + (INIT_CUMULATIVE_LIBCALL_ARGS): Set extra arg to 0. + * config/sh/sh.c (sh_output_mi_thunk): Pass 1 as n_named_args to + INIT_CUMULATIVE_ARGS. + * config/alpha/alpha.h (INIT_CUMULATIVE_ARGS): Update. + * config/alpha/unicosmk.h, config/alpha/vms.h, config/arc/arc.h, + config/arm/arm.h, config/avr/avr.h, config/c4x/c4x.h, + config/cris/cris.h, config/fr30/fr30.h, config/frv/frv.h, + config/h8300/h8300.h, config/i386/i386.h, config/i860/i860.h, + config/ia64/ia64.h, config/ip2k/ip2k.h, config/iq2000/iq2000.h, + config/iq2000/iq2000.c, config/m32r/m32r.h, config/m68hc11/m68hc11.h, + config/m68k/m68k.h, config/mcore/mcore.h, config/mips/mips.h, + config/mmix/mmix.h, config/mn10300/mn10300.h, config/ns32k/ns32k.h, + config/pa/pa.h, config/pdp11/pdp11.h config/s390/s390.h, + config/sh/sh.h, config/sparc/sparc.h, config/stormy16/stormy16.h, + config/v850/v850.h, config/vax/vax.h, config/xtensa/xtensa.h: Likewise. + 2004-02-06 Kazu Hirata <kazu@cs.umass.edu> * genemit.c (gen_exp) [CONST_INT]: Use const_int_rtx whenever diff --git a/gcc/calls.c b/gcc/calls.c index 607911c..d702ed0 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -2400,14 +2400,6 @@ expand_call (tree exp, rtx target, int ignore) for (p = actparms, num_actuals = 0; p; p = TREE_CHAIN (p)) num_actuals++; - /* Start updating where the next arg would go. - - On some machines (such as the PA) indirect calls have a different - calling convention than normal calls. The last argument in - INIT_CUMULATIVE_ARGS tells the backend if this is an indirect call - or not. */ - INIT_CUMULATIVE_ARGS (args_so_far, funtype, NULL_RTX, fndecl); - /* Compute number of named args. Normally, don't include the last named arg if anonymous args follow. We do include the last named arg if @@ -2439,6 +2431,14 @@ expand_call (tree exp, rtx target, int ignore) /* If we know nothing, treat all args as named. */ n_named_args = num_actuals; + /* Start updating where the next arg would go. + + On some machines (such as the PA) indirect calls have a different + calling convention than normal calls. The fourth argument in + INIT_CUMULATIVE_ARGS tells the backend if this is an indirect call + or not. */ + INIT_CUMULATIVE_ARGS (args_so_far, funtype, NULL_RTX, fndecl, n_named_args); + /* Make a vector to hold all the information about each arg. */ args = alloca (num_actuals * sizeof (struct arg_data)); memset (args, 0, num_actuals * sizeof (struct arg_data)); @@ -3783,7 +3783,7 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value, #ifdef INIT_CUMULATIVE_LIBCALL_ARGS INIT_CUMULATIVE_LIBCALL_ARGS (args_so_far, outmode, fun); #else - INIT_CUMULATIVE_ARGS (args_so_far, NULL_TREE, fun, 0); + INIT_CUMULATIVE_ARGS (args_so_far, NULL_TREE, fun, 0, nargs); #endif args_size.constant = 0; diff --git a/gcc/config/alpha/alpha.h b/gcc/config/alpha/alpha.h index b46197f..4c0053f 100644 --- a/gcc/config/alpha/alpha.h +++ b/gcc/config/alpha/alpha.h @@ -1002,7 +1002,8 @@ extern int alpha_memory_latency; for a call to a function whose data type is FNTYPE. For a library call, FNTYPE is 0. */ -#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) (CUM) = 0 +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ + (CUM) = 0 /* Define intermediate macro to compute the size (in registers) of an argument for the Alpha. */ diff --git a/gcc/config/alpha/unicosmk.h b/gcc/config/alpha/unicosmk.h index a86f3c8..d1dfe91 100644 --- a/gcc/config/alpha/unicosmk.h +++ b/gcc/config/alpha/unicosmk.h @@ -176,7 +176,7 @@ typedef struct { function whose data type is FNTYPE. For a library call, FNTYPE is 0. */ #undef INIT_CUMULATIVE_ARGS -#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ do { (CUM).num_args = 0; \ (CUM).num_arg_words = 0; \ (CUM).num_reg_words = 0; \ diff --git a/gcc/config/alpha/vms.h b/gcc/config/alpha/vms.h index 0a2e516..f7058f3 100644 --- a/gcc/config/alpha/vms.h +++ b/gcc/config/alpha/vms.h @@ -172,7 +172,7 @@ typedef struct {int num_args; enum avms_arg_type atypes[6];} avms_arg_info; For a library call, FNTYPE is 0. */ #undef INIT_CUMULATIVE_ARGS -#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ (CUM).num_args = 0; \ (CUM).atypes[0] = (CUM).atypes[1] = (CUM).atypes[2] = I64; \ (CUM).atypes[3] = (CUM).atypes[4] = (CUM).atypes[5] = I64; diff --git a/gcc/config/arc/arc.h b/gcc/config/arc/arc.h index 42441d8..cdd9ba2 100644 --- a/gcc/config/arc/arc.h +++ b/gcc/config/arc/arc.h @@ -623,7 +623,7 @@ extern enum reg_class arc_regno_reg_class[FIRST_PSEUDO_REGISTER]; /* Initialize a variable CUM of type CUMULATIVE_ARGS for a call to a function whose data type is FNTYPE. For a library call, FNTYPE is 0. */ -#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ ((CUM) = 0) /* The number of registers used for parameter passing. Local to this file. */ diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h index d2986ff..26c4526 100644 --- a/gcc/config/arm/arm.h +++ b/gcc/config/arm/arm.h @@ -1875,7 +1875,7 @@ typedef struct for a call to a function whose data type is FNTYPE. For a library call, FNTYPE is 0. On the ARM, the offset starts at 0. */ -#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \ arm_init_cumulative_args (&(CUM), (FNTYPE), (LIBNAME), (FNDECL)) /* Update the data in CUM to advance over an argument diff --git a/gcc/config/avr/avr.h b/gcc/config/avr/avr.h index 6488428..01ca604 100644 --- a/gcc/config/avr/avr.h +++ b/gcc/config/avr/avr.h @@ -381,7 +381,8 @@ typedef struct avr_args { int regno; /* next available register number */ } CUMULATIVE_ARGS; -#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL) init_cumulative_args (&(CUM), FNTYPE, LIBNAME, FNDECL) +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \ + init_cumulative_args (&(CUM), FNTYPE, LIBNAME, FNDECL) #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \ (function_arg_advance (&CUM, MODE, TYPE, NAMED)) diff --git a/gcc/config/c4x/c4x.h b/gcc/config/c4x/c4x.h index 1725b79..35680b3 100644 --- a/gcc/config/c4x/c4x.h +++ b/gcc/config/c4x/c4x.h @@ -1114,7 +1114,7 @@ typedef struct c4x_args } CUMULATIVE_ARGS; -#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ (c4x_init_cumulative_args (&CUM, FNTYPE, LIBNAME)) #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \ diff --git a/gcc/config/cris/cris.h b/gcc/config/cris/cris.h index a999e04..5110f9a 100644 --- a/gcc/config/cris/cris.h +++ b/gcc/config/cris/cris.h @@ -956,7 +956,7 @@ struct cum_args {int regs;}; /* The regs member is an integer, the number of arguments got into registers so far. */ -#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \ ((CUM).regs = 0) #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \ diff --git a/gcc/config/fr30/fr30.h b/gcc/config/fr30/fr30.h index 2975301..0ab0e72 100644 --- a/gcc/config/fr30/fr30.h +++ b/gcc/config/fr30/fr30.h @@ -759,7 +759,8 @@ enum reg_class the function, as a string. LIBNAME is 0 when an ordinary C function call is being processed. Thus, each time this macro is called, either LIBNAME or FNTYPE is nonzero, but never both of them at once. */ -#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT) (CUM) = 0 +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ + (CUM) = 0 /* A C statement (sans semicolon) to update the summarizer variable CUM to advance past an argument in the argument list. The values MODE, TYPE and diff --git a/gcc/config/frv/frv.h b/gcc/config/frv/frv.h index df5ae07..828e8a32 100644 --- a/gcc/config/frv/frv.h +++ b/gcc/config/frv/frv.h @@ -1940,7 +1940,7 @@ struct machine_function GTY(()) being processed. Thus, each time this macro is called, either LIBNAME or FNTYPE is nonzero, but never both of them at once. */ -#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \ frv_init_cumulative_args (&CUM, FNTYPE, LIBNAME, FNDECL, FALSE) /* Like `INIT_CUMULATIVE_ARGS' but overrides it for the purposes of finding the diff --git a/gcc/config/h8300/h8300.h b/gcc/config/h8300/h8300.h index c21eff1..e2ba307 100644 --- a/gcc/config/h8300/h8300.h +++ b/gcc/config/h8300/h8300.h @@ -665,7 +665,7 @@ struct cum_arg On the H8/300, the offset starts at 0. */ -#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ ((CUM).nbytes = 0, (CUM).libcall = LIBNAME) /* Update the data in CUM to advance over an argument diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index 46bb522..482a840 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -1747,7 +1747,7 @@ typedef struct ix86_args { for a call to a function whose data type is FNTYPE. For a library call, FNTYPE is 0. */ -#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \ init_cumulative_args (&(CUM), (FNTYPE), (LIBNAME), (FNDECL)) /* Update the data in CUM to advance over an argument diff --git a/gcc/config/i860/i860.h b/gcc/config/i860/i860.h index 61db1fc..354df72 100644 --- a/gcc/config/i860/i860.h +++ b/gcc/config/i860/i860.h @@ -464,7 +464,7 @@ struct cumulative_args { int ints, floats; }; when the function gets a structure-value-address as an invisible first argument. */ -#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ ((CUM).ints = ((FNTYPE) != 0 && aggregate_value_p (TREE_TYPE ((FNTYPE)), 0) \ ? 4 : 0), \ (CUM).floats = 0) diff --git a/gcc/config/ia64/ia64.h b/gcc/config/ia64/ia64.h index cc21838..279500e 100644 --- a/gcc/config/ia64/ia64.h +++ b/gcc/config/ia64/ia64.h @@ -1338,7 +1338,7 @@ typedef struct ia64_args /* A C statement (sans semicolon) for initializing the variable CUM for the state at the beginning of the argument list. */ -#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ do { \ (CUM).words = 0; \ (CUM).int_regs = 0; \ diff --git a/gcc/config/ip2k/ip2k.h b/gcc/config/ip2k/ip2k.h index 1ed494f..8c9a66c 100644 --- a/gcc/config/ip2k/ip2k.h +++ b/gcc/config/ip2k/ip2k.h @@ -441,7 +441,7 @@ enum reg_class { #define CUMULATIVE_ARGS int -#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ ((CUM) = 0) #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) diff --git a/gcc/config/iq2000/iq2000.c b/gcc/config/iq2000/iq2000.c index 0490072..ca48c91 100644 --- a/gcc/config/iq2000/iq2000.c +++ b/gcc/config/iq2000/iq2000.c @@ -2333,7 +2333,7 @@ iq2000_expand_prologue (void) variable arguments. This is only needed if store_args_on_stack is true. */ - INIT_CUMULATIVE_ARGS (args_so_far, fntype, NULL_RTX, 0); + INIT_CUMULATIVE_ARGS (args_so_far, fntype, NULL_RTX, 0, 0); regno = GP_ARG_FIRST; for (cur_arg = fnargs; cur_arg != 0; cur_arg = next_arg) diff --git a/gcc/config/iq2000/iq2000.h b/gcc/config/iq2000/iq2000.h index d4a3102..a69096b 100644 --- a/gcc/config/iq2000/iq2000.h +++ b/gcc/config/iq2000/iq2000.h @@ -466,7 +466,7 @@ typedef struct iq2000_args /* Initialize a variable CUM of type CUMULATIVE_ARGS for a call to a function whose data type is FNTYPE. For a library call, FNTYPE is 0. */ -#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ init_cumulative_args (& CUM, FNTYPE, LIBNAME) \ #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \ diff --git a/gcc/config/m32r/m32r.h b/gcc/config/m32r/m32r.h index 3ecfc8f..00bdad6 100644 --- a/gcc/config/m32r/m32r.h +++ b/gcc/config/m32r/m32r.h @@ -1044,7 +1044,7 @@ extern enum reg_class m32r_regno_reg_class[FIRST_PSEUDO_REGISTER]; /* Initialize a variable CUM of type CUMULATIVE_ARGS for a call to a function whose data type is FNTYPE. For a library call, FNTYPE is 0. */ -#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ ((CUM) = 0) /* The number of registers used for parameter passing. Local to this file. */ diff --git a/gcc/config/m68hc11/m68hc11.h b/gcc/config/m68hc11/m68hc11.h index 8c0dd19..4dee106 100644 --- a/gcc/config/m68hc11/m68hc11.h +++ b/gcc/config/m68hc11/m68hc11.h @@ -1070,7 +1070,7 @@ typedef struct m68hc11_args /* Initialize a variable CUM of type CUMULATIVE_ARGS for a call to a function whose data type is FNTYPE. For a library call, FNTYPE is 0. */ -#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ (m68hc11_init_cumulative_args (&CUM, FNTYPE, LIBNAME)) /* Update the data in CUM to advance over an argument of mode MODE and data diff --git a/gcc/config/m68k/m68k.h b/gcc/config/m68k/m68k.h index 5ae893e..86742fc 100644 --- a/gcc/config/m68k/m68k.h +++ b/gcc/config/m68k/m68k.h @@ -901,7 +901,7 @@ enum reg_class { On the m68k, the offset starts at 0. */ -#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ ((CUM) = 0) /* Update the data in CUM to advance over an argument diff --git a/gcc/config/mcore/mcore.h b/gcc/config/mcore/mcore.h index 56d311c..6955829 100644 --- a/gcc/config/mcore/mcore.h +++ b/gcc/config/mcore/mcore.h @@ -700,7 +700,7 @@ extern const enum reg_class reg_class_from_letter[]; On MCore, the offset always starts at 0: the first parm reg is always the same reg. */ -#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ ((CUM) = 0) /* Update the data in CUM to advance over an argument diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h index 6b137e4..d899143 100644 --- a/gcc/config/mips/mips.h +++ b/gcc/config/mips/mips.h @@ -2287,7 +2287,7 @@ typedef struct mips_args { for a call to a function whose data type is FNTYPE. For a library call, FNTYPE is 0. */ -#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ init_cumulative_args (&CUM, FNTYPE, LIBNAME) \ /* Update the data in CUM to advance over an argument diff --git a/gcc/config/mmix/mmix.h b/gcc/config/mmix/mmix.h index f628f27..4cb3075 100644 --- a/gcc/config/mmix/mmix.h +++ b/gcc/config/mmix/mmix.h @@ -737,7 +737,7 @@ enum reg_class typedef struct { int regs; int lib; } CUMULATIVE_ARGS; -#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ ((CUM).regs = 0, (CUM).lib = ((LIBNAME) != 0)) #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \ diff --git a/gcc/config/mn10300/mn10300.h b/gcc/config/mn10300/mn10300.h index f3eb753..8508838 100644 --- a/gcc/config/mn10300/mn10300.h +++ b/gcc/config/mn10300/mn10300.h @@ -560,7 +560,7 @@ struct cum_arg {int nbytes; }; On the MN10300, the offset starts at 0. */ -#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ ((CUM).nbytes = 0) /* Update the data in CUM to advance over an argument diff --git a/gcc/config/ns32k/ns32k.h b/gcc/config/ns32k/ns32k.h index 96a6a37..a31eba6 100644 --- a/gcc/config/ns32k/ns32k.h +++ b/gcc/config/ns32k/ns32k.h @@ -675,7 +675,7 @@ enum reg_class On the ns32k, the offset starts at 0. */ -#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ ((CUM) = 0) /* Update the data in CUM to advance over an argument diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h index 95fb2f2..944917f 100644 --- a/gcc/config/pa/pa.h +++ b/gcc/config/pa/pa.h @@ -785,7 +785,7 @@ struct hppa_args {int words, nargs_prototype, incoming, indirect; }; for a call to a function whose data type is FNTYPE. For a library call, FNTYPE is 0. */ -#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,FNDECL) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \ (CUM).words = 0, \ (CUM).incoming = 0, \ (CUM).indirect = (FNTYPE) && !(FNDECL), \ diff --git a/gcc/config/pdp11/pdp11.h b/gcc/config/pdp11/pdp11.h index d54146f..725fe25 100644 --- a/gcc/config/pdp11/pdp11.h +++ b/gcc/config/pdp11/pdp11.h @@ -591,7 +591,7 @@ maybe ac0 ? - as option someday! */ when the function gets a structure-value-address as an invisible first argument. */ -#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ ((CUM) = 0) /* Update the data in CUM to advance over an argument diff --git a/gcc/config/rs6000/rs6000-protos.h b/gcc/config/rs6000/rs6000-protos.h index 2dcdd0d..1121e30 100644 --- a/gcc/config/rs6000/rs6000-protos.h +++ b/gcc/config/rs6000/rs6000-protos.h @@ -28,7 +28,7 @@ #ifdef RTX_CODE #ifdef TREE_CODE -extern void init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, int, int); +extern void init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, int, int, int); extern void rs6000_va_start (tree, rtx); #endif /* TREE_CODE */ diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 27aef80..1db36b1 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -3836,7 +3836,8 @@ rs6000_return_in_memory (tree type, tree fntype ATTRIBUTE_UNUSED) void init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype, - rtx libname ATTRIBUTE_UNUSED, int incoming, int libcall) + rtx libname ATTRIBUTE_UNUSED, int incoming, + int libcall, int n_named_args) { static CUMULATIVE_ARGS zero_cumulative; @@ -3853,17 +3854,9 @@ init_cumulative_args (CUMULATIVE_ARGS *cum, tree fntype, && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype))) != void_type_node)); - if (incoming) - cum->nargs_prototype = 1000; /* don't return a PARALLEL */ - - else if (cum->prototype) - cum->nargs_prototype = (list_length (TYPE_ARG_TYPES (fntype)) - 1 - + (TYPE_MODE (TREE_TYPE (fntype)) == BLKmode - || rs6000_return_in_memory (TREE_TYPE (fntype), - fntype))); - - else - cum->nargs_prototype = 0; + cum->nargs_prototype = 0; + if (incoming || cum->prototype) + cum->nargs_prototype = n_named_args; /* Check for a longcall attribute. */ if (fntype @@ -8369,10 +8362,10 @@ addrs_ok_for_quad_peep (rtx addr1, rtx addr2) } /* Make sure the second address is a (mem (plus (reg) (const_int))) - or if it is (mem (reg)) then make sure that offset1 is -8 and the same - register as addr1. */ + or if it is (mem (reg)) then make sure that offset1 is -8 and the same + register as addr1. */ if (offset1 == -8 && GET_CODE (addr2) == REG && reg1 == REGNO (addr2)) - return 1; + return 1; if (GET_CODE (addr2) != PLUS) return 0; diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index 7b87f59..8ca547ad 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -1767,19 +1767,19 @@ typedef struct rs6000_args for a call to a function whose data type is FNTYPE. For a library call, FNTYPE is 0. */ -#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) \ - init_cumulative_args (&CUM, FNTYPE, LIBNAME, FALSE, FALSE) +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ + init_cumulative_args (&CUM, FNTYPE, LIBNAME, FALSE, FALSE, N_NAMED_ARGS) /* Similar, but when scanning the definition of a procedure. We always set NARGS_PROTOTYPE large so we never return an EXPR_LIST. */ -#define INIT_CUMULATIVE_INCOMING_ARGS(CUM,FNTYPE,LIBNAME) \ - init_cumulative_args (&CUM, FNTYPE, LIBNAME, TRUE, FALSE) +#define INIT_CUMULATIVE_INCOMING_ARGS(CUM, FNTYPE, LIBNAME) \ + init_cumulative_args (&CUM, FNTYPE, LIBNAME, TRUE, FALSE, 1000) /* Like INIT_CUMULATIVE_ARGS' but only used for outgoing libcalls. */ #define INIT_CUMULATIVE_LIBCALL_ARGS(CUM, MODE, LIBNAME) \ - init_cumulative_args (&CUM, NULL_TREE, LIBNAME, FALSE, TRUE) + init_cumulative_args (&CUM, NULL_TREE, LIBNAME, FALSE, TRUE, 0) /* Update the data in CUM to advance over an argument of mode MODE and data type TYPE. diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index d3c903f..1acdead 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -8958,7 +8958,7 @@ sh_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED, SH that it's best to do this completely machine independently. "this" is passed as first argument, unless a structure return pointer comes first, in which case "this" comes second. */ - INIT_CUMULATIVE_ARGS (cum, funtype, NULL_RTX, 0); + INIT_CUMULATIVE_ARGS (cum, funtype, NULL_RTX, 0, 1); #ifndef PCC_STATIC_STRUCT_RETURN if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function)), function)) structure_value_byref = 1; diff --git a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h index b83a24e..c367797 100644 --- a/gcc/config/sh/sh.h +++ b/gcc/config/sh/sh.h @@ -1820,7 +1820,7 @@ struct sh_args { For TARGET_HITACHI, the structure value pointer is passed in memory. */ -#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \ do { \ (CUM).arg_count[(int) SH_ARG_INT] = 0; \ (CUM).arg_count[(int) SH_ARG_FLOAT] = 0; \ @@ -1851,7 +1851,7 @@ struct sh_args { #define INIT_CUMULATIVE_LIBCALL_ARGS(CUM, MODE, LIBNAME) \ do { \ - INIT_CUMULATIVE_ARGS ((CUM), NULL_TREE, (LIBNAME), 0); \ + INIT_CUMULATIVE_ARGS ((CUM), NULL_TREE, (LIBNAME), 0, 0); \ (CUM).call_cookie \ = (CALL_COOKIE_RET_TRAMP \ (TARGET_SHCOMPACT && GET_MODE_SIZE (MODE) > 4 \ @@ -1860,7 +1860,7 @@ struct sh_args { #define INIT_CUMULATIVE_INCOMING_ARGS(CUM, FNTYPE, LIBNAME) \ do { \ - INIT_CUMULATIVE_ARGS ((CUM), (FNTYPE), (LIBNAME), 0); \ + INIT_CUMULATIVE_ARGS ((CUM), (FNTYPE), (LIBNAME), 0, 0); \ (CUM).outgoing = 0; \ } while (0) diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h index bfe3e32..81a1be3 100644 --- a/gcc/config/sparc/sparc.h +++ b/gcc/config/sparc/sparc.h @@ -1673,7 +1673,7 @@ struct sparc_args { for a call to a function whose data type is FNTYPE. For a library call, FNTYPE is 0. */ -#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, FNDECL, N_NAMED_ARGS) \ init_cumulative_args (& (CUM), (FNTYPE), (LIBNAME), (FNDECL)); /* Update the data in CUM to advance over an argument diff --git a/gcc/config/stormy16/stormy16.h b/gcc/config/stormy16/stormy16.h index 726ef4b..09584ad 100644 --- a/gcc/config/stormy16/stormy16.h +++ b/gcc/config/stormy16/stormy16.h @@ -424,7 +424,8 @@ enum reg_class of arguments that have been passed in registers so far. */ #define CUMULATIVE_ARGS int -#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT) (CUM) = 0 +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ + (CUM) = 0 #define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \ ((CUM) = xstormy16_function_arg_advance (CUM, MODE, TYPE, NAMED)) diff --git a/gcc/config/v850/v850.h b/gcc/config/v850/v850.h index 4233d72..74a080c 100644 --- a/gcc/config/v850/v850.h +++ b/gcc/config/v850/v850.h @@ -753,7 +753,7 @@ struct cum_arg { int nbytes; int anonymous_args; }; for a call to a function whose data type is FNTYPE. For a library call, FNTYPE is 0. */ -#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ ((CUM).nbytes = 0, (CUM).anonymous_args = 0) /* Update the data in CUM to advance over an argument diff --git a/gcc/config/vax/vax.h b/gcc/config/vax/vax.h index 3902c4b..c2de0f6 100644 --- a/gcc/config/vax/vax.h +++ b/gcc/config/vax/vax.h @@ -441,7 +441,7 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES }; On the VAX, the offset starts at 0. */ -#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ ((CUM) = 0) /* Update the data in CUM to advance over an argument diff --git a/gcc/config/xtensa/xtensa.h b/gcc/config/xtensa/xtensa.h index cc6d1b2..0e97229 100644 --- a/gcc/config/xtensa/xtensa.h +++ b/gcc/config/xtensa/xtensa.h @@ -749,7 +749,7 @@ typedef struct xtensa_args { /* Initialize a variable CUM of type CUMULATIVE_ARGS for a call to a function whose data type is FNTYPE. For a library call, FNTYPE is 0. */ -#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT) \ +#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \ init_cumulative_args (&CUM, FNTYPE, LIBNAME) #define INIT_CUMULATIVE_INCOMING_ARGS(CUM, FNTYPE, LIBNAME) \ diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index 46c0b65..dc6953a 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -3725,7 +3725,7 @@ arguments are passed on the stack, there is no need to store anything in should not be empty, so use @code{int}. @end defmac -@defmac INIT_CUMULATIVE_ARGS (@var{cum}, @var{fntype}, @var{libname}, @var{fndecl}) +@defmac INIT_CUMULATIVE_ARGS (@var{cum}, @var{fntype}, @var{libname}, @var{fndecl}, @var{n_named_args}) A C statement (sans semicolon) for initializing the variable @var{cum} for the state at the beginning of the argument list. The variable has type @code{CUMULATIVE_ARGS}. The value of @var{fntype} @@ -3734,7 +3734,10 @@ the args, or 0 if the args are to a compiler support library function. For direct calls that are not libcalls, @var{fndecl} contain the declaration node of the function. @var{fndecl} is also set when @code{INIT_CUMULATIVE_ARGS} is used to find arguments for the function -being compiled. +being compiled. @var{n_named_args} is set to the number of named +arguments, including a structure return address if it is passed as a +parameter, when making a call. When processing incoming arguments, +@var{n_named_args} is set to -1. When processing a call to a compiler support library function, @var{libname} identifies which one. It is a @code{symbol_ref} rtx which @@ -1390,7 +1390,7 @@ block_move_libcall_safe_for_call_parm (void) tree fn, arg; fn = emit_block_move_libcall_fn (false); - INIT_CUMULATIVE_ARGS (args_so_far, TREE_TYPE (fn), NULL_RTX, 0); + INIT_CUMULATIVE_ARGS (args_so_far, TREE_TYPE (fn), NULL_RTX, 0, 3); arg = TYPE_ARG_TYPES (TREE_TYPE (fn)); for ( ; arg != void_list_node ; arg = TREE_CHAIN (arg)) diff --git a/gcc/function.c b/gcc/function.c index 675d919..890ebd3 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -4351,7 +4351,7 @@ assign_parms (tree fndecl) #ifdef INIT_CUMULATIVE_INCOMING_ARGS INIT_CUMULATIVE_INCOMING_ARGS (args_so_far, fntype, NULL_RTX); #else - INIT_CUMULATIVE_ARGS (args_so_far, fntype, NULL_RTX, fndecl); + INIT_CUMULATIVE_ARGS (args_so_far, fntype, NULL_RTX, fndecl, -1); #endif /* We haven't yet found an argument that we must push and pretend the |