diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d669773d99f..748d7a7393a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,8 @@ 2002-02-11 Alexandre Oliva + * calls.c (store_one_arg): In the non-BLKmode non-partial case, + take padding into account when computing the argument value. + * config/sh/sh.h (FUNCTION_ARG_REGNO_P): Fix parenthesizing error. * combine.c (try_combine): Apply substitutions in diff --git a/gcc/calls.c b/gcc/calls.c index 9d014f925cd..7e2bc4b2f9f 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -4465,6 +4465,11 @@ store_one_arg (arg, argblock, flags, variable_size, reg_parm_stack_space) partial, reg, used - size, argblock, ARGS_SIZE_RTX (arg->offset), reg_parm_stack_space, ARGS_SIZE_RTX (arg->alignment_pad)); + + /* Unless this is a partially-in-register argument, the argument is now + in the stack. */ + if (partial == 0) + arg->value = arg->stack; } else { @@ -4564,17 +4569,19 @@ store_one_arg (arg, argblock, flags, variable_size, reg_parm_stack_space) argblock, ARGS_SIZE_RTX (arg->offset), reg_parm_stack_space, ARGS_SIZE_RTX (arg->alignment_pad)); + + /* Unless this is a partially-in-register argument, the argument is now + in the stack. + + ??? Unlike the case above, in which we want the actual + address of the data, so that we can load it directly into a + register, here we want the address of the stack slot, so that + it's properly aligned for word-by-word copying or something + like that. It's not clear that this is always correct. */ + if (partial == 0) + arg->value = arg->stack_slot; } - /* Unless this is a partially-in-register argument, the argument is now - in the stack. - - ??? Note that this can change arg->value from arg->stack to - arg->stack_slot and it matters when they are not the same. - It isn't totally clear that this is correct in all cases. */ - if (partial == 0) - arg->value = arg->stack_slot; - /* Once we have pushed something, pops can't safely be deferred during the rest of the arguments. */ NO_DEFER_POP;