diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 1999-07-27 05:43:56 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 1999-07-27 05:43:56 +0000 |
commit | 8a15c04a6720fb7683029d26e0501f4d77315a99 (patch) | |
tree | b886fd4e7664e9eaa8f09a635e4f5c662edec2c4 /gcc/builtins.c | |
parent | 5cbc1de902c70b0ce32a5fc8316e8f045dcf48f7 (diff) | |
download | gcc-8a15c04a6720fb7683029d26e0501f4d77315a99.tar.gz |
* builtins.c (stabilize_va_list): Don't INDIRECT_REF through
an ARRAY_TYPE.
(std_expand_builtin_va_start): Back out one word if !stdarg_p.
(expand_builtin_va_end): Evaluate arg for side effects.
* c-common.c (c_common_nodes_and_builtins): Construct a
va_list_arg_type_node to handle array decomposition to pointer.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@28283 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index 6d622ff2d17..20c8f1c0ed7 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -1840,13 +1840,17 @@ stabilize_va_list (valist, was_ptr) if (is_array && TREE_CODE (valist) == ADDR_EXPR && TREE_CODE (TREE_TYPE (TREE_OPERAND (valist, 0))) == POINTER_TYPE) - valist = TREE_OPERAND (valist, 0); - - if (TREE_SIDE_EFFECTS (valist)) - valist = save_expr (valist); - - if (! is_array) - valist = fold (build1 (INDIRECT_REF, va_list_type_node, valist)); + { + valist = TREE_OPERAND (valist, 0); + if (TREE_SIDE_EFFECTS (valist)) + valist = save_expr (valist); + } + else + { + if (TREE_SIDE_EFFECTS (valist)) + valist = save_expr (valist); + valist = fold (build1 (INDIRECT_REF, va_list_type_node, valist)); + } } else if (TREE_SIDE_EFFECTS (valist)) { @@ -1875,6 +1879,9 @@ std_expand_builtin_va_start (stdarg_p, valist, nextarg) { tree t; + if (!stdarg_p) + nextarg = plus_constant (nextarg, -UNITS_PER_WORD); + t = build (MODIFY_EXPR, TREE_TYPE (valist), valist, make_tree (ptr_type_node, nextarg)); TREE_SIDE_EFFECTS (t) = 1; @@ -2002,12 +2009,18 @@ expand_builtin_va_arg (valist, type) /* Expand ARGLIST, from a call to __builtin_va_end. */ static rtx expand_builtin_va_end (arglist) - tree arglist ATTRIBUTE_UNUSED; + tree arglist; { + tree valist = TREE_VALUE (arglist); + #ifdef EXPAND_BUILTIN_VA_END - tree valist = TREE_VALUE (arglist, 0); valist = stabilize_va_list (valist, 0); EXPAND_BUILTIN_VA_END(arglist); +#else + /* Evaluate for side effects, if needed. I hate macros that don't + do that. */ + if (TREE_SIDE_EFFECTS (valist)) + expand_expr (valist, const0_rtx, VOIDmode, EXPAND_NORMAL); #endif return const0_rtx; |