aboutsummaryrefslogtreecommitdiff
path: root/gcc/builtins.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2004-07-13 01:43:41 -0700
committerRichard Henderson <rth@gcc.gnu.org>2004-07-13 01:43:41 -0700
commitaf064de51e5c824f1afb56bbc5bbf4b138c4e483 (patch)
treed9a896211b7b86323ca0988aebcee6681c40a375 /gcc/builtins.c
parent0976078c73f58e7350fcc0516618fdd7737c9696 (diff)
downloadgcc-af064de51e5c824f1afb56bbc5bbf4b138c4e483.zip
gcc-af064de51e5c824f1afb56bbc5bbf4b138c4e483.tar.gz
gcc-af064de51e5c824f1afb56bbc5bbf4b138c4e483.tar.bz2
builtins.c (std_gimplify_va_arg_expr): Handle types passed by reference.
* builtins.c (std_gimplify_va_arg_expr): Handle types passed by reference. (ind_gimplify_va_arg_expr): Remove. * tree.h (ind_gimplify_va_arg_expr): Remove. * config/pa/pa.c (hppa_gimplify_va_arg_expr): Don't use it. * config/mmix/mmix.c (mmix_function_arg_pass_by_reference): Allow argsp to be null. * config/arc/arc.c (arc_gimplify_va_arg_expr): Remove. (TARGET_GIMPLIFY_VA_ARG_EXPR): Remove. * config/cris/cris.c, config/fr30/fr30.c, config/frv/frv.c, config/iq2000/iq2000.c, config/m32r/m32r.c, config/mmix/mmix.c, config/mn10300/mn10300.c, config/v850/v850.c: Similarly. From-SVN: r84608
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r--gcc/builtins.c20
1 files changed, 9 insertions, 11 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 147cefc..292f50d 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -4477,6 +4477,7 @@ std_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, tree *post_p)
{
tree addr, t, type_size, rounded_size, valist_tmp;
unsigned HOST_WIDE_INT align, boundary;
+ bool indirect;
#ifdef ARGS_GROW_DOWNWARD
/* All of the alignment and movement below is for args-grow-up machines.
@@ -4485,6 +4486,10 @@ std_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, tree *post_p)
abort ();
#endif
+ indirect = pass_by_reference (NULL, TYPE_MODE (type), type, false);
+ if (indirect)
+ type = build_pointer_type (type);
+
align = PARM_BOUNDARY / BITS_PER_UNIT;
boundary = FUNCTION_ARG_BOUNDARY (TYPE_MODE (type), type) / BITS_PER_UNIT;
@@ -4532,18 +4537,11 @@ std_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, tree *post_p)
gimplify_and_add (t, pre_p);
addr = fold_convert (build_pointer_type (type), addr);
- return build_fold_indirect_ref (addr);
-}
-/* Like std_gimplify_va_arg_expr, but uses pass-by-reference. */
-
-tree
-ind_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p, tree *post_p)
-{
- tree t;
- t = build_pointer_type (type);
- t = std_gimplify_va_arg_expr (valist, t, pre_p, post_p);
- return build_fold_indirect_ref (t);
+ if (indirect)
+ addr = build_fold_indirect_ref (addr);
+
+ return build_fold_indirect_ref (addr);
}
/* Return a dummy expression of type TYPE in order to keep going after an