summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorfroydnj <froydnj@138bc75d-0d04-0410-961f-82ee72b054a4>2010-06-29 12:18:36 +0000
committerfroydnj <froydnj@138bc75d-0d04-0410-961f-82ee72b054a4>2010-06-29 12:18:36 +0000
commitf5bc28dae417e7cd7eddaa71046445d359481467 (patch)
tree2ea3f022499b2b52e578f958001d178d596536d8 /gcc
parent2f25e4ca07e6763cd89b62f7c54e6c962580c9f0 (diff)
downloadgcc-f5bc28dae417e7cd7eddaa71046445d359481467.tar.gz
* reginfo.c (init_reg_sets_1): Adjust comments.
* combine-stack-adj.c (rest_of_handle_stack_adjustments): Likewise. * calls.c (prepare_call_address): Likewise. (emit_call_1): Use targetm.calls.return_pops_args. (expand_call): Likewise. * function.c (assign_parms): Likewise. * system.h (RETURN_POPS_ARGS): Add to #pragma poison list. * target.h (struct gcc_target) [struct calls]: Add return_pops_args field. * targhooks.h (default_return_pops_args): Declare. * targhooks.c (default_return_pops_args): Define. * target-def.h (TARGET_RETURN_POPS_ARGS): Define. (TARGET_CALLS): Add TARGET_RETURN_POPS_ARGS. * doc/tm.texi (RETURN_POPS_ARGS): Rename to... (TARGET_RETURN_POPS_ARGS): ...this. Use deftypefn. Adjust documentation. * config/alpha/alpha.h (RETURN_POPS_ARGS): Delete. * config/arc/arc.h (RETURN_POPS_ARGS): Likewise. * config/arm/arm.h (RETURN_POPS_ARGS): Likewise. * config/avr/avr.h (RETURN_POPS_ARGS): Likewise. * config/bfin/bfin.h (RETURN_POPS_ARGS): Likewise. * config/cris/cris.h (RETURN_POPS_ARGS): Likewise. * config/crx/crx.h (RETURN_POPS_ARGS): Likewise. * config/fr30/fr30.h (RETURN_POPS_ARGS): Likewise. * config/frv/frv.h (RETURN_POPS_ARGS): Likewise. * config/h8300/h8300.h (RETURN_POPS_ARGS): Likewise. * config/ia64/ia64.h (RETURN_POPS_ARGS): Likewise. * config/iq2000/iq2000.h (RETURN_POPS_ARGS): Likewise. * config/lm32/lm32.h (RETURN_POPS_ARGS): Likewise. * config/m32c/m32c.h (RETURN_POPS_ARGS): Likewise. * config/m32r/m32r.h (RETURN_POPS_ARGS): Likewise. * config/m68hc11/m68hc11.h (RETURN_POPS_ARGS): Likewise. * config/mcore/mcore.h (RETURN_POPS_ARGS): Likewise. * config/mep/mep.h (RETURN_POPS_ARGS): Likewise. * config/mips/mips.h (RETURN_POPS_ARGS): Likewise. * config/mmix/mmix.h (RETURN_POPS_ARGS): Likewise. * config/mn10300/mn10300.h (RETURN_POPS_ARGS): Likewise. * config/moxie/moxie.h (RETURN_POPS_ARGS): Likewise. * config/pa/pa.h (RETURN_POPS_ARGS): Likewise. * config/pdp11/pdp11.h (RETURN_POPS_ARGS): Likewise. * config/picochip/picochip.h (RETURN_POPS_ARGS): Likewise. * config/rs6000/rs6000.h (RETURN_POPS_ARGS): Likewise. * config/rx/rx.h (RETURN_POPS_ARGS): Likewise. * config/s390/s390.h (RETURN_POPS_ARGS): Likewise. * config/score/score.h (RETURN_POPS_ARGS): Likewise. * config/sh/sh.h (RETURN_POPS_ARGS): Likewise. * config/sparc/sparc.h (RETURN_POPS_ARGS): Likewise. * config/spu/spu.h (RETURN_POPS_ARGS): Likewise. * config/stormy16/stormy16.h (RETURN_POPS_ARGS): Likewise. * config/v850/v850.h (RETURN_POPS_ARGS): Likewise. * config/xtensa/xtensa.h (RETURN_POPS_ARGS): Likewise. * config/i386/i386-protos.h (ix86_return_pops_args): Delete. * config/i386/i386.h (RETURN_POPS_ARGS): Delete. * config/i386/i386.c (ix86_return_pops_args): Make static. Constify arguments. (TARGET_RETURN_POPS_ARGS): Define. * config/m68k/m68k.h (RETURN_POPS_ARGS): Move to... * config/m68k/m68k.c (m68k_return_pops_args): ...here. New function. (TARGET_RETURN_POPS_ARGS): Define. * config/vax/vax.h (RETURN_POPS_ARGS): Move to... * config/vax/vax.c (vax_return_pops_args): ...here. New function. (TARGET_RETURN_POPS_ARGS): Define. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@161528 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog65
-rw-r--r--gcc/calls.c25
-rw-r--r--gcc/combine-stack-adj.c2
-rw-r--r--gcc/config/alpha/alpha.h9
-rw-r--r--gcc/config/arc/arc.h8
-rw-r--r--gcc/config/arm/arm.h11
-rw-r--r--gcc/config/avr/avr.h2
-rw-r--r--gcc/config/bfin/bfin.h2
-rw-r--r--gcc/config/cris/cris.h2
-rw-r--r--gcc/config/crx/crx.h2
-rw-r--r--gcc/config/fr30/fr30.h35
-rw-r--r--gcc/config/frv/frv.h35
-rw-r--r--gcc/config/h8300/h8300.h11
-rw-r--r--gcc/config/i386/i386-protos.h2
-rw-r--r--gcc/config/i386/i386.c4
-rw-r--r--gcc/config/i386/i386.h20
-rw-r--r--gcc/config/ia64/ia64.h6
-rw-r--r--gcc/config/iq2000/iq2000.h2
-rw-r--r--gcc/config/lm32/lm32.h2
-rw-r--r--gcc/config/m32c/m32c.h1
-rw-r--r--gcc/config/m32r/m32r.h8
-rw-r--r--gcc/config/m68hc11/m68hc11.h9
-rw-r--r--gcc/config/m68k/m68k.c25
-rw-r--r--gcc/config/m68k/m68k.h15
-rw-r--r--gcc/config/mcore/mcore.h10
-rw-r--r--gcc/config/mep/mep.h2
-rw-r--r--gcc/config/mips/mips.h2
-rw-r--r--gcc/config/mmix/mmix.h2
-rw-r--r--gcc/config/mn10300/mn10300.h9
-rw-r--r--gcc/config/moxie/moxie.h2
-rw-r--r--gcc/config/pa/pa.h8
-rw-r--r--gcc/config/pdp11/pdp11.h8
-rw-r--r--gcc/config/picochip/picochip.h3
-rw-r--r--gcc/config/rs6000/rs6000.h9
-rw-r--r--gcc/config/rx/rx.h1
-rw-r--r--gcc/config/s390/s390.h3
-rw-r--r--gcc/config/score/score.h2
-rw-r--r--gcc/config/sh/sh.h11
-rw-r--r--gcc/config/sparc/sparc.h9
-rw-r--r--gcc/config/spu/spu.h2
-rw-r--r--gcc/config/stormy16/stormy16.h2
-rw-r--r--gcc/config/v850/v850.h9
-rw-r--r--gcc/config/vax/vax.c18
-rw-r--r--gcc/config/vax/vax.h12
-rw-r--r--gcc/config/xtensa/xtensa.h3
-rw-r--r--gcc/doc/tm.texi11
-rw-r--r--gcc/function.c5
-rw-r--r--gcc/reginfo.c11
-rw-r--r--gcc/system.h3
-rw-r--r--gcc/target-def.h4
-rw-r--r--gcc/target.h5
-rw-r--r--gcc/targhooks.c8
-rw-r--r--gcc/targhooks.h1
53 files changed, 159 insertions, 319 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2a645299e39..d1cb9a912ea 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,68 @@
+2010-06-29 Nathan Froyd <froydnj@codesourcery.com>
+
+ * reginfo.c (init_reg_sets_1): Adjust comments.
+ * combine-stack-adj.c (rest_of_handle_stack_adjustments): Likewise.
+ * calls.c (prepare_call_address): Likewise.
+ (emit_call_1): Use targetm.calls.return_pops_args.
+ (expand_call): Likewise.
+ * function.c (assign_parms): Likewise.
+ * system.h (RETURN_POPS_ARGS): Add to #pragma poison list.
+ * target.h (struct gcc_target) [struct calls]: Add
+ return_pops_args field.
+ * targhooks.h (default_return_pops_args): Declare.
+ * targhooks.c (default_return_pops_args): Define.
+ * target-def.h (TARGET_RETURN_POPS_ARGS): Define.
+ (TARGET_CALLS): Add TARGET_RETURN_POPS_ARGS.
+ * doc/tm.texi (RETURN_POPS_ARGS): Rename to...
+ (TARGET_RETURN_POPS_ARGS): ...this. Use deftypefn. Adjust
+ documentation.
+ * config/alpha/alpha.h (RETURN_POPS_ARGS): Delete.
+ * config/arc/arc.h (RETURN_POPS_ARGS): Likewise.
+ * config/arm/arm.h (RETURN_POPS_ARGS): Likewise.
+ * config/avr/avr.h (RETURN_POPS_ARGS): Likewise.
+ * config/bfin/bfin.h (RETURN_POPS_ARGS): Likewise.
+ * config/cris/cris.h (RETURN_POPS_ARGS): Likewise.
+ * config/crx/crx.h (RETURN_POPS_ARGS): Likewise.
+ * config/fr30/fr30.h (RETURN_POPS_ARGS): Likewise.
+ * config/frv/frv.h (RETURN_POPS_ARGS): Likewise.
+ * config/h8300/h8300.h (RETURN_POPS_ARGS): Likewise.
+ * config/ia64/ia64.h (RETURN_POPS_ARGS): Likewise.
+ * config/iq2000/iq2000.h (RETURN_POPS_ARGS): Likewise.
+ * config/lm32/lm32.h (RETURN_POPS_ARGS): Likewise.
+ * config/m32c/m32c.h (RETURN_POPS_ARGS): Likewise.
+ * config/m32r/m32r.h (RETURN_POPS_ARGS): Likewise.
+ * config/m68hc11/m68hc11.h (RETURN_POPS_ARGS): Likewise.
+ * config/mcore/mcore.h (RETURN_POPS_ARGS): Likewise.
+ * config/mep/mep.h (RETURN_POPS_ARGS): Likewise.
+ * config/mips/mips.h (RETURN_POPS_ARGS): Likewise.
+ * config/mmix/mmix.h (RETURN_POPS_ARGS): Likewise.
+ * config/mn10300/mn10300.h (RETURN_POPS_ARGS): Likewise.
+ * config/moxie/moxie.h (RETURN_POPS_ARGS): Likewise.
+ * config/pa/pa.h (RETURN_POPS_ARGS): Likewise.
+ * config/pdp11/pdp11.h (RETURN_POPS_ARGS): Likewise.
+ * config/picochip/picochip.h (RETURN_POPS_ARGS): Likewise.
+ * config/rs6000/rs6000.h (RETURN_POPS_ARGS): Likewise.
+ * config/rx/rx.h (RETURN_POPS_ARGS): Likewise.
+ * config/s390/s390.h (RETURN_POPS_ARGS): Likewise.
+ * config/score/score.h (RETURN_POPS_ARGS): Likewise.
+ * config/sh/sh.h (RETURN_POPS_ARGS): Likewise.
+ * config/sparc/sparc.h (RETURN_POPS_ARGS): Likewise.
+ * config/spu/spu.h (RETURN_POPS_ARGS): Likewise.
+ * config/stormy16/stormy16.h (RETURN_POPS_ARGS): Likewise.
+ * config/v850/v850.h (RETURN_POPS_ARGS): Likewise.
+ * config/xtensa/xtensa.h (RETURN_POPS_ARGS): Likewise.
+ * config/i386/i386-protos.h (ix86_return_pops_args): Delete.
+ * config/i386/i386.h (RETURN_POPS_ARGS): Delete.
+ * config/i386/i386.c (ix86_return_pops_args): Make static.
+ Constify arguments.
+ (TARGET_RETURN_POPS_ARGS): Define.
+ * config/m68k/m68k.h (RETURN_POPS_ARGS): Move to...
+ * config/m68k/m68k.c (m68k_return_pops_args): ...here. New function.
+ (TARGET_RETURN_POPS_ARGS): Define.
+ * config/vax/vax.h (RETURN_POPS_ARGS): Move to...
+ * config/vax/vax.c (vax_return_pops_args): ...here. New function.
+ (TARGET_RETURN_POPS_ARGS): Define.
+
2010-06-29 Richard Guenther <rguenther@suse.de>
PR middle-end/44667
diff --git a/gcc/calls.c b/gcc/calls.c
index 9c51f1a5a74..c6d4706733a 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -208,13 +208,15 @@ prepare_call_address (tree fndecl, rtx funexp, rtx static_chain_value,
The CALL_INSN is the first insn generated.
FNDECL is the declaration node of the function. This is given to the
- macro RETURN_POPS_ARGS to determine whether this function pops its own args.
+ hook TARGET_RETURN_POPS_ARGS to determine whether this function pops
+ its own args.
- FUNTYPE is the data type of the function. This is given to the macro
- RETURN_POPS_ARGS to determine whether this function pops its own args.
- We used to allow an identifier for library functions, but that doesn't
- work when the return type is an aggregate type and the calling convention
- says that the pointer to this aggregate is to be popped by the callee.
+ FUNTYPE is the data type of the function. This is given to the hook
+ TARGET_RETURN_POPS_ARGS to determine whether this function pops its
+ own args. We used to allow an identifier for library functions, but
+ that doesn't work when the return type is an aggregate type and the
+ calling convention says that the pointer to this aggregate is to be
+ popped by the callee.
STACK_SIZE is the number of bytes of arguments on the stack,
ROUNDED_STACK_SIZE is that number rounded up to
@@ -256,7 +258,8 @@ emit_call_1 (rtx funexp, tree fntree ATTRIBUTE_UNUSED, tree fndecl ATTRIBUTE_UNU
rtx rounded_stack_size_rtx = GEN_INT (rounded_stack_size);
rtx call_insn;
int already_popped = 0;
- HOST_WIDE_INT n_popped = RETURN_POPS_ARGS (fndecl, funtype, stack_size);
+ HOST_WIDE_INT n_popped
+ = targetm.calls.return_pops_args (fndecl, funtype, stack_size);
#ifdef CALL_POPS_ARGS
n_popped += CALL_POPS_ARGS (* args_so_far);
@@ -2323,10 +2326,10 @@ expand_call (tree exp, rtx target, int ignore)
- crtl->args.pretend_args_size)
/* If the callee pops its own arguments, then it must pop exactly
the same number of arguments as the current function. */
- || (RETURN_POPS_ARGS (fndecl, funtype, args_size.constant)
- != RETURN_POPS_ARGS (current_function_decl,
- TREE_TYPE (current_function_decl),
- crtl->args.size))
+ || (targetm.calls.return_pops_args (fndecl, funtype, args_size.constant)
+ != targetm.calls.return_pops_args (current_function_decl,
+ TREE_TYPE (current_function_decl),
+ crtl->args.size))
|| !lang_hooks.decls.ok_for_sibcall (fndecl))
try_tail_call = 0;
diff --git a/gcc/combine-stack-adj.c b/gcc/combine-stack-adj.c
index 8849697bfce..96bfb3a633e 100644
--- a/gcc/combine-stack-adj.c
+++ b/gcc/combine-stack-adj.c
@@ -555,7 +555,7 @@ rest_of_handle_stack_adjustments (void)
cleanup_cfg (flag_crossjumping ? CLEANUP_CROSSJUMP : 0);
/* This is kind of a heuristic. We need to run combine_stack_adjustments
- even for machines with possibly nonzero RETURN_POPS_ARGS
+ even for machines with possibly nonzero TARGET_RETURN_POPS_ARGS
and ACCUMULATE_OUTGOING_ARGS. We expect that only ports having
push instructions will have popping returns. */
#ifndef PUSH_ROUNDING
diff --git a/gcc/config/alpha/alpha.h b/gcc/config/alpha/alpha.h
index 6235d9ff90a..c8590b9c782 100644
--- a/gcc/config/alpha/alpha.h
+++ b/gcc/config/alpha/alpha.h
@@ -703,15 +703,6 @@ extern int alpha_memory_latency;
in a register. */
/* #define REG_PARM_STACK_SPACE */
-/* Value is the number of bytes of arguments automatically
- popped when returning from a subroutine call.
- FUNDECL is the declaration node of the function (as a tree),
- FUNTYPE is the data type of the function (as a tree),
- 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. */
-
-#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0
-
/* Define how to find the value returned by a function.
VALTYPE is the data type of the value (as a tree).
If the precise function being called is known, FUNC is its FUNCTION_DECL;
diff --git a/gcc/config/arc/arc.h b/gcc/config/arc/arc.h
index 5127a123e31..9a4e360504b 100644
--- a/gcc/config/arc/arc.h
+++ b/gcc/config/arc/arc.h
@@ -530,14 +530,6 @@ extern enum reg_class arc_regno_reg_class[FIRST_PSEUDO_REGISTER];
increase the stack frame size by this amount. */
#define ACCUMULATE_OUTGOING_ARGS 1
-/* Value is the number of bytes of arguments automatically
- popped when returning from a subroutine call.
- FUNDECL is the declaration node of the function (as a tree),
- FUNTYPE is the data type of the function (as a tree),
- 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. */
-#define RETURN_POPS_ARGS(DECL, FUNTYPE, SIZE) 0
-
/* Define a data type for recording info about an argument list
during the scan of that argument list. This data type should
hold all necessary information about the function itself
diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h
index 9066bbefb61..fcd1ef3d2eb 100644
--- a/gcc/config/arm/arm.h
+++ b/gcc/config/arm/arm.h
@@ -1498,17 +1498,6 @@ do { \
/* Offset of first parameter from the argument pointer register value. */
#define FIRST_PARM_OFFSET(FNDECL) (TARGET_ARM ? 4 : 0)
-/* Value is the number of byte of arguments automatically
- popped when returning from a subroutine call.
- FUNDECL is the declaration node of the function (as a tree),
- FUNTYPE is the data type of the function (as a tree),
- 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 ARM, the caller does not pop any of its arguments that were passed
- on the stack. */
-#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, SIZE) 0
-
/* Define how to find the value returned by a library function
assuming the value has mode MODE. */
#define LIBCALL_VALUE(MODE) \
diff --git a/gcc/config/avr/avr.h b/gcc/config/avr/avr.h
index 398b412dd91..32ff27eedf4 100644
--- a/gcc/config/avr/avr.h
+++ b/gcc/config/avr/avr.h
@@ -376,8 +376,6 @@ enum reg_class {
for POST_DEC targets (PR27386). */
/*#define PUSH_ROUNDING(NPUSHED) (NPUSHED)*/
-#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, STACK_SIZE) 0
-
#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) (function_arg (&(CUM), MODE, TYPE, NAMED))
typedef struct avr_args {
diff --git a/gcc/config/bfin/bfin.h b/gcc/config/bfin/bfin.h
index a1bd556003e..367cd96dbc8 100644
--- a/gcc/config/bfin/bfin.h
+++ b/gcc/config/bfin/bfin.h
@@ -871,8 +871,6 @@ typedef struct {
#define FUNCTION_ARG_ADVANCE(CUM, MODE, TYPE, NAMED) \
(function_arg_advance (&CUM, MODE, TYPE, NAMED))
-#define RETURN_POPS_ARGS(FDECL, FUNTYPE, STKSIZE) 0
-
/* Define how to find the value returned by a function.
VALTYPE is the data type of the value (as a tree).
If the precise function being called is known, FUNC is its FUNCTION_DECL;
diff --git a/gcc/config/cris/cris.h b/gcc/config/cris/cris.h
index ae2bfee4757..4c685489a8c 100644
--- a/gcc/config/cris/cris.h
+++ b/gcc/config/cris/cris.h
@@ -859,8 +859,6 @@ enum reg_class
#define ACCUMULATE_OUTGOING_ARGS 1
-#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, STACKSIZE) 0
-
/* Node: Register Arguments */
diff --git a/gcc/config/crx/crx.h b/gcc/config/crx/crx.h
index 1d5cb87af3e..a6260f48aa2 100644
--- a/gcc/config/crx/crx.h
+++ b/gcc/config/crx/crx.h
@@ -313,8 +313,6 @@ enum reg_class
#define PUSH_ROUNDING(BYTES) (((BYTES) + 3) & ~3)
-#define RETURN_POPS_ARGS(FNDECL, FUNTYPE, SIZE) 0
-
#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
((rtx) crx_function_arg(&(CUM), (MODE), (TYPE), (NAMED)))
diff --git a/gcc/config/fr30/fr30.h b/gcc/config/fr30/fr30.h
index 5e6237895b5..ed675b16e6a 100644
--- a/gcc/config/fr30/fr30.h
+++ b/gcc/config/fr30/fr30.h
@@ -568,41 +568,6 @@ enum reg_class
proper. */
#define ACCUMULATE_OUTGOING_ARGS 1
-/* A C expression that should indicate the number of bytes of its own arguments
- that a function pops on returning, or 0 if the function pops no arguments
- and the caller must therefore pop them all after the function returns.
-
- FUNDECL is a C variable whose value is a tree node that describes the
- function in question. Normally it is a node of type `FUNCTION_DECL' that
- describes the declaration of the function. From this it is possible to
- obtain the DECL_ATTRIBUTES of the function.
-
- FUNTYPE is a C variable whose value is a tree node that describes the
- function in question. Normally it is a node of type `FUNCTION_TYPE' that
- describes the data type of the function. From this it is possible to obtain
- the data types of the value and arguments (if known).
-
- When a call to a library function is being considered, FUNTYPE will contain
- an identifier node for the library function. Thus, if you need to
- distinguish among various library functions, you can do so by their names.
- Note that "library function" in this context means a function used to
- perform arithmetic, whose name is known specially in the compiler and was
- not mentioned in the C code being compiled.
-
- STACK-SIZE is the number of bytes of arguments passed on the stack. If a
- variable number of bytes is passed, it is zero, and argument popping will
- always be the responsibility of the calling function.
-
- On the VAX, all functions always pop their arguments, so the definition of
- this macro is STACK-SIZE. On the 68000, using the standard calling
- convention, no functions pop their arguments, so the value of the macro is
- always 0 in this case. But an alternative calling convention is available
- in which functions that take a fixed number of arguments pop them but other
- functions (such as `printf') pop nothing (the caller pops all). When this
- convention is in use, FUNTYPE is examined to determine whether a function
- takes a fixed number of arguments. */
-#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, STACK_SIZE) 0
-
/*}}}*/
/*{{{ Function Arguments in Registers. */
diff --git a/gcc/config/frv/frv.h b/gcc/config/frv/frv.h
index 1bf8b6bb080..56db4e4a21e 100644
--- a/gcc/config/frv/frv.h
+++ b/gcc/config/frv/frv.h
@@ -1614,41 +1614,6 @@ typedef struct frv_stack {
proper. */
#define ACCUMULATE_OUTGOING_ARGS 1
-/* A C expression that should indicate the number of bytes of its own arguments
- that a function pops on returning, or 0 if the function pops no arguments
- and the caller must therefore pop them all after the function returns.
-
- FUNDECL is a C variable whose value is a tree node that describes the
- function in question. Normally it is a node of type `FUNCTION_DECL' that
- describes the declaration of the function. From this it is possible to
- obtain the DECL_ATTRIBUTES of the function.
-
- FUNTYPE is a C variable whose value is a tree node that describes the
- function in question. Normally it is a node of type `FUNCTION_TYPE' that
- describes the data type of the function. From this it is possible to obtain
- the data types of the value and arguments (if known).
-
- When a call to a library function is being considered, FUNTYPE will contain
- an identifier node for the library function. Thus, if you need to
- distinguish among various library functions, you can do so by their names.
- Note that "library function" in this context means a function used to
- perform arithmetic, whose name is known specially in the compiler and was
- not mentioned in the C code being compiled.
-
- STACK-SIZE is the number of bytes of arguments passed on the stack. If a
- variable number of bytes is passed, it is zero, and argument popping will
- always be the responsibility of the calling function.
-
- On the VAX, all functions always pop their arguments, so the definition of
- this macro is STACK-SIZE. On the 68000, using the standard calling
- convention, no functions pop their arguments, so the value of the macro is
- always 0 in this case. But an alternative calling convention is available
- in which functions that take a fixed number of arguments pop them but other
- functions (such as `printf') pop nothing (the caller pops all). When this
- convention is in use, FUNTYPE is examined to determine whether a function
- takes a fixed number of arguments. */
-#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, STACK_SIZE) 0
-
/* The number of register assigned to holding function arguments. */
diff --git a/gcc/config/h8300/h8300.h b/gcc/config/h8300/h8300.h
index 1ce1585544e..4e0a3b6728e 100644
--- a/gcc/config/h8300/h8300.h
+++ b/gcc/config/h8300/h8300.h
@@ -536,17 +536,6 @@ enum reg_class {
#define FIRST_PARM_OFFSET(FNDECL) 0
-/* Value is the number of bytes of arguments automatically
- popped when returning from a subroutine call.
- FUNDECL is the declaration node of the function (as a tree),
- FUNTYPE is the data type of the function (as a tree),
- 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 H8 the return does not pop anything. */
-
-#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, SIZE) 0
-
/* Definitions for register eliminations.
This is an array of structures. Each structure initializes one pair
diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
index 308f9eef5e8..f3facb3598f 100644
--- a/gcc/config/i386/i386-protos.h
+++ b/gcc/config/i386/i386-protos.h
@@ -188,8 +188,6 @@ extern void function_arg_advance (CUMULATIVE_ARGS *, enum machine_mode,
#endif /* RTX_CODE */
#ifdef TREE_CODE
-extern int ix86_return_pops_args (tree, tree, int);
-
extern int ix86_data_alignment (tree, int);
extern unsigned int ix86_local_alignment (tree, enum machine_mode,
unsigned int);
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index bd1cc05cfbd..39308db4332 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -4865,7 +4865,7 @@ ix86_eax_live_at_start_p (void)
The attribute stdcall is equivalent to RTD on a per module basis. */
-int
+static int
ix86_return_pops_args (tree fundecl, tree funtype, int size)
{
int rtd;
@@ -30888,6 +30888,8 @@ ix86_enum_va_list (int idx, const char **pname, tree *ptree)
#define TARGET_STATIC_CHAIN ix86_static_chain
#undef TARGET_TRAMPOLINE_INIT
#define TARGET_TRAMPOLINE_INIT ix86_trampoline_init
+#undef TARGET_RETURN_POPS_ARGS
+#define TARGET_RETURN_POPS_ARGS ix86_return_pops_args
#undef TARGET_GIMPLIFY_VA_ARG_EXPR
#define TARGET_GIMPLIFY_VA_ARG_EXPR ix86_gimplify_va_arg
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index 67f1f60f3a1..05adfc5894e 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -1542,26 +1542,6 @@ enum reg_class
#define OUTGOING_REG_PARM_STACK_SPACE(FNTYPE) \
(ix86_function_type_abi (FNTYPE) == MS_ABI)
-/* Value is the number of bytes of arguments automatically
- popped when returning from a subroutine call.
- FUNDECL is the declaration node of the function (as a tree),
- FUNTYPE is the data type of the function (as a tree),
- 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 80386, 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.
-
- The attribute stdcall is equivalent to RTD on a per module basis. */
-
-#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, SIZE) \
- ix86_return_pops_args ((FUNDECL), (FUNTYPE), (SIZE))
-
/* Define how to find the value returned by a library function
assuming the value has mode MODE. */
diff --git a/gcc/config/ia64/ia64.h b/gcc/config/ia64/ia64.h
index bf24f73f04e..d3821f6c6f4 100644
--- a/gcc/config/ia64/ia64.h
+++ b/gcc/config/ia64/ia64.h
@@ -1042,12 +1042,6 @@ enum reg_class
#define ACCUMULATE_OUTGOING_ARGS 1
-/* A C expression that should indicate the number of bytes of its own arguments
- that a function pops on returning, or 0 if the function pops no arguments
- and the caller must therefore pop them all after the function returns. */
-
-#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, STACK_SIZE) 0
-
/* Function Arguments in Registers */
diff --git a/gcc/config/iq2000/iq2000.h b/gcc/config/iq2000/iq2000.h
index 53a6b5cad04..07d4c2d864b 100644
--- a/gcc/config/iq2000/iq2000.h
+++ b/gcc/config/iq2000/iq2000.h
@@ -365,8 +365,6 @@ enum reg_class
#define OUTGOING_REG_PARM_STACK_SPACE(FNTYPE) 1
-#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0
-
/* Function Arguments in Registers. */
diff --git a/gcc/config/lm32/lm32.h b/gcc/config/lm32/lm32.h
index 3a814576722..0bf37455627 100644
--- a/gcc/config/lm32/lm32.h
+++ b/gcc/config/lm32/lm32.h
@@ -273,8 +273,6 @@ enum reg_class
#define ACCUMULATE_OUTGOING_ARGS 1
-#define RETURN_POPS_ARGS(DECL, FUNTYPE, SIZE) 0
-
/*--------------------------------*/
/* Passing Arguments in Registers */
/*--------------------------------*/
diff --git a/gcc/config/m32c/m32c.h b/gcc/config/m32c/m32c.h
index a98005c78c1..8f7b720c696 100644
--- a/gcc/config/m32c/m32c.h
+++ b/gcc/config/m32c/m32c.h
@@ -503,7 +503,6 @@ enum reg_class
#define PUSH_ARGS 1
#define PUSH_ROUNDING(N) m32c_push_rounding (N)
-#define RETURN_POPS_ARGS(D,T,S) 0
#define CALL_POPS_ARGS(C) 0
/* Passing Arguments in Registers */
diff --git a/gcc/config/m32r/m32r.h b/gcc/config/m32r/m32r.h
index 28d06a4b23c..91d055bcb5b 100644
--- a/gcc/config/m32r/m32r.h
+++ b/gcc/config/m32r/m32r.h
@@ -823,14 +823,6 @@ extern enum reg_class m32r_regno_reg_class[FIRST_PSEUDO_REGISTER];
increase the stack frame size by this amount. */
#define ACCUMULATE_OUTGOING_ARGS 1
-/* Value is the number of bytes of arguments automatically
- popped when returning from a subroutine call.
- FUNDECL is the declaration node of the function (as a tree),
- FUNTYPE is the data type of the function (as a tree),
- 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. */
-#define RETURN_POPS_ARGS(DECL, FUNTYPE, SIZE) 0
-
/* Define a data type for recording info about an argument list
during the scan of that argument list. This data type should
hold all necessary information about the function itself
diff --git a/gcc/config/m68hc11/m68hc11.h b/gcc/config/m68hc11/m68hc11.h
index aef48a6e894..2ea80a76396 100644
--- a/gcc/config/m68hc11/m68hc11.h
+++ b/gcc/config/m68hc11/m68hc11.h
@@ -896,15 +896,6 @@ extern enum reg_class m68hc11_tmp_regs_class;
stack pointer really advances by. No rounding or alignment needed
for MC6811. */
#define PUSH_ROUNDING(BYTES) (BYTES)
-
-/* Value is 1 if returning from a function call automatically pops the
- arguments described by the number-of-args field in the call. FUNTYPE is
- the data type of the function (as a tree), or for a library call it is
- an identifier node for the subroutine name.
-
- The standard MC6811 call, with arg count word, includes popping the
- args as part of the call template. */
-#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0
/* Passing Arguments in Registers. */
diff --git a/gcc/config/m68k/m68k.c b/gcc/config/m68k/m68k.c
index 0ca5cd1d12a..529266ca23f 100644
--- a/gcc/config/m68k/m68k.c
+++ b/gcc/config/m68k/m68k.c
@@ -153,6 +153,7 @@ static bool m68k_return_in_memory (const_tree, const_tree);
#endif
static void m68k_output_dwarf_dtprel (FILE *, int, rtx) ATTRIBUTE_UNUSED;
static void m68k_trampoline_init (rtx, tree, rtx);
+static int m68k_return_pops_args (tree, tree, int);
static rtx m68k_delegitimize_address (rtx);
@@ -271,6 +272,9 @@ const char *m68k_library_id_string = "_current_shared_library_a5_offset_";
#undef TARGET_TRAMPOLINE_INIT
#define TARGET_TRAMPOLINE_INIT m68k_trampoline_init
+#undef TARGET_RETURN_POPS_ARGS
+#define TARGET_RETURN_POPS_ARGS m68k_return_pops_args
+
#undef TARGET_DELEGITIMIZE_ADDRESS
#define TARGET_DELEGITIMIZE_ADDRESS m68k_delegitimize_address
@@ -6520,4 +6524,25 @@ m68k_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
FINALIZE_TRAMPOLINE (XEXP (m_tramp, 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. */
+
+static int
+m68k_return_pops_args (tree fundecl, tree funtype, int size)
+{
+ return ((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);
+}
+
#include "gt-m68k.h"
diff --git a/gcc/config/m68k/m68k.h b/gcc/config/m68k/m68k.h
index 5787e8aa1fd..ac478619f73 100644
--- a/gcc/config/m68k/m68k.h
+++ b/gcc/config/m68k/m68k.h
@@ -534,21 +534,6 @@ extern enum reg_class regno_reg_class[];
#define FIRST_PARM_OFFSET(FNDECL) 8
-/* 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)
-
/* On the m68k the return value defaults to D0. */
#define FUNCTION_VALUE(VALTYPE, FUNC) \
gen_rtx_REG (TYPE_MODE (VALTYPE), D0_REG)
diff --git a/gcc/config/mcore/mcore.h b/gcc/config/mcore/mcore.h
index 4f0ef1d7d6b..7421d5dbb85 100644
--- a/gcc/config/mcore/mcore.h
+++ b/gcc/config/mcore/mcore.h
@@ -540,16 +540,6 @@ extern const enum reg_class reg_class_from_letter[];
/* Offset of first parameter from the argument pointer register value. */
#define FIRST_PARM_OFFSET(FNDECL) 0
-/* Value is the number of byte of arguments automatically
- popped when returning from a subroutine call.
- FUNTYPE is the data type of the function (as a tree),
- 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 MCore, the callee does not pop any of its arguments that were passed
- on the stack. */
-#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0
-
/* Define how to find the value returned by a function.
VALTYPE is the data type of the value (as a tree).
If the precise function being called is known, FUNC is its FUNCTION_DECL;
diff --git a/gcc/config/mep/mep.h b/gcc/config/mep/mep.h
index 9d286e33b94..d3af0734951 100644
--- a/gcc/config/mep/mep.h
+++ b/gcc/config/mep/mep.h
@@ -503,8 +503,6 @@ extern unsigned int mep_selected_isa;
#define ACCUMULATE_OUTGOING_ARGS 1
-#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, STACK_SIZE) 0
-
/* The ABI is thus: Arguments are in $1, $2, $3, $4, stack. Arguments
diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h
index 4026bd73714..ea79eba2550 100644
--- a/gcc/config/mips/mips.h
+++ b/gcc/config/mips/mips.h
@@ -2162,8 +2162,6 @@ enum reg_class
#define STACK_BOUNDARY (TARGET_NEWABI ? 128 : 64)
-#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0
-
/* Symbolic macros for the registers used to return integer and floating
point values. */
diff --git a/gcc/config/mmix/mmix.h b/gcc/config/mmix/mmix.h
index 2886443c66d..48551028d5b 100644
--- a/gcc/config/mmix/mmix.h
+++ b/gcc/config/mmix/mmix.h
@@ -586,8 +586,6 @@ enum reg_class
#define ACCUMULATE_OUTGOING_ARGS 1
-#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, STACKSIZE) 0
-
/* Node: Register Arguments */
#define FUNCTION_ARG(CUM, MODE, TYPE, NAMED) \
diff --git a/gcc/config/mn10300/mn10300.h b/gcc/config/mn10300/mn10300.h
index 12e78612014..1700f1a25be 100644
--- a/gcc/config/mn10300/mn10300.h
+++ b/gcc/config/mn10300/mn10300.h
@@ -492,15 +492,6 @@ enum reg_class {
them whenever possible. */
#define CAN_DEBUG_WITHOUT_FP
-/* Value is the number of bytes of arguments automatically
- popped when returning from a subroutine call.
- FUNDECL is the declaration node of the function (as a tree),
- FUNTYPE is the data type of the function (as a tree),
- 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. */
-
-#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0
-
/* We use d0/d1 for passing parameters, so allocate 8 bytes of space
for a register flushback area. */
#define REG_PARM_STACK_SPACE(DECL) 8
diff --git a/gcc/config/moxie/moxie.h b/gcc/config/moxie/moxie.h
index 266a244c570..0a53b6b7216 100644
--- a/gcc/config/moxie/moxie.h
+++ b/gcc/config/moxie/moxie.h
@@ -453,8 +453,6 @@ enum reg_class
/* All load operations zero extend. */
#define LOAD_EXTEND_OP(MEM) ZERO_EXTEND
-#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, STACK_SIZE) 0
-
/* A C expression that is nonzero if X is a legitimate constant for
an immediate operand on the target machine. */
#define LEGITIMATE_CONSTANT_P(X) 1
diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h
index 8a18289b0d2..4eae700b077 100644
--- a/gcc/config/pa/pa.h
+++ b/gcc/config/pa/pa.h
@@ -553,14 +553,6 @@ extern struct rtx_def *hppa_pic_save_rtx (void);
? (STACK_POINTER_OFFSET) \
: ((STACK_POINTER_OFFSET) - crtl->outgoing_args_size))
-/* Value is 1 if returning from a function call automatically
- pops the arguments described by the number-of-args field in the call.
- FUNDECL is the declaration node of the function (as a tree),
- FUNTYPE is the data type of the function (as a tree),
- or for a library call it is an identifier node for the subroutine name. */
-
-#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0
-
/* Define how to find the value returned by a library function
assuming the value has mode MODE. */
diff --git a/gcc/config/pdp11/pdp11.h b/gcc/config/pdp11/pdp11.h
index 15eef844a34..006fb4cbd86 100644
--- a/gcc/config/pdp11/pdp11.h
+++ b/gcc/config/pdp11/pdp11.h
@@ -435,14 +435,6 @@ extern int current_first_parm_offset;
*/
#define FIRST_PARM_OFFSET(FNDECL) 4
-/* Value is 1 if returning from a function call automatically
- pops the arguments described by the number-of-args field in the call.
- FUNDECL is the declaration node of the function (as a tree),
- FUNTYPE is the data type of the function (as a tree),
- or for a library call it is an identifier node for the subroutine name. */
-
-#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0
-
/* Define how to find the value returned by a function.
VALTYPE is the data type of the value (as a tree).
If the precise function being called is known, FUNC is its FUNCTION_DECL;
diff --git a/gcc/config/picochip/picochip.h b/gcc/config/picochip/picochip.h
index 7269fa062ad..b4aec727df5 100644
--- a/gcc/config/picochip/picochip.h
+++ b/gcc/config/picochip/picochip.h
@@ -406,9 +406,6 @@ extern const enum reg_class picochip_regno_reg_class[FIRST_PSEUDO_REGISTER];
#define PUSH_ARGS 0
-/* Functions don't pop their args. */
-#define RETURN_POPS_ARGS(FNDECL, FNTYPE, STACK) 0
-
/* Passing Arguments in Registers */
/* Store the offset of the next argument. */
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index 3f37c4b4836..2ee3da18284 100644
--- a/gcc/config/rs6000/rs6000.h
+++ b/gcc/config/rs6000/rs6000.h
@@ -1578,15 +1578,6 @@ extern enum rs6000_abi rs6000_current_abi; /* available for use by subtarget */
found in the variable crtl->outgoing_args_size. */
#define ACCUMULATE_OUTGOING_ARGS 1
-/* Value is the number of bytes of arguments automatically
- popped when returning from a subroutine call.
- FUNDECL is the declaration node of the function (as a tree),
- FUNTYPE is the data type of the function (as a tree),
- 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. */
-
-#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0
-
/* Define how to find the value returned by a library function
assuming the value has mode MODE. */
diff --git a/gcc/config/rx/rx.h b/gcc/config/rx/rx.h
index cb63951108b..afaa07b0bc5 100644
--- a/gcc/config/rx/rx.h
+++ b/gcc/config/rx/rx.h
@@ -154,7 +154,6 @@ extern enum rx_cpu_types rx_cpu_type;
#define MOVE_MAX 4
#define STARTING_FRAME_OFFSET 0
-#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, SIZE) 0
#define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
#define LEGITIMATE_CONSTANT_P(X) rx_is_legitimate_constant (X)
diff --git a/gcc/config/s390/s390.h b/gcc/config/s390/s390.h
index 1d74d30c000..cbe28991c18 100644
--- a/gcc/config/s390/s390.h
+++ b/gcc/config/s390/s390.h
@@ -673,9 +673,6 @@ extern const enum reg_class regclass_map[FIRST_PSEUDO_REGISTER];
/* We need current_function_outgoing_args to be valid. */
#define ACCUMULATE_OUTGOING_ARGS 1
-/* Return doesn't modify the stack. */
-#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, SIZE) 0
-
/* Register arguments. */
diff --git a/gcc/config/score/score.h b/gcc/config/score/score.h
index cde9c222546..98ca0a3537b 100644
--- a/gcc/config/score/score.h
+++ b/gcc/config/score/score.h
@@ -581,8 +581,6 @@ extern enum reg_class score_char_to_class[256];
`crtl->outgoing_args_size'. */
#define OUTGOING_REG_PARM_STACK_SPACE(FNTYPE) 1
-#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, STACK_SIZE) 0
-
/* Passing Arguments in Registers */
/* Determine where to put an argument to a function.
Value is zero to push the argument on the stack,
diff --git a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h
index 9482387ea56..ee3e05995d6 100644
--- a/gcc/config/sh/sh.h
+++ b/gcc/config/sh/sh.h
@@ -1423,17 +1423,6 @@ extern enum reg_class regno_reg_class[FIRST_PSEUDO_REGISTER];
/* Offset of first parameter from the argument pointer register value. */
#define FIRST_PARM_OFFSET(FNDECL) 0
-/* Value is the number of byte of arguments automatically
- popped when returning from a subroutine call.
- FUNDECL is the declaration node of the function (as a tree),
- FUNTYPE is the data type of the function (as a tree),
- 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 SH, the caller does not pop any of its arguments that were passed
- on the stack. */
-#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0
-
/* Value is the number of bytes of arguments automatically popped when
calling a subroutine.
CUM is the accumulated argument list.
diff --git a/gcc/config/sparc/sparc.h b/gcc/config/sparc/sparc.h
index 6c28e9838c8..6f6aec7d3f9 100644
--- a/gcc/config/sparc/sparc.h
+++ b/gcc/config/sparc/sparc.h
@@ -1387,15 +1387,6 @@ extern char leaf_reg_remap[];
the function! */
#define ACCUMULATE_OUTGOING_ARGS 1
-/* Value is the number of bytes of arguments automatically
- popped when returning from a subroutine call.
- FUNDECL is the declaration node of the function (as a tree),
- FUNTYPE is the data type of the function (as a tree),
- 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. */
-
-#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0
-
/* Define this macro if the target machine has "register windows". This
C expression returns the register number as seen by the called function
corresponding to register number OUT as seen by the calling function.
diff --git a/gcc/config/spu/spu.h b/gcc/config/spu/spu.h
index 54b461235a7..d3880418c2f 100644
--- a/gcc/config/spu/spu.h
+++ b/gcc/config/spu/spu.h
@@ -334,8 +334,6 @@ targetm.resolve_overloaded_builtin = spu_resolve_overloaded_builtin; \
#define OUTGOING_REG_PARM_STACK_SPACE(FNTYPE) 1
-#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) (0)
-
/* Register Arguments */
diff --git a/gcc/config/stormy16/stormy16.h b/gcc/config/stormy16/stormy16.h
index cf6acf586c2..4ea89a218db 100644
--- a/gcc/config/stormy16/stormy16.h
+++ b/gcc/config/stormy16/stormy16.h
@@ -328,8 +328,6 @@ enum reg_class
#define PUSH_ROUNDING(BYTES) (((BYTES) + 1) & ~1)
-#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, STACK_SIZE) 0
-
/* Function Arguments in Registers. */
diff --git a/gcc/config/v850/v850.h b/gcc/config/v850/v850.h
index 4c4c270db71..25faff1e7dd 100644
--- a/gcc/config/v850/v850.h
+++ b/gcc/config/v850/v850.h
@@ -556,15 +556,6 @@ enum reg_class
/* Keep the stack pointer constant throughout the function. */
#define ACCUMULATE_OUTGOING_ARGS 1
-/* Value is the number of bytes of arguments automatically
- popped when returning from a subroutine call.
- FUNDECL is the declaration node of the function (as a tree),
- FUNTYPE is the data type of the function (as a tree),
- 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. */
-
-#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0
-
#define RETURN_ADDR_RTX(COUNT, FP) v850_return_addr (COUNT)
/* Define a data type for recording info about an argument list
diff --git a/gcc/config/vax/vax.c b/gcc/config/vax/vax.c
index 5d547fee8d5..b3dfcb1e079 100644
--- a/gcc/config/vax/vax.c
+++ b/gcc/config/vax/vax.c
@@ -58,6 +58,7 @@ static rtx vax_struct_value_rtx (tree, int);
static rtx vax_builtin_setjmp_frame_value (void);
static void vax_asm_trampoline_template (FILE *);
static void vax_trampoline_init (rtx, tree, rtx);
+static int vax_return_pops_args (tree, tree, int);
/* Initialize the GCC target structure. */
#undef TARGET_ASM_ALIGNED_HI_OP
@@ -106,6 +107,8 @@ static void vax_trampoline_init (rtx, tree, rtx);
#define TARGET_ASM_TRAMPOLINE_TEMPLATE vax_asm_trampoline_template
#undef TARGET_TRAMPOLINE_INIT
#define TARGET_TRAMPOLINE_INIT vax_trampoline_init
+#undef TARGET_RETURN_POPS_ARGS
+#define TARGET_RETURN_POPS_ARGS vax_return_pops_args
struct gcc_target targetm = TARGET_INITIALIZER;
@@ -2068,3 +2071,18 @@ vax_trampoline_init (rtx m_tramp, tree fndecl, rtx cxt)
emit_insn (gen_sync_istream ());
}
+/* Value is the number of bytes of arguments automatically
+ popped when returning from a subroutine call.
+ FUNDECL is the declaration node of the function (as a tree),
+ FUNTYPE is the data type of the function (as a tree),
+ 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 VAX, the RET insn pops a maximum of 255 args for any function. */
+
+static int
+vax_return_pops_args (tree fundecl ATTRIBUTE_UNUSED,
+ tree funtype ATTRIBUTE_UNUSED, int size)
+{
+ return size > 255 * 4 ? 0 : size;
+}
diff --git a/gcc/config/vax/vax.h b/gcc/config/vax/vax.h
index e85ce01f820..88a8f1c9b1f 100644
--- a/gcc/config/vax/vax.h
+++ b/gcc/config/vax/vax.h
@@ -305,18 +305,6 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
/* Offset of first parameter from the argument pointer register value. */
#define FIRST_PARM_OFFSET(FNDECL) 4
-/* Value is the number of bytes of arguments automatically
- popped when returning from a subroutine call.
- FUNDECL is the declaration node of the function (as a tree),
- FUNTYPE is the data type of the function (as a tree),
- 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 VAX, the RET insn pops a maximum of 255 args for any function. */
-
-#define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) \
- ((SIZE) > 255 * 4 ? 0 : (SIZE))
-
/* Define how to find the value returned by a function.
VALTYPE is the data type of the value (as a tree).
If the precise function being called is known, FUNC is its FUNCTION_DECL;
diff --git a/gcc/config/xtensa/xtensa.h b/gcc/config/xtensa/xtensa.h
index 80c296d930f..32819bc0de7 100644
--- a/gcc/config/xtensa/xtensa.h
+++ b/gcc/config/xtensa/xtensa.h
@@ -547,9 +547,6 @@ extern const enum reg_class xtensa_regno_to_class[FIRST_PSEUDO_REGISTER];
128-bit datatypes defined in TIE (e.g., for Vectra). */
#define STACK_BOUNDARY 128
-/* Functions do not pop arguments off the stack. */
-#define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, SIZE) 0
-
/* Use a fixed register window size of 8. */
#define WINDOW_SIZE 8
diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi
index 637dd50444d..81665c310aa 100644
--- a/gcc/doc/tm.texi
+++ b/gcc/doc/tm.texi
@@ -3928,11 +3928,10 @@ suppresses this behavior and causes the parameter to be passed on the
stack in its natural location.
@end defmac
-@defmac RETURN_POPS_ARGS (@var{fundecl}, @var{funtype}, @var{stack-size})
-A C expression that should indicate the number of bytes of its own
-arguments that a function pops on returning, or 0 if the
-function pops no arguments and the caller must therefore pop them all
-after the function returns.
+@deftypefn {Target Hook} TARGET_RETURN_POPS_ARGS (@var{fundecl}, @var{funtype}, @var{stack-size})
+This target hook returns the number of bytes of its own arguments that
+a function pops on returning, or 0 if the function pops no arguments
+and the caller must therefore pop them all after the function returns.
@var{fundecl} is a C variable whose value is a tree node that describes
the function in question. Normally it is a node of type
@@ -3965,7 +3964,7 @@ arguments pop them but other functions (such as @code{printf}) pop
nothing (the caller pops all). When this convention is in use,
@var{funtype} is examined to determine whether a function takes a fixed
number of arguments.
-@end defmac
+@end deftypefn
@defmac CALL_POPS_ARGS (@var{cum})
A C expression that should indicate the number of bytes a call sequence
diff --git a/gcc/function.c b/gcc/function.c
index 5c31955380a..f58d3d1b4e6 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -3369,8 +3369,9 @@ assign_parms (tree fndecl)
/* See how many bytes, if any, of its args a function should try to pop
on return. */
- crtl->args.pops_args = RETURN_POPS_ARGS (fndecl, TREE_TYPE (fndecl),
- crtl->args.size);
+ crtl->args.pops_args = targetm.calls.return_pops_args (fndecl,
+ TREE_TYPE (fndecl),
+ crtl->args.size);
/* For stdarg.h function, save info about
regs and stack space used by the named args. */
diff --git a/gcc/reginfo.c b/gcc/reginfo.c
index b868c37fda8..bf2d8025b3c 100644
--- a/gcc/reginfo.c
+++ b/gcc/reginfo.c
@@ -530,11 +530,12 @@ init_reg_sets_1 (void)
/* There are a couple of fixed registers that we know are safe to
exclude from being clobbered by calls:
- The frame pointer is always preserved across calls. The arg pointer
- is if it is fixed. The stack pointer usually is, unless
- RETURN_POPS_ARGS, in which case an explicit CLOBBER will be present.
- If we are generating PIC code, the PIC offset table register is
- preserved across calls, though the target can override that. */
+ The frame pointer is always preserved across calls. The arg
+ pointer is if it is fixed. The stack pointer usually is,
+ unless TARGET_RETURN_POPS_ARGS, in which case an explicit
+ CLOBBER will be present. If we are generating PIC code, the
+ PIC offset table register is preserved across calls, though the
+ target can override that. */
if (i == STACK_POINTER_REGNUM)
;
diff --git a/gcc/system.h b/gcc/system.h
index af3dd3a64e7..dd72d07fa3d 100644
--- a/gcc/system.h
+++ b/gcc/system.h
@@ -714,7 +714,8 @@ extern void fancy_abort (const char *, int, const char *) ATTRIBUTE_NORETURN;
FUNCTION_ARG_PARTIAL_NREGS ASM_OUTPUT_DWARF_DTPREL \
ALLOCATE_INITIAL_VALUE LEGITIMIZE_ADDRESS FRAME_POINTER_REQUIRED \
CAN_ELIMINATE TRAMPOLINE_TEMPLATE INITIALIZE_TRAMPOLINE \
- TRAMPOLINE_ADJUST_ADDRESS STATIC_CHAIN STATIC_CHAIN_INCOMING
+ TRAMPOLINE_ADJUST_ADDRESS STATIC_CHAIN STATIC_CHAIN_INCOMING \
+ RETURN_POPS_ARGS
/* Other obsolete target macros, or macros that used to be in target
headers and were not used, and may be obsolete or may never have
diff --git a/gcc/target-def.h b/gcc/target-def.h
index 27b7fa8e041..7342ba7715f 100644
--- a/gcc/target-def.h
+++ b/gcc/target-def.h
@@ -722,6 +722,7 @@
#define TARGET_STATIC_CHAIN default_static_chain
#define TARGET_TRAMPOLINE_INIT default_trampoline_init
#define TARGET_TRAMPOLINE_ADJUST_ADDRESS NULL
+#define TARGET_RETURN_POPS_ARGS default_return_pops_args
#define TARGET_CALLS { \
TARGET_PROMOTE_FUNCTION_MODE, \
@@ -748,7 +749,8 @@
TARGET_ALLOCATE_STACK_SLOTS_FOR_ARGS, \
TARGET_STATIC_CHAIN, \
TARGET_TRAMPOLINE_INIT, \
- TARGET_TRAMPOLINE_ADJUST_ADDRESS \
+ TARGET_TRAMPOLINE_ADJUST_ADDRESS, \
+ TARGET_RETURN_POPS_ARGS \
}
#ifndef TARGET_UNWIND_TABLES_DEFAULT
diff --git a/gcc/target.h b/gcc/target.h
index 5a857d7edf7..1d4ab4103f2 100644
--- a/gcc/target.h
+++ b/gcc/target.h
@@ -1064,6 +1064,11 @@ struct gcc_target
/* Adjust the address of the trampoline in a target-specific way. */
rtx (*trampoline_adjust_address) (rtx addr);
+
+ /* Return the number of bytes of its own arguments that a function
+ pops on returning, or 0 if the function pops no arguments and the
+ caller must therefore pop them all after the function returns. */
+ int (*return_pops_args) (tree fundecl, tree funtype, int size);
} calls;
/* Return the diagnostic message string if conversion from FROMTYPE
diff --git a/gcc/targhooks.c b/gcc/targhooks.c
index 62e357729bb..b0ef5c6127e 100644
--- a/gcc/targhooks.c
+++ b/gcc/targhooks.c
@@ -756,6 +756,14 @@ default_trampoline_init (rtx ARG_UNUSED (m_tramp), tree ARG_UNUSED (t_func),
sorry ("nested function trampolines not supported on this target");
}
+int
+default_return_pops_args (tree fundecl ATTRIBUTE_UNUSED,
+ tree funtype ATTRIBUTE_UNUSED,
+ int size ATTRIBUTE_UNUSED)
+{
+ return 0;
+}
+
enum reg_class
default_branch_target_register_class (void)
{
diff --git a/gcc/targhooks.h b/gcc/targhooks.h
index fdd0e4a3c75..e24f85ecede 100644
--- a/gcc/targhooks.h
+++ b/gcc/targhooks.h
@@ -108,6 +108,7 @@ extern bool default_function_value_regno_p (const unsigned int);
extern rtx default_internal_arg_pointer (void);
extern rtx default_static_chain (const_tree, bool);
extern void default_trampoline_init (rtx, tree, rtx);
+extern int default_return_pops_args (tree, tree, int);
extern enum reg_class default_branch_target_register_class (void);
#ifdef IRA_COVER_CLASSES
extern const enum reg_class *default_ira_cover_classes (void);