diff options
author | Alan Modra <amodra@bigpond.net.au> | 2004-06-24 06:10:35 +0000 |
---|---|---|
committer | Alan Modra <amodra@gcc.gnu.org> | 2004-06-24 15:40:35 +0930 |
commit | 3a4d587b32145384beb79942f6ba1137a1409656 (patch) | |
tree | 43dbb623994689c18ffd4dc140e02cd4778da8e9 /gcc/calls.c | |
parent | 8c56bb830708cab8909c6911124af2565ad1acc6 (diff) | |
download | gcc-3a4d587b32145384beb79942f6ba1137a1409656.zip gcc-3a4d587b32145384beb79942f6ba1137a1409656.tar.gz gcc-3a4d587b32145384beb79942f6ba1137a1409656.tar.bz2 |
calls.c (expand_call): Call INIT_CUMULATIVE_ARGS earlier, and pass raw n_named_args to it.
* calls.c (expand_call): Call INIT_CUMULATIVE_ARGS earlier, and
pass raw n_named_args to it.
* targhooks.c: Formatting.
(hook_bool_CUMULATIVE_ARGS_false): Correct comment.
From-SVN: r83583
Diffstat (limited to 'gcc/calls.c')
-rw-r--r-- | gcc/calls.c | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/gcc/calls.c b/gcc/calls.c index c443542..80931003 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -2275,6 +2275,26 @@ expand_call (tree exp, rtx target, int ignore) num_actuals++; /* Compute number of named args. + First, do a raw count of the args for INIT_CUMULATIVE_ARGS. */ + + if (type_arg_types != 0) + n_named_args + = (list_length (type_arg_types) + /* Count the struct value address, if it is passed as a parm. */ + + structure_value_addr_parm); + else + /* 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); + + /* Now possibly adjust the number of named args. Normally, don't include the last named arg if anonymous args follow. We do include the last named arg if targetm.calls.strict_argument_naming() returns nonzero. @@ -2292,27 +2312,17 @@ expand_call (tree exp, rtx target, int ignore) we do not have any reliable way to pass unnamed args in registers, so we must force them into memory. */ - if ((targetm.calls.strict_argument_naming (&args_so_far) - || ! targetm.calls.pretend_outgoing_varargs_named (&args_so_far)) - && type_arg_types != 0) - n_named_args - = (list_length (type_arg_types) - /* Don't include the last named arg. */ - - (targetm.calls.strict_argument_naming (&args_so_far) ? 0 : 1) - /* Count the struct value address, if it is passed as a parm. */ - + structure_value_addr_parm); + if (type_arg_types != 0 + && targetm.calls.strict_argument_naming (&args_so_far)) + ; + else if (type_arg_types != 0 + && ! targetm.calls.pretend_outgoing_varargs_named (&args_so_far)) + /* Don't include the last named arg. */ + --n_named_args; else - /* If we know nothing, treat all args as named. */ + /* 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)); |