From ff1c393bd32f3b018957ba9f552e344ab040f309 Mon Sep 17 00:00:00 2001 From: Kai Tietz Date: Sat, 28 Jun 2008 12:41:38 +0000 Subject: [PATCH] tree.c (build_varargs_function_type_list): New. 2008-06-28 Kai Tietz * tree.c (build_varargs_function_type_list): New. (build_function_type_list_1): New. (build_function_type_list): Use build_function_type_list_1. * tree.h (build_varargs_function_type_list): New. From-SVN: r137221 --- gcc/ChangeLog | 7 ++++++ gcc/tree.c | 59 +++++++++++++++++++++++++++++++++++++++++---------- gcc/tree.h | 1 + 3 files changed, 56 insertions(+), 11 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3fccc8f3c21..3dc9e8f6603 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2008-06-28 Kai Tietz + + * tree.c (build_varargs_function_type_list): New. + (build_function_type_list_1): New. + (build_function_type_list): Use build_function_type_list_1. + * tree.h (build_varargs_function_type_list): New. + 2008-06-28 Ulrich Weigand PR target/34856 diff --git a/gcc/tree.c b/gcc/tree.c index 91b2ec5c0a4..d9e4e7f18db 100644 --- a/gcc/tree.c +++ b/gcc/tree.c @@ -5862,23 +5862,26 @@ build_function_type (tree value_type, tree arg_types) } /* Build a function type. The RETURN_TYPE is the type returned by the - function. If additional arguments are provided, they are - additional argument types. The list of argument types must always - be terminated by NULL_TREE. */ + function. If VAARGS is set, no void_type_node is appended to the + the list. ARGP muse be alway be terminated be a NULL_TREE. */ -tree -build_function_type_list (tree return_type, ...) +static tree +build_function_type_list_1 (bool vaargs, tree return_type, va_list argp) { tree t, args, last; - va_list p; - - va_start (p, return_type); - t = va_arg (p, tree); - for (args = NULL_TREE; t != NULL_TREE; t = va_arg (p, tree)) + t = va_arg (argp, tree); + for (args = NULL_TREE; t != NULL_TREE; t = va_arg (argp, tree)) args = tree_cons (NULL_TREE, t, args); - if (args == NULL_TREE) + if (vaargs) + { + last = args; + if (args != NULL_TREE) + args = nreverse (args); + gcc_assert (args != NULL_TREE && last != void_list_node); + } + else if (args == NULL_TREE) args = void_list_node; else { @@ -5888,7 +5891,41 @@ build_function_type_list (tree return_type, ...) } args = build_function_type (return_type, args); + return args; +} + +/* Build a function type. The RETURN_TYPE is the type returned by the + function. If additional arguments are provided, they are + additional argument types. The list of argument types must always + be terminated by NULL_TREE. */ + +tree +build_function_type_list (tree return_type, ...) +{ + tree args; + va_list p; + + va_start (p, return_type); + args = build_function_type_list_1 (false, return_type, p); + va_end (p); + return args; +} + +/* Build a variable argument function type. The RETURN_TYPE is the + type returned by the function. If additional arguments are provided, + they are additional argument types. The list of argument types must + always be terminated by NULL_TREE. */ + +tree +build_varargs_function_type_list (tree return_type, ...) +{ + tree args; + va_list p; + + va_start (p, return_type); + args = build_function_type_list_1 (true, return_type, p); va_end (p); + return args; } diff --git a/gcc/tree.h b/gcc/tree.h index 9c7fff97cea..c00ad54cf05 100644 --- a/gcc/tree.h +++ b/gcc/tree.h @@ -4084,6 +4084,7 @@ extern tree build_index_2_type (tree, tree); extern tree build_array_type (tree, tree); extern tree build_function_type (tree, tree); extern tree build_function_type_list (tree, ...); +extern tree build_varargs_function_type_list (tree, ...); extern tree build_method_type_directly (tree, tree, tree); extern tree build_method_type (tree, tree); extern tree build_offset_type (tree, tree); -- 2.30.2