From ac294f0bbc8c83fb170f567c1032b7bf2cda829c Mon Sep 17 00:00:00 2001 From: Kai Tietz Date: Thu, 22 Mar 2007 21:33:45 +0000 Subject: [PATCH] defaults.h (OUTGOING_REG_PARM_STACK_SPACE): Provide default. * defaults.h (OUTGOING_REG_PARM_STACK_SPACE): Provide default. * calls.c (compute_argument_block_size, expand_call, emit_library_call_value_1): Don't ifdef OUTGOING_REG_PARM_STACK_SPACE. * expr.c (block_move_libcall_safe_for_call_parm): Likewise. * function.c (STACK_DYNAMIC_OFFSET): Likewise. * doc/tm.texi (OUTGOING_REG_PARM_STACK_SPACE): Update. * config/alpha/unicosmk.h, config/bfin/bfin.h, config/iq2000/iq2000.h, config/mips/mips.h, config/mn10300/mn10300.h, config/mt/mt.h, config/pa/pa.h, config/rs6000/rs6000.h, config/score/score.h, config/spu/spu.h, config/v850/v850.h (OUTGOING_REG_PARM_STACK_SPACE): Set to 1. Co-Authored-By: Richard Henderson From-SVN: r123135 --- gcc/ChangeLog | 15 ++++++++++++ gcc/calls.c | 47 ++++++++++++++---------------------- gcc/config/alpha/unicosmk.h | 2 +- gcc/config/bfin/bfin.h | 2 +- gcc/config/iq2000/iq2000.h | 2 +- gcc/config/mips/mips.h | 2 +- gcc/config/mn10300/mn10300.h | 2 +- gcc/config/mt/mt.h | 2 +- gcc/config/pa/pa.h | 2 +- gcc/config/rs6000/rs6000.h | 2 +- gcc/config/score/score.h | 2 +- gcc/config/spu/spu.h | 2 +- gcc/config/v850/v850.h | 2 +- gcc/defaults.h | 4 +++ gcc/doc/tm.texi | 4 +-- gcc/expr.c | 15 ++++++------ gcc/function.c | 8 +++--- 17 files changed, 62 insertions(+), 53 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 047a1ffcfe9..576cba8122c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2007-03-22 Kai Tietz + Richard Henderson + + * defaults.h (OUTGOING_REG_PARM_STACK_SPACE): Provide default. + * calls.c (compute_argument_block_size, expand_call, + emit_library_call_value_1): Don't ifdef OUTGOING_REG_PARM_STACK_SPACE. + * expr.c (block_move_libcall_safe_for_call_parm): Likewise. + * function.c (STACK_DYNAMIC_OFFSET): Likewise. + * doc/tm.texi (OUTGOING_REG_PARM_STACK_SPACE): Update. + * config/alpha/unicosmk.h, config/bfin/bfin.h, config/iq2000/iq2000.h, + config/mips/mips.h, config/mn10300/mn10300.h, config/mt/mt.h, + config/pa/pa.h, config/rs6000/rs6000.h, config/score/score.h, + config/spu/spu.h, config/v850/v850.h (OUTGOING_REG_PARM_STACK_SPACE): + Set to 1. + 2007-03-22 Joseph Myers * c-incpath.c (add_sysroot_to_chain): New. diff --git a/gcc/calls.c b/gcc/calls.c index 8723e1f4fae..9ef3b0ed125 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -1222,13 +1222,12 @@ compute_argument_block_size (int reg_parm_stack_space, = size_binop (MAX_EXPR, args_size->var, ssize_int (reg_parm_stack_space)); -#ifndef OUTGOING_REG_PARM_STACK_SPACE /* The area corresponding to register parameters is not to count in the size of the block we need. So make the adjustment. */ - args_size->var - = size_binop (MINUS_EXPR, args_size->var, - ssize_int (reg_parm_stack_space)); -#endif + if (!OUTGOING_REG_PARM_STACK_SPACE) + args_size->var + = size_binop (MINUS_EXPR, args_size->var, + ssize_int (reg_parm_stack_space)); } } else @@ -1246,9 +1245,8 @@ compute_argument_block_size (int reg_parm_stack_space, args_size->constant = MAX (args_size->constant, reg_parm_stack_space); -#ifndef OUTGOING_REG_PARM_STACK_SPACE - args_size->constant -= reg_parm_stack_space; -#endif + if (!OUTGOING_REG_PARM_STACK_SPACE) + args_size->constant -= reg_parm_stack_space; } return unadjusted_args_size; } @@ -2026,10 +2024,8 @@ expand_call (tree exp, rtx target, int ignore) reg_parm_stack_space = REG_PARM_STACK_SPACE (fndecl); #endif -#ifndef OUTGOING_REG_PARM_STACK_SPACE - if (reg_parm_stack_space > 0 && PUSH_ARGS) + if (!OUTGOING_REG_PARM_STACK_SPACE && reg_parm_stack_space > 0 && PUSH_ARGS) must_preallocate = 1; -#endif /* Set up a place to return a structure. */ @@ -2430,12 +2426,11 @@ expand_call (tree exp, rtx target, int ignore) Another approach might be to try to reorder the argument evaluations to avoid this conflicting stack usage. */ -#ifndef OUTGOING_REG_PARM_STACK_SPACE /* Since we will be writing into the entire argument area, the map must be allocated for its entire size, not just the part that is the responsibility of the caller. */ - needed += reg_parm_stack_space; -#endif + if (!OUTGOING_REG_PARM_STACK_SPACE) + needed += reg_parm_stack_space; #ifdef ARGS_GROW_DOWNWARD highest_outgoing_arg_in_use = MAX (initial_highest_arg_in_use, @@ -2531,12 +2526,10 @@ expand_call (tree exp, rtx target, int ignore) an argument. */ if (stack_arg_under_construction) { -#ifndef OUTGOING_REG_PARM_STACK_SPACE - rtx push_size = GEN_INT (reg_parm_stack_space - + adjusted_args_size.constant); -#else - rtx push_size = GEN_INT (adjusted_args_size.constant); -#endif + rtx push_size + = GEN_INT (adjusted_args_size.constant + + (OUTGOING_REG_PARM_STACK_SPACE ? 0 + : reg_parm_stack_space)); if (old_stack_level == 0) { emit_stack_save (SAVE_BLOCK, &old_stack_level, @@ -2706,11 +2699,9 @@ expand_call (tree exp, rtx target, int ignore) /* If register arguments require space on the stack and stack space was not preallocated, allocate stack space here for arguments passed in registers. */ -#ifdef OUTGOING_REG_PARM_STACK_SPACE - if (!ACCUMULATE_OUTGOING_ARGS + if (OUTGOING_REG_PARM_STACK_SPACE && !ACCUMULATE_OUTGOING_ARGS && must_preallocate == 0 && reg_parm_stack_space > 0) anti_adjust_stack (GEN_INT (reg_parm_stack_space)); -#endif /* Pass the function the address in which to return a structure value. */ @@ -3532,9 +3523,8 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value, args_size.constant = MAX (args_size.constant, reg_parm_stack_space); -#ifndef OUTGOING_REG_PARM_STACK_SPACE - args_size.constant -= reg_parm_stack_space; -#endif + if (!OUTGOING_REG_PARM_STACK_SPACE) + args_size.constant -= reg_parm_stack_space; if (args_size.constant > current_function_outgoing_args_size) current_function_outgoing_args_size = args_size.constant; @@ -3555,12 +3545,11 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value, needed = args_size.constant; -#ifndef OUTGOING_REG_PARM_STACK_SPACE /* Since we will be writing into the entire argument area, the map must be allocated for its entire size, not just the part that is the responsibility of the caller. */ - needed += reg_parm_stack_space; -#endif + if (!OUTGOING_REG_PARM_STACK_SPACE) + needed += reg_parm_stack_space; #ifdef ARGS_GROW_DOWNWARD highest_outgoing_arg_in_use = MAX (initial_highest_arg_in_use, diff --git a/gcc/config/alpha/unicosmk.h b/gcc/config/alpha/unicosmk.h index a05b33396c0..9435e71a0c2 100644 --- a/gcc/config/alpha/unicosmk.h +++ b/gcc/config/alpha/unicosmk.h @@ -116,7 +116,7 @@ Boston, MA 02110-1301, USA. */ in registers) are allocated. */ #define REG_PARM_STACK_SPACE(DECL) 48 -#define OUTGOING_REG_PARM_STACK_SPACE +#define OUTGOING_REG_PARM_STACK_SPACE 1 /* If an argument can't be passed in registers even though not all argument registers have been used yet, it is passed on the stack in the space diff --git a/gcc/config/bfin/bfin.h b/gcc/config/bfin/bfin.h index 3085a38909d..b2ee26eeaaa 100644 --- a/gcc/config/bfin/bfin.h +++ b/gcc/config/bfin/bfin.h @@ -180,7 +180,7 @@ extern const char *bfin_library_id_string; /* Define this if the above stack space is to be considered part of the * space allocated by the caller. */ -#define OUTGOING_REG_PARM_STACK_SPACE +#define OUTGOING_REG_PARM_STACK_SPACE 1 /* Define this if the maximum size of all the outgoing args is to be accumulated and pushed during the prologue. The amount can be diff --git a/gcc/config/iq2000/iq2000.h b/gcc/config/iq2000/iq2000.h index 24ea3e0ba1d..5c61bef7bca 100644 --- a/gcc/config/iq2000/iq2000.h +++ b/gcc/config/iq2000/iq2000.h @@ -375,7 +375,7 @@ enum reg_class #define REG_PARM_STACK_SPACE(FNDECL) 0 -#define OUTGOING_REG_PARM_STACK_SPACE +#define OUTGOING_REG_PARM_STACK_SPACE 1 #define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) 0 diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h index ef6b02c4186..641772a1a99 100644 --- a/gcc/config/mips/mips.h +++ b/gcc/config/mips/mips.h @@ -1807,7 +1807,7 @@ extern const enum reg_class mips_regno_to_class[]; If `ACCUMULATE_OUTGOING_ARGS' is also defined, the only effect of this macro is to determine whether the space is included in `current_function_outgoing_args_size'. */ -#define OUTGOING_REG_PARM_STACK_SPACE +#define OUTGOING_REG_PARM_STACK_SPACE 1 #define STACK_BOUNDARY (TARGET_NEWABI ? 128 : 64) diff --git a/gcc/config/mn10300/mn10300.h b/gcc/config/mn10300/mn10300.h index f91db27aaff..b49518b3554 100644 --- a/gcc/config/mn10300/mn10300.h +++ b/gcc/config/mn10300/mn10300.h @@ -529,7 +529,7 @@ enum reg_class { /* 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 -#define OUTGOING_REG_PARM_STACK_SPACE +#define OUTGOING_REG_PARM_STACK_SPACE 1 #define ACCUMULATE_OUTGOING_ARGS 1 /* So we can allocate space for return pointers once for the function diff --git a/gcc/config/mt/mt.h b/gcc/config/mt/mt.h index 79d94d451c3..a4afb3c3051 100644 --- a/gcc/config/mt/mt.h +++ b/gcc/config/mt/mt.h @@ -533,7 +533,7 @@ extern struct mt_frame_info current_frame_info; /* Define this if it is the responsibility of the caller to allocate the area reserved for arguments passed in registers. */ -#define OUTGOING_REG_PARM_STACK_SPACE +#define OUTGOING_REG_PARM_STACK_SPACE 1 /* The number of register assigned to holding function arguments. */ #define MT_NUM_ARG_REGS 4 diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h index 60a72459581..b7edfe18533 100644 --- a/gcc/config/pa/pa.h +++ b/gcc/config/pa/pa.h @@ -602,7 +602,7 @@ extern struct rtx_def *hppa_pic_save_rtx (void); /* Define this if the above stack space is to be considered part of the space allocated by the caller. */ -#define OUTGOING_REG_PARM_STACK_SPACE +#define OUTGOING_REG_PARM_STACK_SPACE 1 /* Keep the stack pointer constant throughout the function. This is both an optimization and a necessity: longjmp diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index 386a7c1d359..8aadc43a16a 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -1277,7 +1277,7 @@ extern enum rs6000_abi rs6000_current_abi; /* available for use by subtarget */ /* Define this if the above stack space is to be considered part of the space allocated by the caller. */ -#define OUTGOING_REG_PARM_STACK_SPACE +#define OUTGOING_REG_PARM_STACK_SPACE 1 /* This is the difference between the logical top of stack and the actual sp. diff --git a/gcc/config/score/score.h b/gcc/config/score/score.h index 3ee53cfcb87..3fd079221c1 100644 --- a/gcc/config/score/score.h +++ b/gcc/config/score/score.h @@ -534,7 +534,7 @@ enum reg_class If `ACCUMULATE_OUTGOING_ARGS' is also defined, the only effect of this macro is to determine whether the space is included in `current_function_outgoing_args_size'. */ -#define OUTGOING_REG_PARM_STACK_SPACE +#define OUTGOING_REG_PARM_STACK_SPACE 1 #define RETURN_POPS_ARGS(FUNDECL, FUNTYPE, STACK_SIZE) 0 diff --git a/gcc/config/spu/spu.h b/gcc/config/spu/spu.h index 1fcc2349fac..1f1547218a8 100644 --- a/gcc/config/spu/spu.h +++ b/gcc/config/spu/spu.h @@ -337,7 +337,7 @@ targetm.resolve_overloaded_builtin = spu_resolve_overloaded_builtin; \ #define REG_PARM_STACK_SPACE(FNDECL) 0 -#define OUTGOING_REG_PARM_STACK_SPACE +#define OUTGOING_REG_PARM_STACK_SPACE 1 #define RETURN_POPS_ARGS(FUNDECL,FUNTYPE,SIZE) (0) diff --git a/gcc/config/v850/v850.h b/gcc/config/v850/v850.h index b6691531eaa..b2c14cc95f3 100644 --- a/gcc/config/v850/v850.h +++ b/gcc/config/v850/v850.h @@ -626,7 +626,7 @@ struct cum_arg { int nbytes; int anonymous_args; }; /* Define this if the above stack space is to be considered part of the space allocated by the caller. */ -#define OUTGOING_REG_PARM_STACK_SPACE +#define OUTGOING_REG_PARM_STACK_SPACE 1 /* 1 if N is a possible register number for function argument passing. */ diff --git a/gcc/defaults.h b/gcc/defaults.h index b17d59e1940..ed1ae39b9d1 100644 --- a/gcc/defaults.h +++ b/gcc/defaults.h @@ -906,4 +906,8 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA #define HARD_REGNO_NREGS_WITH_PADDING(REGNO, MODE) -1 #endif +#ifndef OUTGOING_REG_PARM_STACK_SPACE +#define OUTGOING_REG_PARM_STACK_SPACE 0 +#endif + #endif /* ! GCC_DEFAULTS_H */ diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index ca348e58670..9cdc869198b 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -3730,8 +3730,8 @@ which. @c something, not sure if it looks good. --mew 10feb93 @defmac OUTGOING_REG_PARM_STACK_SPACE -Define this if it is the responsibility of the caller to allocate the area -reserved for arguments passed in registers. +Define this to a non-zero value if it is the responsibility of the caller +to allocate the area reserved for arguments passed in registers. If @code{ACCUMULATE_OUTGOING_ARGS} is defined, this macro controls whether the space for these arguments counts in the value of diff --git a/gcc/expr.c b/gcc/expr.c index 1dc437cb836..1e22c8ca3f8 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -1237,13 +1237,14 @@ block_move_libcall_safe_for_call_parm (void) /* If registers go on the stack anyway, any argument is sure to clobber an outgoing argument. */ -#if defined (REG_PARM_STACK_SPACE) && defined (OUTGOING_REG_PARM_STACK_SPACE) - { - tree fn = emit_block_move_libcall_fn (false); - (void) fn; - if (REG_PARM_STACK_SPACE (fn) != 0) - return false; - } +#if defined (REG_PARM_STACK_SPACE) + if (OUTGOING_REG_PARM_STACK_SPACE) + { + tree fn; + fn = emit_block_move_libcall_fn (false); + if (REG_PARM_STACK_SPACE (fn) != 0) + return false; + } #endif /* If any argument goes in memory, then it might clobber an outgoing diff --git a/gcc/function.c b/gcc/function.c index f6ebb855898..f0a2dd61392 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -1211,12 +1211,12 @@ static int cfa_offset; `current_function_outgoing_args_size'. Nevertheless, we must allow for it when allocating stack dynamic objects. */ -#if defined(REG_PARM_STACK_SPACE) && ! defined(OUTGOING_REG_PARM_STACK_SPACE) +#if defined(REG_PARM_STACK_SPACE) #define STACK_DYNAMIC_OFFSET(FNDECL) \ ((ACCUMULATE_OUTGOING_ARGS \ - ? (current_function_outgoing_args_size + REG_PARM_STACK_SPACE (FNDECL)) : 0)\ - + (STACK_POINTER_OFFSET)) \ - + ? (current_function_outgoing_args_size \ + + (OUTGOING_REG_PARM_STACK_SPACE ? 0 : REG_PARM_STACK_SPACE (FNDECL))) \ + : 0) + (STACK_POINTER_OFFSET)) #else #define STACK_DYNAMIC_OFFSET(FNDECL) \ ((ACCUMULATE_OUTGOING_ARGS ? current_function_outgoing_args_size : 0) \