sh.h (PASS_IN_REG_P): For TARGET_HITACHI, don't pass structures in registers.

* sh.h (PASS_IN_REG_P):  For TARGET_HITACHI, don't pass structures
	in registers.
	* expr.h (PRETEND_OUTGOING_VARARGS_NAMED): Provide default definition.
	* function.c (assign_parms): Honour PRETEND_OUTGOING_VARARGS_NAMED.
	* calls.c (expand_call): Likewise.
	* sh.c (sh_expand_prologue): For TARGET_HITACHI, don't push varargs /
	stdarg arguments.
	* sh.h (CPP_SPEC): Add -D__HITACHI__ for -mhitachi.
	(FUNCTION_ARG):  For TARGET_HITACHI, don't pass unnamed
	arguments in registers.
	(PRETEND_OUTGOING_VARARGS_NAMED): Define.
	* va-sh.h (entire file): If __HITACHI__ is defined, use sh[123]
	flavour varargs.

From-SVN: r25440
This commit is contained in:
J"orn Rennecke 1999-02-25 14:02:32 +00:00 committed by Joern Rennecke
parent 345137c78a
commit 9ab70a9bd7
8 changed files with 65 additions and 20 deletions

View file

@ -1,3 +1,21 @@
Thu Feb 25 21:52:54 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
* sh.h (PASS_IN_REG_P): For TARGET_HITACHI, don't pass structures
in registers.
* expr.h (PRETEND_OUTGOING_VARARGS_NAMED): Provide default definition.
* function.c (assign_parms): Honour PRETEND_OUTGOING_VARARGS_NAMED.
* calls.c (expand_call): Likewise.
* sh.c (sh_expand_prologue): For TARGET_HITACHI, don't push varargs /
stdarg arguments.
* sh.h (CPP_SPEC): Add -D__HITACHI__ for -mhitachi.
(FUNCTION_ARG): For TARGET_HITACHI, don't pass unnamed
arguments in registers.
(PRETEND_OUTGOING_VARARGS_NAMED): Define.
* va-sh.h (entire file): If __HITACHI__ is defined, use sh[123]
flavour varargs.
Thu Feb 25 14:32:40 1999 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* cse.c (dump_class): Revert last change and make the prototype

View file

