diff options
author | ktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-06-28 12:41:38 +0000 |
---|---|---|
committer | ktietz <ktietz@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-06-28 12:41:38 +0000 |
commit | 1c73f824d906e8f987c583782b0cd8a254b1579c (patch) | |
tree | 73a050f6f9c39147a8e01cd21051f86e6451b4f0 /gcc/tree.c | |
parent | e442af0bc26d5d91558724f51e8cb86f7918ee9a (diff) | |
download | gcc-1c73f824d906e8f987c583782b0cd8a254b1579c.tar.gz |
2008-06-28 Kai Tietz <kai.tietz@onevision.com>
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@137221 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree.c')
-rw-r--r-- | gcc/tree.c | 59 |
1 files changed, 48 insertions, 11 deletions
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; } |