From 6b475ad591474951f88297d6e8e32aa99a5d6180 Mon Sep 17 00:00:00 2001 From: Bernardo Innocenti Date: Mon, 22 Sep 2003 19:35:06 +0200 Subject: [PATCH] m68k.h (MASK_RTD, [...]): Resurrect -mrtd option. * config/m68k/m68k.h (MASK_RTD, TARGET_RTD, RETURN_POPS_ARGS): Resurrect -mrtd option. From-SVN: r71658 --- gcc/ChangeLog | 5 +++++ gcc/config/m68k/m68k.h | 27 ++++++++++++++++++++++++--- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b67008fc39c..6d52d355c68 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2003-09-22 Bernardo Innocenti + + * config/m68k/m68k.h (MASK_RTD, TARGET_RTD, RETURN_POPS_ARGS): + Resurrect -mrtd option. + 2003-09-21 Andrew Pinski PR target/12281 diff --git a/gcc/config/m68k/m68k.h b/gcc/config/m68k/m68k.h index 8160f8c5952..977a034bb13 100644 --- a/gcc/config/m68k/m68k.h +++ b/gcc/config/m68k/m68k.h @@ -201,6 +201,11 @@ extern int target_flags; #define MASK_NO_STRICT_ALIGNMENT (1<<15) #define TARGET_STRICT_ALIGNMENT (~target_flags & MASK_NO_STRICT_ALIGNMENT) +/* Compile using rtd insn calling sequence. + This will not work unless you use prototypes at least + for all functions that can take varying numbers of args. */ +#define MASK_RTD (1<<16) +#define TARGET_RTD (target_flags & MASK_RTD) /* Compile for a CPU32. A 68020 without bitfields is a good heuristic for a CPU32. */ @@ -306,6 +311,10 @@ extern int target_flags; N_("Do not use unaligned memory references") }, \ { "no-strict-align", MASK_NO_STRICT_ALIGNMENT, \ N_("Use unaligned memory references") }, \ + { "rtd", MASK_RTD, \ + N_("Use different calling convention using 'rtd'") }, \ + { "nortd", - MASK_RTD, \ + N_("Use normal calling convention") }, \ SUBTARGET_SWITCHES \ { "", TARGET_DEFAULT, "" }} /* TARGET_DEFAULT is defined in m68k-none.h, netbsd.h, etc. */ @@ -790,9 +799,21 @@ enum reg_class { or for a library call it is an identifier node for the subroutine name. SIZE is the number of bytes of arguments passed on the stack. - On the m68k, the caller must always pop the args. */ - -#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0 + On the 68000, the RTS insn cannot pop anything. + On the 68010, the RTD insn may be used to pop them if the number + of args is fixed, but if the number is variable then the caller + must pop them all. RTD can't be used for library calls now + because the library is compiled with the Unix compiler. + Use of RTD is a selectable option, since it is incompatible with + standard Unix calling sequences. If the option is not selected, + the caller must always pop the args. */ + +#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) \ + ((TARGET_RTD && (!(FUNDECL) || TREE_CODE (FUNDECL) != IDENTIFIER_NODE) \ + && (TYPE_ARG_TYPES (FUNTYPE) == 0 \ + || (TREE_VALUE (tree_last (TYPE_ARG_TYPES (FUNTYPE))) \ + == void_type_node))) \ + ? (SIZE) : 0) /* Define how to find the value returned by a function. VALTYPE is the data type of the value (as a tree). -- 2.30.2