parent
f6eed26d80
commit
6f90e075cd
40
gcc/calls.c
40
gcc/calls.c
|
@ -432,6 +432,9 @@ expand_call (exp, target, ignore)
|
|||
#endif
|
||||
#endif
|
||||
|
||||
/* Size of the stack reserved for paramter registers. */
|
||||
int reg_parm_stack_space = 0;
|
||||
|
||||
/* 1 if scanning parms front to back, -1 if scanning back to front. */
|
||||
int inc;
|
||||
/* Address of space preallocated for stack parms
|
||||
|
@ -513,6 +516,14 @@ expand_call (exp, target, ignore)
|
|||
|
||||
is_volatile = TYPE_VOLATILE (TREE_TYPE (TREE_TYPE (p)));
|
||||
|
||||
#ifdef REG_PARM_STACK_SPACE
|
||||
#ifdef MAYBE_REG_PARM_STACK_SPACE
|
||||
reg_parm_stack_space = MAYBE_REG_PARM_STACK_SPACE;
|
||||
#else
|
||||
reg_parm_stack_space = REG_PARM_STACK_SPACE (fndecl);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Warn if this value is an aggregate type,
|
||||
regardless of which calling convention we are using for it. */
|
||||
if (warn_aggregate_return
|
||||
|
@ -844,7 +855,7 @@ expand_call (exp, target, ignore)
|
|||
/* Compute the stack-size of this argument. */
|
||||
if (args[i].reg == 0 || args[i].partial != 0
|
||||
#ifdef REG_PARM_STACK_SPACE
|
||||
|| REG_PARM_STACK_SPACE (fndecl) > 0
|
||||
|| reg_parm_stack_space > 0
|
||||
#endif
|
||||
|| args[i].pass_on_stack)
|
||||
locate_and_pad_parm (TYPE_MODE (type), type,
|
||||
|
@ -896,6 +907,11 @@ expand_call (exp, target, ignore)
|
|||
argpos < n_named_args);
|
||||
}
|
||||
|
||||
#ifdef FINAL_REG_PARM_STACK_SPACE
|
||||
reg_parm_stack_space = FINAL_REG_PARM_STACK_SPACE (args_size.constant,
|
||||
args_size.var);
|
||||
#endif
|
||||
|
||||
/* Compute the actual size of the argument block required. The variable
|
||||
and constant sizes must be combined, the size may have to be rounded,
|
||||
and there may be a minimum required size. */
|
||||
|
@ -920,7 +936,7 @@ expand_call (exp, target, ignore)
|
|||
#endif
|
||||
|
||||
#ifdef REG_PARM_STACK_SPACE
|
||||
if (REG_PARM_STACK_SPACE (fndecl) > 0)
|
||||
if (reg_parm_stack_space > 0)
|
||||
{
|
||||
args_size.var
|
||||
= size_binop (MAX_EXPR, args_size.var,
|
||||
|
@ -931,7 +947,7 @@ expand_call (exp, target, ignore)
|
|||
the size of the block we need. So make the adjustment. */
|
||||
args_size.var
|
||||
= size_binop (MINUS_EXPR, args_size.var,
|
||||
size_int (REG_PARM_STACK_SPACE (fndecl)));
|
||||
size_int (reg_parm_stack_space));
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
@ -945,9 +961,9 @@ expand_call (exp, target, ignore)
|
|||
|
||||
#ifdef REG_PARM_STACK_SPACE
|
||||
args_size.constant = MAX (args_size.constant,
|
||||
REG_PARM_STACK_SPACE (fndecl));
|
||||
reg_parm_stack_space);
|
||||
#ifndef OUTGOING_REG_PARM_STACK_SPACE
|
||||
args_size.constant -= REG_PARM_STACK_SPACE (fndecl);
|
||||
args_size.constant -= reg_parm_stack_space;
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
@ -1082,7 +1098,7 @@ expand_call (exp, target, ignore)
|
|||
/* 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 (fndecl);
|
||||
needed += reg_parm_stack_space;
|
||||
#endif
|
||||
|
||||
#ifdef ARGS_GROW_DOWNWARD
|
||||
|
@ -1246,7 +1262,7 @@ expand_call (exp, target, ignore)
|
|||
|
||||
Here we compute the boundary of the that needs to be saved, if any. */
|
||||
|
||||
for (i = 0; i < REG_PARM_STACK_SPACE (fndecl); i++)
|
||||
for (i = 0; i < reg_parm_stack_space; i++)
|
||||
{
|
||||
if (i >= highest_outgoing_arg_in_use
|
||||
|| stack_usage_map[i] == 0)
|
||||
|
@ -1299,7 +1315,7 @@ expand_call (exp, target, ignore)
|
|||
for (i = 0; i < num_actuals; i++)
|
||||
if (args[i].reg == 0 || args[i].pass_on_stack)
|
||||
store_one_arg (&args[i], argblock, may_be_alloca,
|
||||
args_size.var != 0, fndecl);
|
||||
args_size.var != 0, fndecl, reg_parm_stack_space);
|
||||
|
||||
/* Now store any partially-in-registers parm.
|
||||
This is the last place a block-move can happen. */
|
||||
|
@ -1307,7 +1323,7 @@ expand_call (exp, target, ignore)
|
|||
for (i = 0; i < num_actuals; i++)
|
||||
if (args[i].partial != 0 && ! args[i].pass_on_stack)
|
||||
store_one_arg (&args[i], argblock, may_be_alloca,
|
||||
args_size.var != 0, fndecl);
|
||||
args_size.var != 0, fndecl, reg_parm_stack_space);
|
||||
|
||||
#ifndef PUSH_ARGS_REVERSED
|
||||
#ifdef STACK_BOUNDARY
|
||||
|
@ -1618,12 +1634,14 @@ target_for_arg (type, size, args_addr, offset)
|
|||
FNDECL is the declaration of the function we are calling. */
|
||||
|
||||
static void
|
||||
store_one_arg (arg, argblock, may_be_alloca, variable_size, fndecl)
|
||||
store_one_arg (arg, argblock, may_be_alloca, variable_size, fndecl,
|
||||
reg_parm_stack_space)
|
||||
struct arg_data *arg;
|
||||
rtx argblock;
|
||||
int may_be_alloca;
|
||||
int variable_size;
|
||||
tree fndecl;
|
||||
int reg_parm_stack_space;
|
||||
{
|
||||
register tree pval = arg->tree_value;
|
||||
rtx reg = 0;
|
||||
|
@ -1662,7 +1680,7 @@ store_one_arg (arg, argblock, may_be_alloca, variable_size, fndecl)
|
|||
#ifdef REG_PARM_STACK_SPACE
|
||||
/* Don't store things in the fixed argument area at this point;
|
||||
it has already been saved. */
|
||||
&& i > REG_PARM_STACK_SPACE (fndecl)
|
||||
&& i > reg_parm_stack_space
|
||||
#endif
|
||||
)
|
||||
break;
|
||||
|
|
15
gcc/cse.c
15
gcc/cse.c
|
@ -524,10 +524,21 @@ struct write_data
|
|||
|| XEXP (X, 0) == virtual_stack_vars_rtx \
|
||||
|| XEXP (X, 0) == virtual_incoming_args_rtx)))
|
||||
|
||||
/* Similar, but also allows reference to the stack pointer. */
|
||||
/* Similar, but also allows reference to the stack pointer.
|
||||
|
||||
This used to include FIXED_BASE_PLUS_P, however, we can't assume that
|
||||
arg_pointer_rtx by itself is nonzero, because on at least one machine,
|
||||
the i960, the arg pointer is zero when it is unused. */
|
||||
|
||||
#define NONZERO_BASE_PLUS_P(X) \
|
||||
(FIXED_BASE_PLUS_P (X) \
|
||||
((X) == frame_pointer_rtx \
|
||||
|| (X) == virtual_stack_vars_rtx \
|
||||
|| (X) == virtual_incoming_args_rtx \
|
||||
|| (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 1)) == CONST_INT \
|
||||
&& (XEXP (X, 0) == frame_pointer_rtx \
|
||||
|| XEXP (X, 0) == arg_pointer_rtx \
|
||||
|| XEXP (X, 0) == virtual_stack_vars_rtx \
|
||||
|| XEXP (X, 0) == virtual_incoming_args_rtx)) \
|
||||
|| (X) == stack_pointer_rtx \
|
||||
|| (X) == virtual_stack_dynamic_rtx \
|
||||
|| (X) == virtual_outgoing_args_rtx \
|
||||
|
|
|
@ -3681,6 +3681,9 @@ expand_expr (exp, target, tmode, modifier)
|
|||
temp = simplify_binary_operation (PLUS, mode, XEXP (op1, 0), op0);
|
||||
if (temp != 0)
|
||||
op0 = temp;
|
||||
/* Ensure that MULT comes first if there is one. */
|
||||
else if (GET_CODE (op0) == MULT)
|
||||
op0 = gen_rtx (PLUS, mode, op0, XEXP (op1, 0));
|
||||
else
|
||||
op0 = gen_rtx (PLUS, mode, XEXP (op1, 0), op0);
|
||||
|
||||
|
|
|
@ -2916,9 +2916,11 @@ assign_parms (fndecl, second_time)
|
|||
minimum length. */
|
||||
|
||||
#ifdef REG_PARM_STACK_SPACE
|
||||
#ifndef MAYBE_REG_PARM_STACK_SPACE
|
||||
current_function_args_size = MAX (current_function_args_size,
|
||||
REG_PARM_STACK_SPACE (fndecl));
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef STACK_BOUNDARY
|
||||
#define STACK_BYTES (STACK_BOUNDARY / BITS_PER_UNIT)
|
||||
|
|
|
@ -25,6 +25,9 @@
|
|||
#ifdef __sparc__
|
||||
#include "va-sparc.h"
|
||||
#else
|
||||
#ifdef __i960__
|
||||
#include "va-i960.h"
|
||||
#else
|
||||
|
||||
#ifdef _HIDDEN_VA_LIST /* On OSF1, this means varargs.h is "half-loaded". */
|
||||
#undef _VA_LIST
|
||||
|
@ -56,6 +59,7 @@ void va_end (va_list); /* Defined in libgcc.a */
|
|||
(AP += __va_rounded_size (TYPE), \
|
||||
*((TYPE *) (AP - __va_rounded_size (TYPE))))
|
||||
|
||||
#endif /* not i960 */
|
||||
#endif /* not sparc */
|
||||
#endif /* not mips */
|
||||
#endif /* not hp9000s800 */
|
||||
|
|
|
@ -28,6 +28,9 @@
|
|||
#ifdef __hp9000s800__
|
||||
#include "va-hp800.h"
|
||||
#else
|
||||
#ifdef __i960__
|
||||
#include "va-i960.h"
|
||||
#else
|
||||
|
||||
#ifdef __NeXT__
|
||||
|
||||
|
@ -95,6 +98,7 @@ typedef char * __va___list;
|
|||
(AP += __va_rounded_size (TYPE), \
|
||||
*((TYPE *) (AP - __va_rounded_size (TYPE))))
|
||||
|
||||
#endif /* not i960 */
|
||||
#endif /* not hp800 */
|
||||
#endif /* not m88k */
|
||||
#endif /* not pyr */
|
||||
|
|
Loading…
Reference in New Issue