From ff1c393bd32f3b018957ba9f552e344ab040f309 Mon Sep 17 00:00:00 2001
From: Kai Tietz <kai.tietz@onevision.com>
Date: Sat, 28 Jun 2008 12:41:38 +0000
Subject: [PATCH] tree.c (build_varargs_function_type_list): New.

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.

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 3fccc8f3c21e..3dc9e8f66038 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 91b2ec5c0a41..d9e4e7f18dbf 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 9c7fff97cea8..c00ad54cf05c 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);
-- 
GitLab