Fix c/5351 and optimization/7591.
2002-11-08 H.J. Lu <hjl@gnu.org> Fix c/5351 and optimization/7591. * calls.c (store_one_arg): Remove ATTRIBUTE_UNUSED on variable_size. Mark any slots used for the argument as in-use only if we can't pass all arguments to a library call in registers. From-SVN: r58937
This commit is contained in:
parent
896153ba57
commit
d22909ba59
|
@ -1,3 +1,12 @@
|
|||
2002-11-08 H.J. Lu <hjl@gnu.org>
|
||||
|
||||
Fix c/5351 and optimization/7591.
|
||||
|
||||
* calls.c (store_one_arg): Remove ATTRIBUTE_UNUSED on
|
||||
variable_size. Mark any slots used for the argument as in-use
|
||||
only if we can't pass all arguments to a library call in
|
||||
registers.
|
||||
|
||||
2002-11-07 H.J. Lu <hjl@gnu.org>
|
||||
|
||||
Fix bootstrap/8146 and
|
||||
|
|
29
gcc/calls.c
29
gcc/calls.c
|
@ -4284,7 +4284,7 @@ store_one_arg (arg, argblock, flags, variable_size, reg_parm_stack_space)
|
|||
struct arg_data *arg;
|
||||
rtx argblock;
|
||||
int flags;
|
||||
int variable_size ATTRIBUTE_UNUSED;
|
||||
int variable_size;
|
||||
int reg_parm_stack_space;
|
||||
{
|
||||
tree pval = arg->tree_value;
|
||||
|
@ -4359,14 +4359,22 @@ store_one_arg (arg, argblock, flags, variable_size, reg_parm_stack_space)
|
|||
emit_move_insn (arg->save_area, stack_area);
|
||||
}
|
||||
}
|
||||
|
||||
/* Now that we have saved any slots that will be overwritten
|
||||
by this store, mark all slots this store will use. We
|
||||
must do this before we actually expand the argument since
|
||||
the expansion itself may trigger library calls which might
|
||||
need to use the same stack slot. We only do it if we can't
|
||||
pass all arguments to a library call in registers. */
|
||||
if (arg->partial)
|
||||
{
|
||||
for (i = lower_bound; i < upper_bound; i++)
|
||||
stack_usage_map[i] = 1;
|
||||
|
||||
/* Set it so that we don't do it again. */
|
||||
variable_size = 1;
|
||||
}
|
||||
}
|
||||
/* Now that we have saved any slots that will be overwritten by this
|
||||
store, mark all slots this store will use. We must do this before
|
||||
we actually expand the argument since the expansion itself may
|
||||
trigger library calls which might need to use the same stack slot. */
|
||||
if (argblock && ! variable_size && arg->stack)
|
||||
for (i = lower_bound; i < upper_bound; i++)
|
||||
stack_usage_map[i] = 1;
|
||||
}
|
||||
|
||||
/* If this isn't going to be placed on both the stack and in registers,
|
||||
|
@ -4594,6 +4602,11 @@ store_one_arg (arg, argblock, flags, variable_size, reg_parm_stack_space)
|
|||
arg->value = arg->stack_slot;
|
||||
}
|
||||
|
||||
if (ACCUMULATE_OUTGOING_ARGS && !(flags & ECF_SIBCALL)
|
||||
&& argblock && ! variable_size && arg->stack)
|
||||
for (i = lower_bound; i < upper_bound; i++)
|
||||
stack_usage_map[i] = 1;
|
||||
|
||||
/* Once we have pushed something, pops can't safely
|
||||
be deferred during the rest of the arguments. */
|
||||
NO_DEFER_POP;
|
||||
|
|
Loading…
Reference in New Issue