diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-04-17 06:19:17 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-04-17 06:19:17 +0000 |
commit | 2dc656b72a969e752d28f01c892780cca6bb0597 (patch) | |
tree | 0e1c00d807879a77905547b87b45f49a2ad68785 /gcc/config/alpha | |
parent | 8b739b9f705739d597985e6bab670579d43c30ed (diff) | |
download | gcc-2dc656b72a969e752d28f01c892780cca6bb0597.tar.gz |
PR target/20375
* config/alpha/alpha.c (alpha_setup_incoming_varargs): Advance a copy
of CUMULATIVE_ARGS past the last named argument.
(alpha_va_start): Expect pretend_args_size only if strictly less than
6 named arguments.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@98257 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/alpha')
-rw-r--r-- | gcc/config/alpha/alpha.c | 35 |
1 files changed, 17 insertions, 18 deletions
diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c index 39ad4a7aaa8..fdcbf1b8a08 100644 --- a/gcc/config/alpha/alpha.c +++ b/gcc/config/alpha/alpha.c @@ -5732,22 +5732,24 @@ escapes: variable number of arguments. */ static void -alpha_setup_incoming_varargs (CUMULATIVE_ARGS *pcum, - enum machine_mode mode ATTRIBUTE_UNUSED, - tree type ATTRIBUTE_UNUSED, - int *pretend_size, int no_rtl) +alpha_setup_incoming_varargs (CUMULATIVE_ARGS *pcum, enum machine_mode mode, + tree type, int *pretend_size, int no_rtl) { + CUMULATIVE_ARGS cum = *pcum; + + /* Skip the current argument. */ + FUNCTION_ARG_ADVANCE (cum, mode, type, 1); + #if TARGET_ABI_UNICOSMK /* On Unicos/Mk, the standard subroutine __T3E_MISMATCH stores all register arguments on the stack. Unfortunately, it doesn't always store the first one (i.e. the one that arrives in $16 or $f16). This is not a problem with stdargs as we always have at least one named argument there. */ - int num_reg_words = pcum->num_reg_words; - if (num_reg_words < 6) + if (cum.num_reg_words < 6) { if (!no_rtl) { - emit_insn (gen_umk_mismatch_args (GEN_INT (num_reg_words + 1))); + emit_insn (gen_umk_mismatch_args (GEN_INT (cum.num_reg_words))); emit_insn (gen_arg_home_umk ()); } *pretend_size = 0; @@ -5759,7 +5761,7 @@ alpha_setup_incoming_varargs (CUMULATIVE_ARGS *pcum, This is not only because we won't need the space, but because AP includes the current_pretend_args_size and we don't want to mess up any ap-relative addresses already made. */ - if (pcum->num_args < 6) + if (cum.num_args < 6) { if (!no_rtl) { @@ -5780,8 +5782,6 @@ alpha_setup_incoming_varargs (CUMULATIVE_ARGS *pcum, not the most efficient way to implement varargs with just one register class, but it isn't worth doing anything more efficient in this rare case. */ - CUMULATIVE_ARGS cum = *pcum; - if (cum >= 6) return; @@ -5791,18 +5791,17 @@ alpha_setup_incoming_varargs (CUMULATIVE_ARGS *pcum, rtx tmp; tmp = gen_rtx_MEM (BLKmode, - plus_constant (virtual_incoming_args_rtx, - (cum + 6) * UNITS_PER_WORD)); + plus_constant (virtual_incoming_args_rtx, + (cum + 6) * UNITS_PER_WORD)); set_mem_alias_set (tmp, set); move_block_from_reg (16 + cum, tmp, 6 - cum); tmp = gen_rtx_MEM (BLKmode, - plus_constant (virtual_incoming_args_rtx, - cum * UNITS_PER_WORD)); + plus_constant (virtual_incoming_args_rtx, + cum * UNITS_PER_WORD)); set_mem_alias_set (tmp, set); - move_block_from_reg (16 + (TARGET_FPREGS ? 32 : 0) + cum, tmp, - 6 - cum); - } + move_block_from_reg (16 + cum + TARGET_FPREGS*32, tmp, 6 - cum); + } *pretend_size = 12 * UNITS_PER_WORD; #endif } @@ -5831,7 +5830,7 @@ alpha_va_start (tree valist, rtx nextarg ATTRIBUTE_UNUSED) integer argument register; that futzes with pretend_args_size, which changes the meaning of AP. */ - if (NUM_ARGS <= 6) + if (NUM_ARGS < 6) offset = TARGET_ABI_OPEN_VMS ? UNITS_PER_WORD : 6 * UNITS_PER_WORD; else offset = -6 * UNITS_PER_WORD + current_function_pretend_args_size; |