summaryrefslogtreecommitdiff
path: root/gcc/function.c
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2004-09-29 09:47:56 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2004-09-29 09:47:56 +0000
commit5f97fb2262e60349d86d272652d046bb6b176f52 (patch)
tree2f5e57535f35e97c09560fb2d4e01fcb060d2ad1 /gcc/function.c
parentffe867405eccabe9847834822b275b367acf78ff (diff)
downloadgcc-5f97fb2262e60349d86d272652d046bb6b176f52.tar.gz
* tree.h (enum tree_index): Add TI_VA_LIST_GPR_COUNTER_FIELD
and TI_VA_LIST_FPR_COUNTER_FIELD. (va_list_gpr_counter_field, va_list_fpr_counter_field): Define. * tree-pass.h (pass_stdarg): Add. * tree-optimize.c (init_tree_optimization_passes): Add pass_stdarg. * tree-stdarg.c: New file. * Makefile.in (OBJS-common): Add tree-stdarg.o. (tree-stdarg.o): Add dependencies. * function.h (struct function): Add va_list_gpr_size and va_list_fpr_size fields. * function.c (allocate_struct_function): Initialize them. * config/i386/i386.c (ix86_build_builtin_va_list): Initialize va_list_{g,f}pr_counter_field. (ix86_setup_incoming_varargs): Don't do anything if reg_save area will not be used. Only save registers that tree-stdarg.c detected they need saving. (ix86_va_start): Don't set up fields that won't be used. * config/rs6000/rs6000.c (rs6000_build_builtin_va_list): Initialize va_list_{g,f}pr_counter_field. (setup_incoming_varargs): Don't do anything if reg_save area will not be used. Only save registers that tree-stdarg.c detected they need saving. (rs6000_va_start): Don't set up fields that won't be used. * gcc.c-torture/execute/stdarg-1.c: New test. * gcc.c-torture/execute/stdarg-2.c: New test. * gcc.c-torture/execute/stdarg-3.c: New test. * gcc.dg/tree-ssa/stdarg-1.c: New test. * gcc.dg/tree-ssa/stdarg-2.c: New test. * gcc.dg/tree-ssa/stdarg-3.c: New test. * gcc.dg/tree-ssa/stdarg-4.c: New test. * gcc.dg/tree-ssa/stdarg-5.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@88279 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/function.c')
-rw-r--r--gcc/function.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/gcc/function.c b/gcc/function.c
index 0545b05a5cd..611589d7ae8 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -3798,6 +3798,10 @@ allocate_struct_function (tree fndecl)
&& TYPE_ARG_TYPES (fntype) != 0
&& (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
!= void_type_node));
+
+ /* Assume all registers in stdarg functions need to be saved. */
+ cfun->va_list_gpr_size = VA_LIST_MAX_GPR_SIZE;
+ cfun->va_list_fpr_size = VA_LIST_MAX_FPR_SIZE;
}
/* Reset cfun, and other non-struct-function variables to defaults as