aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJ"orn Rennecke <amylaar@cygnus.co.uk>1998-04-23 20:57:06 +0000
committerJoern Rennecke <amylaar@gcc.gnu.org>1998-04-23 21:57:06 +0100
commitaec373f1a1b31c887850c869440cb479abcb89b4 (patch)
treeb2668d43c372c2855e84333917737ab7aedf339c
parentf1f53f0b758bb51f646c87bbfd5b8cb32fcef12e (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/config/sh/sh.c6
-rw-r--r--gcc/config/sh/sh.h5
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)) \