From 8e5fe23fb3a2296d7834907a59a5663baa2b9078 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Tue, 26 Mar 2002 01:07:10 -0800 Subject: [PATCH] alpha.c (alpha_va_arg): Read MUST_PASS_IN_STACK types from the normal argument frame. * config/alpha/alpha.c (alpha_va_arg): Read MUST_PASS_IN_STACK types from the normal argument frame. From-SVN: r51380 --- gcc/ChangeLog | 6 ++++++ gcc/config/alpha/alpha.c | 11 +++++++++++ 2 files changed, 17 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 89dc4be2cf6b..15820dbe1d8f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2002-03-26 Richard Henderson + * expr.h (ADD_PARM_SIZE): Cast INC to ssizetype. + (SUB_PARM_SIZE): Cast DEC to ssizetype. + + * config/alpha/alpha.c (alpha_va_arg): Read MUST_PASS_IN_STACK + types from the normal argument frame. + * config/sparc/sparc.c (function_arg_pass_by_reference): Pass variable sized objects by reference. (sparc_va_arg): Receive them by reference too. diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c index 08f4568afcc9..60334790bc47 100644 --- a/gcc/config/alpha/alpha.c +++ b/gcc/config/alpha/alpha.c @@ -5812,6 +5812,17 @@ alpha_va_arg (valist, type) offset_field = build (COMPONENT_REF, TREE_TYPE (offset_field), valist, offset_field); + /* If the type could not be passed in registers, skip the block + reserved for the registers. */ + if (MUST_PASS_IN_STACK (TYPE_MODE (type), type)) + { + t = build (MODIFY_EXPR, TREE_TYPE (offset_field), offset_field, + build (MAX_EXPR, TREE_TYPE (offset_field), + offset_field, build_int_2 (6*8, 0))); + TREE_SIDE_EFFECTS (t) = 1; + expand_expr (t, const0_rtx, VOIDmode, EXPAND_NORMAL); + } + wide_type = make_signed_type (64); wide_ofs = save_expr (build1 (CONVERT_EXPR, wide_type, offset_field)); -- 2.43.5