@ -1731,21 +1731,18 @@ expand_call (exp, target, ignore)
(If no anonymous args follow, the result of list_length is actually
one too large. This is harmless.)
If SETUP_INCOMING_VARARGS is defined and STRICT_ARGUMENT_NAMING is zero,
this machine will be able to place unnamed args that were passed in
If PRETEND_OUTGOING_VARARGS_NAMED is set and STRICT_ARGUMENT_NAMING is
zero, this machine will be able to place unnamed args that were passed in
registers into the stack. So treat all args as named. This allows the
insns emitting for a specific argument list to be independent of the
function declaration.
If SETUP_INCOMING_VARARGS is not defined, we do not have any reliable
If PRETEND_OUTGOING_VARARGS_NAMED is not set, we do not have any reliable
way to pass unnamed args in registers, so we must force them into
memory. */
if ((STRICT_ARGUMENT_NAMING
#ifndef SETUP_INCOMING_VARARGS
|| 1
#endif
)
|| ! PRETEND_OUTGOING_VARARGS_NAMED)
&& TYPE_ARG_TYPES (funtype) != 0)
n_named_args
= (list_length (TYPE_ARG_TYPES (funtype))

View file

@ -3717,7 +3717,7 @@ sh_expand_prologue ()
current_function_anonymous_args = 0;
/* This is not used by the SH3E calling convention */
if (!TARGET_SH3E)
if (! TARGET_SH3E && ! TARGET_HITACHI)
{
/* Push arg regs as if they'd been provided by caller in stack. */
for (i = 0; i < NPARM_REGS(SImode); i++)

View file

@ -46,7 +46,8 @@ extern int code_for_indirect_jump_scratch;
%{m4-single-only:-D__SH4_SINGLE_ONLY__} \
%{m4-single:-D__SH4_SINGLE__} \
%{m4:-D__SH4__} \
%{!m1:%{!m2:%{!m3:%{!m3e:%{!m4:%{!m4-single:%{!m4-single-only:-D__sh1__}}}}}}}"
%{!m1:%{!m2:%{!m3:%{!m3e:%{!m4:%{!m4-single:%{!m4-single-only:-D__sh1__}}}}}}} \
%{mhitachi:-D__HITACHI__}"
#define CPP_PREDEFINES "-D__sh__ -Acpu(sh) -Amachine(sh)"
@ -1004,7 +1005,9 @@ struct sh_args {
This macro is only used in this file. */
#define PASS_IN_REG_P(CUM, MODE, TYPE) \
(((TYPE) == 0 || ! TREE_ADDRESSABLE ((tree)(TYPE))) \
(((TYPE) == 0 \
|| (! TREE_ADDRESSABLE ((tree)(TYPE))) \
&& (! TARGET_HITACHI || ! AGGREGATE_TYPE_P (TYPE))) \
&& (TARGET_SH3E \
? ((MODE) == BLKmode \
? (((CUM).arg_count[(int) SH_ARG_INT] * UNITS_PER_WORD \
@ -1037,13 +1040,16 @@ extern int current_function_varargs;
#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
((PASS_IN_REG_P ((CUM), (MODE), (TYPE)) \
&& ((NAMED) || TARGET_SH3E || ! current_function_varargs)) \
&& ((NAMED) \
|| (! TARGET_HITACHI && (TARGET_SH3E || ! current_function_varargs)))) \
? gen_rtx (REG, (MODE), \
((BASE_ARG_REG (MODE) + ROUND_REG ((CUM), (MODE))) \
^ ((MODE) == SFmode && TARGET_SH4 \
&& TARGET_LITTLE_ENDIAN != 0))) \
: 0)
#define PRETEND_OUTGOING_VARARGS_NAMED (! TARGET_HITACHI)
/* For an arg passed partly in registers and partly in memory,
this is the number of registers used.
For args passed entirely in registers or entirely in memory, zero.

View file

@ -216,6 +216,17 @@ enum direction {none, upward, downward}; /* Value has this type. */
#define STRICT_ARGUMENT_NAMING 0
#endif
/* Provide a default value for PRETEND_OUTGOING_VARARGS_NAMED. */
#ifdef SETUP_INCOMING_VARARGS
#ifndef PRETEND_OUTGOING_VARARGS_NAMED
#define PRETEND_OUTGOING_VARARGS_NAMED 1
#endif
#else
/* It is an error to define PRETEND_OUTGOING_VARARGS_NAMED without
defining SETUP_INCOMING_VARARGS. */
#define PRETEND_OUTGOING_VARARGS_NAMED 0
#endif
/* Nonzero if we do not know how to pass TYPE solely in registers.
We cannot do so in the following cases:

View file

@ -4096,6 +4096,7 @@ assign_parms (fndecl, second_time)
int did_conversion = 0;
tree passed_type = DECL_ARG_TYPE (parm);
tree nominal_type = TREE_TYPE (parm);
int pretend_named;
/* Set LAST_NAMED if this is last named arg before some
anonymous args. */
@ -4217,6 +4218,7 @@ assign_parms (fndecl, second_time)
In this case, we call FUNCTION_ARG with NAMED set to 1 instead of
0 as it was the previous time. */
pretend_named = named_arg || PRETEND_OUTGOING_VARARGS_NAMED;
locate_and_pad_parm (nominal_mode, passed_type,
#ifdef STACK_PARMS_IN_REG_PARM_AREA
1,
@ -4224,12 +4226,11 @@ assign_parms (fndecl, second_time)
#ifdef FUNCTION_INCOMING_ARG
FUNCTION_INCOMING_ARG (args_so_far, promoted_mode,
passed_type,
(named_arg
|| varargs_setup)) != 0,
pretend_named) != 0,
#else
FUNCTION_ARG (args_so_far, promoted_mode,
passed_type,
named_arg || varargs_setup) != 0,
pretend_named) != 0,
#endif
#endif
fndecl, &stack_args_size, &stack_offset, &arg_size);

View file

@ -1,12 +1,15 @@
/* This is just like the default gvarargs.h
except for differences described below. */
/* The ! __SH3E_VARG case is similar to the default gvarargs.h . */
#if (defined (__SH3E__) || defined (__SH4_SINGLE__) || defined (__SH4__) || defined (__SH4_SINGLE_ONLY__)) && ! defined (__HITACHI__)
#define __SH3E_VARG
#endif
/* Define __gnuc_va_list. */
#ifndef __GNUC_VA_LIST
#define __GNUC_VA_LIST
#if defined (__SH3E__) || defined (__SH4_SINGLE__) || defined (__SH4__) || defined (__SH4_SINGLE_ONLY__)
#ifdef __SH3E_VARG
typedef long __va_greg;
typedef float __va_freg;
@ -33,7 +36,7 @@ typedef void *__gnuc_va_list;
#ifdef _STDARG_H
#if defined (__SH3E__) || defined (__SH4_SINGLE__) || defined (__SH4__) || defined (__SH4_SINGLE_ONLY__)
#ifdef __SH3E_VARG
#define va_start(AP, LASTARG) \
__extension__ \
@ -59,7 +62,7 @@ __extension__ \
#define va_alist __builtin_va_alist
#define va_dcl int __builtin_va_alist;...
#if defined (__SH3E__) || defined (__SH4_SINGLE__) || defined (__SH4__) || defined (__SH4_SINGLE_ONLY__)
#ifdef __SH3E_VARG
#define va_start(AP) \
__extension__ \
@ -164,7 +167,7 @@ enum __va_type_classes {
? (((union { TYPE t; int i;} *__VA_REF) (AP))++)->t \
: ((union {TYPE t;TYPE u;}*) ((char *)++(int *__VA_REF)(AP) - sizeof (TYPE)))->t);})
#if defined (__SH3E__) || defined (__SH4_SINGLE__) || defined (__SH4__) || defined (__SH4_SINGLE_ONLY__)
#ifdef __SH3E_VARG
#define __PASS_AS_FLOAT(TYPE_CLASS,SIZE) \
(TYPE_CLASS == __real_type_class && SIZE == 4)

View file

@ -3789,6 +3789,15 @@ are treated as named. Otherwise, all named arguments except the last
are treated as named.
You need not define this macro if it always returns zero.
@findex PRETEND_OUTGOING_VARARGS_NAMED
@item PRETEND_OUTGOING_VARARGS_NAMED
If you need to conditionally change ABIs so that one works with
@code{SETUP_INCOMING_VARARGS}, but the other works like neither
@code{SETUP_INCOMING_VARARGS} nor @code{STRICT_ARGUMENT_NAMING} was
defined, then define this macro to return nonzero if
@code{SETUP_INCOMING_VARARGS} is used, zero otherwise.
Otherwise, you should not define this macro.
@end table
@node Trampolines