diff options
author | J"orn Rennecke <amylaar@cygnus.co.uk> | 1998-04-23 20:57:06 +0000 |
---|---|---|
committer | Joern Rennecke <amylaar@gcc.gnu.org> | 1998-04-23 21:57:06 +0100 |
commit | aec373f1a1b31c887850c869440cb479abcb89b4 (patch) | |
tree | b2668d43c372c2855e84333917737ab7aedf339c | |
parent | f1f53f0b758bb51f646c87bbfd5b8cb32fcef12e (diff) | |
download | gcc-aec373f1a1b31c887850c869440cb479abcb89b4.zip gcc-aec373f1a1b31c887850c869440cb479abcb89b4.tar.gz gcc-aec373f1a1b31c887850c869440cb479abcb89b4.tar.bz2 |
Fix for execute/980205.c failure on SH[123].
* sh.c (sh_expand_prologue, in !SH3E code): Don't push an extra
register for stdarg functions.
* sh.h (current_function_varargs): Declare.
(FUNCTION_ARG): Ignore NAMED for stdarg functions.
From-SVN: r19391
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/sh/sh.c | 6 | ||||
-rw-r--r-- | gcc/config/sh/sh.h | 5 |
3 files changed, 13 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index dfb0218..3063e96 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +Fri Apr 24 04:42:35 1998 J"orn Rennecke <amylaar@cygnus.co.uk> + + * sh.c (sh_expand_prologue, in !SH3E code): Don't push an extra + register for stdarg functions. + * sh.h (current_function_varargs): Declare. + (FUNCTION_ARG): Ignore NAMED for stdarg functions. + 1998-04-23 Jim Wilson <wilson@cygnus.com> * frame.c, libgcc2.c (stdlib.h, unistd.h): Don't include when diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index 447716c..6441a41 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -3488,9 +3488,9 @@ sh_expand_prologue () for (i = 0; i < NPARM_REGS(SImode); i++) { int rn = NPARM_REGS(SImode) + FIRST_PARM_REG - i - 1; - if (i > (NPARM_REGS(SImode) - - current_function_args_info.arg_count[(int) SH_ARG_INT] - - current_function_varargs)) + if (i >= (NPARM_REGS(SImode) + - current_function_args_info.arg_count[(int) SH_ARG_INT] + )) break; push (rn); extra_push += 4; diff --git a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h index ac1a622..2c008a4 100644 --- a/gcc/config/sh/sh.h +++ b/gcc/config/sh/sh.h @@ -875,9 +875,11 @@ struct sh_args { NPARM_REGS words is at least partially passed in a register unless its data type forbids. */ +extern int current_function_varargs; + #define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \ ((PASS_IN_REG_P ((CUM), (MODE), (TYPE)) \ - && ((NAMED) || TARGET_SH3E)) \ + && ((NAMED) || TARGET_SH3E || ! current_function_varargs)) \ ? gen_rtx (REG, (MODE), \ (BASE_ARG_REG (MODE) + ROUND_REG ((CUM), (MODE)))) \ : 0) @@ -890,7 +892,6 @@ struct sh_args { #define FUNCTION_ARG_PARTIAL_NREGS(CUM, MODE, TYPE, NAMED) \ ((PASS_IN_REG_P ((CUM), (MODE), (TYPE)) \ - && ((NAMED) || TARGET_SH3E) \ && (ROUND_REG ((CUM), (MODE)) \ + (MODE != BLKmode \ ? ROUND_ADVANCE (GET_MODE_SIZE (MODE)) \ |