diff options
author | Richard Henderson <rth@redhat.com> | 2004-07-13 01:43:41 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2004-07-13 01:43:41 -0700 |
commit | af064de51e5c824f1afb56bbc5bbf4b138c4e483 (patch) | |
tree | d9a896211b7b86323ca0988aebcee6681c40a375 /gcc/builtins.c | |
parent | 0976078c73f58e7350fcc0516618fdd7737c9696 (diff) | |
download | gcc-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.c | 20 |
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 |