Index: gcc/cp/mangle.c
===================================================================
--- gcc/cp/mangle.c.orig	2010-02-15 15:27:56.000000000 +0100
+++ gcc/cp/mangle.c	2010-02-15 15:27:56.000000000 +0100
@@ -1787,9 +1787,9 @@ write_builtin_type (tree type)
       if (type == wchar_type_node)
 	write_char ('w');
       else if (type == char16_type_node)
-	write_string ("u8char16_t");
+	write_string ("Ds");
       else if (type == char32_type_node)
-	write_string ("u8char32_t");
+	write_string ("Di");
       else if (TYPE_FOR_JAVA (type))
 	write_java_integer_type_codes (type);
       else
Index: libiberty/testsuite/demangle-expected
===================================================================
--- libiberty/testsuite/demangle-expected.orig	2010-02-15 15:27:56.000000000 +0100
+++ libiberty/testsuite/demangle-expected	2010-02-15 15:27:56.000000000 +0100
@@ -3397,26 +3397,10 @@ f
 _Z3fooc
 foo(char)
 foo
-#
---format=gnu-v3 --no-params
-_Z2f0u8char16_t
-f0(char16_t)
-f0
-#
---format=gnu-v3 --no-params
-_Z2f0Pu8char16_t
-f0(char16_t*)
-f0
-#
---format=gnu-v3 --no-params
-_Z2f0u8char32_t
-f0(char32_t)
-f0
-#
---format=gnu-v3 --no-params
-_Z2f0Pu8char32_t
-f0(char32_t*)
-f0
+# new (2008) built in types test
+--format=gnu-v3
+_Z1fDsDi
+f(char16_t, char32_t)
 #
 --format=gnu-v3 --no-params
 2CBIL_Z3foocEE
