diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3fccc8f3c21e8d6fa64536201412c6694f0bb364..3dc9e8f66038ffc7fd376ac3641045ee8d1e3c56 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 91b2ec5c0a41ba43534d4d6d8c7c5c5e88c9d00e..d9e4e7f18dbf845b930ad3f1bcdc179bb1d6270a 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 9c7fff97cea8e520da2154f2c7f6558a1bd33fd6..c00ad54cf05cdf9d6cbdf6029af2f5f1e74d5004 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);