From 2a55fd4253835815654c550536b3311046bb2b14 Mon Sep 17 00:00:00 2001 From: David Edelsohn Date: Wed, 13 Mar 2002 16:57:48 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/config/rs6000/rs6000.c | 44 +------------------------------------- gcc/config/rs6000/rs6000.h | 8 +++++++ 3 files changed, 15 insertions(+), 43 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2ee542cae722..a9bbb13a4018 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2002-03-13 David Edelsohn + + * 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 * varasm.c (globalize_decl): New fn. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index d2046a168450..8ad9fa52e419 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -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); diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index a103102d006d..ed8f0fb9d8f8 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -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 -- 2.43.5