Commit 9ab70a9b by J"orn Rennecke Committed by Joern Rennecke

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
parent 345137c7
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> 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 * cse.c (dump_class): Revert last change and make the prototype
......
...@@ -1731,21 +1731,18 @@ expand_call (exp, target, ignore) ...@@ -1731,21 +1731,18 @@ expand_call (exp, target, ignore)
(If no anonymous args follow, the result of list_length is actually (If no anonymous args follow, the result of list_length is actually
one too large. This is harmless.) one too large. This is harmless.)
If SETUP_INCOMING_VARARGS is defined and STRICT_ARGUMENT_NAMING is zero, If PRETEND_OUTGOING_VARARGS_NAMED is set and STRICT_ARGUMENT_NAMING is
this machine will be able to place unnamed args that were passed in 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 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 insns emitting for a specific argument list to be independent of the
function declaration. 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 way to pass unnamed args in registers, so we must force them into
memory. */ memory. */
if ((STRICT_ARGUMENT_NAMING if ((STRICT_ARGUMENT_NAMING
#ifndef SETUP_INCOMING_VARARGS || ! PRETEND_OUTGOING_VARARGS_NAMED)
|| 1
#endif
)
&& TYPE_ARG_TYPES (funtype) != 0) && TYPE_ARG_TYPES (funtype) != 0)
n_named_args n_named_args
= (list_length (TYPE_ARG_TYPES (funtype)) = (list_length (TYPE_ARG_TYPES (funtype))
......
...@@ -3717,7 +3717,7 @@ sh_expand_prologue () ...@@ -3717,7 +3717,7 @@ sh_expand_prologue ()
current_function_anonymous_args = 0; current_function_anonymous_args = 0;
/* This is not used by the SH3E calling convention */ /* 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. */ /* Push arg regs as if they'd been provided by caller in stack. */
for (i = 0; i < NPARM_REGS(SImode); i++) for (i = 0; i < NPARM_REGS(SImode); i++)
......
...@@ -46,7 +46,8 @@ extern int code_for_indirect_jump_scratch; ...@@ -46,7 +46,8 @@ extern int code_for_indirect_jump_scratch;
%{m4-single-only:-D__SH4_SINGLE_ONLY__} \ %{m4-single-only:-D__SH4_SINGLE_ONLY__} \
%{m4-single:-D__SH4_SINGLE__} \ %{m4-single:-D__SH4_SINGLE__} \
%{m4:-D__SH4__} \ %{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)" #define CPP_PREDEFINES "-D__sh__ -Acpu(sh) -Amachine(sh)"
...@@ -1004,7 +1005,9 @@ struct sh_args { ...@@ -1004,7 +1005,9 @@ struct sh_args {
This macro is only used in this file. */ This macro is only used in this file. */
#define PASS_IN_REG_P(CUM, MODE, TYPE) \ #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 \ && (TARGET_SH3E \
? ((MODE) == BLKmode \ ? ((MODE) == BLKmode \
? (((CUM).arg_count[(int) SH_ARG_INT] * UNITS_PER_WORD \ ? (((CUM).arg_count[(int) SH_ARG_INT] * UNITS_PER_WORD \
...@@ -1037,13 +1040,16 @@ extern int current_function_varargs; ...@@ -1037,13 +1040,16 @@ extern int current_function_varargs;
#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \ #define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
((PASS_IN_REG_P ((CUM), (MODE), (TYPE)) \ ((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), \ ? gen_rtx (REG, (MODE), \
((BASE_ARG_REG (MODE) + ROUND_REG ((CUM), (MODE))) \ ((BASE_ARG_REG (MODE) + ROUND_REG ((CUM), (MODE))) \
^ ((MODE) == SFmode && TARGET_SH4 \ ^ ((MODE) == SFmode && TARGET_SH4 \
&& TARGET_LITTLE_ENDIAN != 0))) \ && TARGET_LITTLE_ENDIAN != 0))) \
: 0) : 0)
#define PRETEND_OUTGOING_VARARGS_NAMED (! TARGET_HITACHI)
/* For an arg passed partly in registers and partly in memory, /* For an arg passed partly in registers and partly in memory,
this is the number of registers used. this is the number of registers used.
For args passed entirely in registers or entirely in memory, zero. For args passed entirely in registers or entirely in memory, zero.
......
...@@ -216,6 +216,17 @@ enum direction {none, upward, downward}; /* Value has this type. */ ...@@ -216,6 +216,17 @@ enum direction {none, upward, downward}; /* Value has this type. */
#define STRICT_ARGUMENT_NAMING 0 #define STRICT_ARGUMENT_NAMING 0
#endif #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. /* Nonzero if we do not know how to pass TYPE solely in registers.
We cannot do so in the following cases: We cannot do so in the following cases:
......
...@@ -4096,6 +4096,7 @@ assign_parms (fndecl, second_time) ...@@ -4096,6 +4096,7 @@ assign_parms (fndecl, second_time)
int did_conversion = 0; int did_conversion = 0;
tree passed_type = DECL_ARG_TYPE (parm); tree passed_type = DECL_ARG_TYPE (parm);
tree nominal_type = TREE_TYPE (parm); tree nominal_type = TREE_TYPE (parm);
int pretend_named;
/* Set LAST_NAMED if this is last named arg before some /* Set LAST_NAMED if this is last named arg before some
anonymous args. */ anonymous args. */
...@@ -4217,6 +4218,7 @@ assign_parms (fndecl, second_time) ...@@ -4217,6 +4218,7 @@ assign_parms (fndecl, second_time)
In this case, we call FUNCTION_ARG with NAMED set to 1 instead of In this case, we call FUNCTION_ARG with NAMED set to 1 instead of
0 as it was the previous time. */ 0 as it was the previous time. */
pretend_named = named_arg || PRETEND_OUTGOING_VARARGS_NAMED;
locate_and_pad_parm (nominal_mode, passed_type, locate_and_pad_parm (nominal_mode, passed_type,
#ifdef STACK_PARMS_IN_REG_PARM_AREA #ifdef STACK_PARMS_IN_REG_PARM_AREA
1, 1,
...@@ -4224,12 +4226,11 @@ assign_parms (fndecl, second_time) ...@@ -4224,12 +4226,11 @@ assign_parms (fndecl, second_time)
#ifdef FUNCTION_INCOMING_ARG #ifdef FUNCTION_INCOMING_ARG
FUNCTION_INCOMING_ARG (args_so_far, promoted_mode, FUNCTION_INCOMING_ARG (args_so_far, promoted_mode,
passed_type, passed_type,
(named_arg pretend_named) != 0,
|| varargs_setup)) != 0,
#else #else
FUNCTION_ARG (args_so_far, promoted_mode, FUNCTION_ARG (args_so_far, promoted_mode,
passed_type, passed_type,
named_arg || varargs_setup) != 0, pretend_named) != 0,
#endif #endif
#endif #endif
fndecl, &stack_args_size, &stack_offset, &arg_size); fndecl, &stack_args_size, &stack_offset, &arg_size);
......
/* This is just like the default gvarargs.h /* The ! __SH3E_VARG case is similar to the default gvarargs.h . */
except for differences described below. */
#if (defined (__SH3E__) || defined (__SH4_SINGLE__) || defined (__SH4__) || defined (__SH4_SINGLE_ONLY__)) && ! defined (__HITACHI__)
#define __SH3E_VARG
#endif
/* Define __gnuc_va_list. */ /* Define __gnuc_va_list. */
#ifndef __GNUC_VA_LIST #ifndef __GNUC_VA_LIST
#define __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 long __va_greg;
typedef float __va_freg; typedef float __va_freg;
...@@ -33,7 +36,7 @@ typedef void *__gnuc_va_list; ...@@ -33,7 +36,7 @@ typedef void *__gnuc_va_list;
#ifdef _STDARG_H #ifdef _STDARG_H
#if defined (__SH3E__) || defined (__SH4_SINGLE__) || defined (__SH4__) || defined (__SH4_SINGLE_ONLY__) #ifdef __SH3E_VARG
#define va_start(AP, LASTARG) \ #define va_start(AP, LASTARG) \
__extension__ \ __extension__ \
...@@ -59,7 +62,7 @@ __extension__ \ ...@@ -59,7 +62,7 @@ __extension__ \
#define va_alist __builtin_va_alist #define va_alist __builtin_va_alist
#define va_dcl int __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) \ #define va_start(AP) \
__extension__ \ __extension__ \
...@@ -164,7 +167,7 @@ enum __va_type_classes { ...@@ -164,7 +167,7 @@ enum __va_type_classes {
? (((union { TYPE t; int i;} *__VA_REF) (AP))++)->t \ ? (((union { TYPE t; int i;} *__VA_REF) (AP))++)->t \
: ((union {TYPE t;TYPE u;}*) ((char *)++(int *__VA_REF)(AP) - sizeof (TYPE)))->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) \ #define __PASS_AS_FLOAT(TYPE_CLASS,SIZE) \
(TYPE_CLASS == __real_type_class && SIZE == 4) (TYPE_CLASS == __real_type_class && SIZE == 4)
......
...@@ -3789,6 +3789,15 @@ are treated as named. Otherwise, all named arguments except the last ...@@ -3789,6 +3789,15 @@ are treated as named. Otherwise, all named arguments except the last
are treated as named. are treated as named.
You need not define this macro if it always returns zero. 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 @end table
@node Trampolines @node Trampolines
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment