summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/tree.c59
-rw-r--r--gcc/tree.h1
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 <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.
+
2008-06-28 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
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);