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:
David Edelsohn 2002-03-13 16:57:48 +00:00 committed by David Edelsohn
parent 9a789d73d1
commit 2a55fd4253
3 changed files with 15 additions and 43 deletions

View File

@ -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.

View File

@ -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);

View File

@ -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