rs6000.h (PAD_VARARGS_DOWN): Define.
* config/rs6000/rs6000.h (PAD_VARARGS_DOWN): Define. * config/rs6000/rs6000.c (rs6000_va_arg): Use std_expand_builtin_va_arg if not ABI_V4. From-SVN: r50739
This commit is contained in:
parent
9a789d73d1
commit
2a55fd4253
3 changed files with 15 additions and 43 deletions
|
@ -1,3 +1,9 @@
|
|||
2002-03-13 David Edelsohn <edelsohn@gnu.org>
|
||||
|
||||
* config/rs6000/rs6000.h (PAD_VARARGS_DOWN): Define.
|
||||
* config/rs6000/rs6000.c (rs6000_va_arg): Use
|
||||
std_expand_builtin_va_arg if not ABI_V4.
|
||||
|
||||
2002-03-13 Jason Merrill <jason@redhat.com>
|
||||
|
||||
* varasm.c (globalize_decl): New fn.
|
||||
|
|
|
@ -2903,8 +2903,6 @@ setup_incoming_varargs (cum, mode, type, pretend_size, no_rtl)
|
|||
if (DEFAULT_ABI == ABI_V4)
|
||||
{
|
||||
/* Indicate to allocate space on the stack for varargs save area. */
|
||||
/* ??? Does this really have to be located at a magic spot on the
|
||||
stack, or can we allocate this with assign_stack_local instead. */
|
||||
cfun->machine->sysv_varargs_p = 1;
|
||||
if (! no_rtl)
|
||||
save_area = plus_constant (virtual_stack_vars_rtx,
|
||||
|
@ -3096,48 +3094,8 @@ rs6000_va_arg (valist, type)
|
|||
int indirect_p, size, rsize, n_reg, sav_ofs, sav_scale;
|
||||
rtx lab_false, lab_over, addr_rtx, r;
|
||||
|
||||
/* For AIX, the rule is that structures are passed left-aligned in
|
||||
their stack slot. However, GCC does not presently do this:
|
||||
structures which are the same size as integer types are passed
|
||||
right-aligned, as if they were in fact integers. This only
|
||||
matters for structures of size 1 or 2, or 4 when TARGET_64BIT. */
|
||||
if (DEFAULT_ABI != ABI_V4)
|
||||
{
|
||||
HOST_WIDE_INT align, rounded_size;
|
||||
enum machine_mode mode;
|
||||
tree addr_tree;
|
||||
|
||||
/* Compute the rounded size of the type. */
|
||||
align = PARM_BOUNDARY / BITS_PER_UNIT;
|
||||
rounded_size = (((int_size_in_bytes (type) + align - 1) / align)
|
||||
* align);
|
||||
|
||||
addr_tree = valist;
|
||||
|
||||
mode = TYPE_MODE (type);
|
||||
if (mode != BLKmode)
|
||||
{
|
||||
HOST_WIDE_INT adj;
|
||||
adj = TREE_INT_CST_LOW (TYPE_SIZE (type)) / BITS_PER_UNIT;
|
||||
if (rounded_size > align)
|
||||
adj = rounded_size;
|
||||
|
||||
addr_tree = build (PLUS_EXPR, TREE_TYPE (addr_tree), addr_tree,
|
||||
build_int_2 (rounded_size - adj, 0));
|
||||
}
|
||||
|
||||
addr_rtx = expand_expr (addr_tree, NULL_RTX, Pmode, EXPAND_NORMAL);
|
||||
addr_rtx = copy_to_reg (addr_rtx);
|
||||
|
||||
/* Compute new value for AP. */
|
||||
t = build (MODIFY_EXPR, TREE_TYPE (valist), valist,
|
||||
build (PLUS_EXPR, TREE_TYPE (valist), valist,
|
||||
build_int_2 (rounded_size, 0)));
|
||||
TREE_SIDE_EFFECTS (t) = 1;
|
||||
expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL);
|
||||
|
||||
return addr_rtx;
|
||||
}
|
||||
return std_expand_builtin_va_arg (valist, type);
|
||||
|
||||
f_gpr = TYPE_FIELDS (TREE_TYPE (va_list_type_node));
|
||||
f_fpr = TREE_CHAIN (f_gpr);
|
||||
|
|
|
@ -1697,6 +1697,14 @@ typedef struct rs6000_args
|
|||
#define EXPAND_BUILTIN_VA_ARG(valist, type) \
|
||||
rs6000_va_arg (valist, type)
|
||||
|
||||
/* For AIX, the rule is that structures are passed left-aligned in
|
||||
their stack slot. However, GCC does not presently do this:
|
||||
structures which are the same size as integer types are passed
|
||||
right-aligned, as if they were in fact integers. This only
|
||||
matters for structures of size 1 or 2, or 4 when TARGET_64BIT.
|
||||
ABI_V4 does not use std_expand_builtin_va_arg. */
|
||||
#define PAD_VARARGS_DOWN (TYPE_MODE (type) != BLKmode)
|
||||
|
||||
/* Define this macro to be a nonzero value if the location where a function
|
||||
argument is passed depends on whether or not it is a named argument. */
|
||||
#define STRICT_ARGUMENT_NAMING 1
|
||||
|
|
Loading…
Add table
Reference in a new issue