Index: libstdc++-v3/config/abi/pre/gnu.ver
===================================================================
--- libstdc++-v3/config/abi/pre/gnu.ver.orig	2010-02-15 15:27:56.000000000 +0100
+++ libstdc++-v3/config/abi/pre/gnu.ver	2010-02-15 15:27:56.000000000 +0100
@@ -913,11 +913,11 @@ CXXABI_1.3.2 {
 CXXABI_1.3.3 {
 
     # typeinfo for char16_t and char32_t
-    _ZTIu8char16_t;
-    _ZTIPu8char16_t;
-    _ZTIPKu8char16_t;
-    _ZTIu8char32_t;
-    _ZTIPu8char32_t;
-    _ZTIPKu8char32_t;
+    _ZTIDs;
+    _ZTIPDs;
+    _ZTIPKDs;
+    _ZTIDi;
+    _ZTIPDi;
+    _ZTIPKDi;
 
 } CXXABI_1.3.2;
Index: gcc/testsuite/g++.dg/ext/utf-mangle.C
===================================================================
--- gcc/testsuite/g++.dg/ext/utf-mangle.C.orig	2010-02-15 15:27:56.000000000 +0100
+++ gcc/testsuite/g++.dg/ext/utf-mangle.C	2010-02-15 15:27:56.000000000 +0100
@@ -8,7 +8,7 @@ void f1 (char32_t c) {}
 void f2 (char16_t *s) {}
 void f3 (char32_t *s) {}
 
-// { dg-final { scan-assembler "_Z2f0u8char16_t:" } }
-// { dg-final { scan-assembler "_Z2f1u8char32_t:" } }
-// { dg-final { scan-assembler "_Z2f2Pu8char16_t:" } }
-// { dg-final { scan-assembler "_Z2f3Pu8char32_t:" } }
+// { dg-final { scan-assembler "_Z2f0Ds:" } }
+// { dg-final { scan-assembler "_Z2f1Di:" } }
+// { dg-final { scan-assembler "_Z2f2PDs:" } }
+// { dg-final { scan-assembler "_Z2f3PDi:" } }
Index: gcc/ginclude/uchar.h
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ gcc/ginclude/uchar.h	2010-02-15 15:27:56.000000000 +0100
@@ -0,0 +1,38 @@
+/* Copyright (C) 2008 Free Software Foundation, Inc.
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GCC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING.  If not, write to
+the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+Boston, MA 02110-1301, USA.  */
+
+/* As a special exception, if you include this header file into source
+   files compiled by GCC, this header file does not by itself cause
+   the resulting executable to be covered by the GNU General Public
+   License.  This exception does not however invalidate any other
+   reasons why the executable file might be covered by the GNU General
+   Public License.  */
+
+/*
+ * template header so that char16_t and char32_t are available
+ * in C (not only in C++).  This is not a full implementation of <uchar.h>
+ */
+
+#ifndef _UCHAR_H___
+#define _UCHAR_H___
+#ifndef __cplusplus
+typedef __CHAR16_TYPE__ char16_t;
+typedef __CHAR32_TYPE__ char32_t;
+#endif
+#endif
Index: gcc/Makefile.in
===================================================================
--- gcc/Makefile.in.orig	2010-02-15 15:27:56.000000000 +0100
+++ gcc/Makefile.in	2010-02-15 15:27:56.000000000 +0100
@@ -307,6 +307,7 @@ USER_H = $(srcdir)/ginclude/float.h \
 	 $(srcdir)/ginclude/stddef.h \
 	 $(srcdir)/ginclude/varargs.h \
 	 $(srcdir)/ginclude/stdfix.h \
+	 $(srcdir)/ginclude/uchar.h \
 	 $(EXTRA_HEADERS)
 
 UNWIND_H = $(srcdir)/unwind-generic.h
Index: libiberty/cp-demangle.c
===================================================================
--- libiberty/cp-demangle.c.orig	2008-02-19 10:56:55.000000000 +0100
+++ libiberty/cp-demangle.c	2010-02-15 16:01:03.000000000 +0100
@@ -1882,6 +1882,12 @@ cplus_demangle_builtin_types[D_BUILTIN_T
   /* y */ { NL ("unsigned long long"), NL ("unsigned long long"),
 	    D_PRINT_UNSIGNED_LONG_LONG },
   /* z */ { NL ("..."),		NL ("..."),		D_PRINT_DEFAULT },
+  /* 26 */ { NL ("decimal32"),	NL ("decimal32"),       D_PRINT_DEFAULT },
+  /* 27 */ { NL ("decimal64"),	NL ("decimal64"),       D_PRINT_DEFAULT },
+  /* 28 */ { NL ("decimal128"),	NL ("decimal128"),      D_PRINT_DEFAULT },
+  /* 29 */ { NL ("half"),	NL ("half"),            D_PRINT_FLOAT },
+  /* 30 */ { NL ("char16_t"),	NL ("char16_t"),        D_PRINT_DEFAULT },
+  /* 31 */ { NL ("char32_t"),	NL ("char32_t"),        D_PRINT_DEFAULT },
 };
 
 CP_STATIC_IF_GLIBCPP_V3
@@ -2045,6 +2051,28 @@ cplus_demangle_type (struct d_info *di)
 			 cplus_demangle_type (di), ret);
       break;
 
+    case 'D':
+      can_subst = 0;
+      d_advance (di, 1);
+      peek = d_next_char (di);
+      switch (peek)
+	{
+	case 's':
+	  /* char16_t */
+	  ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[30]);
+	  di->expansion += ret->u.s_builtin.type->len;
+	  break;
+	case 'i':
+	  /* char32_t */
+	  ret = d_make_builtin_type (di, &cplus_demangle_builtin_types[31]);
+	  di->expansion += ret->u.s_builtin.type->len;
+	  break;
+
+	default:
+	  return NULL;
+	}
+      break;
+
     default:
       return NULL;
     }
Index: libiberty/cp-demangle.h
===================================================================
--- libiberty/cp-demangle.h.orig	2008-02-19 10:56:55.000000000 +0100
+++ libiberty/cp-demangle.h	2010-02-15 16:04:17.000000000 +0100
@@ -147,7 +147,7 @@ struct d_info
 extern const struct demangle_operator_info cplus_demangle_operators[];
 #endif
 
-#define D_BUILTIN_TYPE_COUNT (26)
+#define D_BUILTIN_TYPE_COUNT (32)
 
 CP_STATIC_IF_GLIBCPP_V3
 const struct demangle_builtin_type_info
