This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [RFC PATCH] Optionally use -mlong-double-128 by default on {powerpc{,64},s390{,x},sparc,alpha}-linux


On Wed, Feb 01, 2006 at 11:34:18AM -0600, Benjamin Kosnik wrote:
> I like this idea as well: it would remove some of the fragileness
> around the current approach and make the 128 long double uses
> unambiguous.

Here is updated patch against mainline.
Mangling has been changed for powerpc* only so far, I can do the
s390{,x}, sparc32 and alpha part separately.
I have so far verified that for the current 59
nm -D -C libstdc++.so.6 | grep 'long double'
symbols it creates another 59 __float128 ones, all in
GLIBCXX_LDBL_3.4, GLIBCXX_LDBL_3.4.7 and CXXABI_LDBL_3.4 symvers
and that no symbols are lost.  In most files, the assembly magic
is gone, they just have simple aliases.  The big exception is
{,w}locale-inst.cc unfortunately, where for the vtables we want
to have 2 symbols, starting at the same address, one smaller
(compatibility one) and one 4/8 bytes bigger that has the additional
__float128 virtual method at the end.

2006-02-01  Jakub Jelinek  <jakub@redhat.com>

	* config/rs6000/linux.h [TARGET_DEFAULT_LONG_DOUBLE_128]
	(RS6000_DEFAULT_LONG_DOUBLE_SIZE): Define to 128.
	* config/rs6000/linux64.h [TARGET_DEFAULT_LONG_DOUBLE_128]
	(RS6000_DEFAULT_LONG_DOUBLE_SIZE): Define to 128.
	* config/rs6000/rs6000.c (rs6000_mangle_fundamental_type): Mangle
	long double as "g" on linux with -mlong-double-128.
	* configure.ac: Add --with{out}-long-double-128 configure option.
	(TARGET_DEFAULT_LONG_DOUBLE_128): New test.
	* configure: Rebuilt.
	* config.in: Rebuilt.
libstdc++-v3/
	* configure.ac (_GLIBCXX_LONG_DOUBLE_COMPAT): New check.
	If true, set also port_specific_symbol_files and create
	as_symver_specs.
	(SYMVER_CXXFLAGS): New substituted var.
	* configure: Rebuilt.
	* config.h.in: Rebuilt.
	* scripts/as_symver_filter: New file.
	* config/os/gnu-linux/ldbl-extra.ver: New file.
	* src/Makefile.am (libstdc++-symbol.ver): Append instead of
	insert in the middle if port specific symbol file requests it.
	(locale-inst.lo, locale-inst.o, wlocale-inst.lo, wlocale-inst.o):
	New rules.
	* src/Makefile.in: Rebuilt.
	* config/abi/pre/gnu.ver: Make sure no __float128 symbols are
	exported.
	* include/bits/locale_facets.h
	[_GLIBCXX_LONG_DOUBLE_COMPAT] (std::money_get): Add __get and
	__do_get methods.
	[_GLIBCXX_LONG_DOUBLE_COMPAT] (std::money_put): Add __put and
	__do_put methods.
	[_GLIBCXX_LONG_DOUBLE_COMPAT] (std::num_get): Add __get and
	__do_get methods.
	[_GLIBCXX_LONG_DOUBLE_COMPAT] (std::num_put): Add __put and
	__do_put methods.
	* src/complex_io.cc [_GLIBCXX_LONG_DOUBLE_COMPAT]: Add compatibility
	symbols.
	* src/istream-inst.cc [_GLIBCXX_LONG_DOUBLE_COMPAT]: Likewise.
	* src/limits.cc [_GLIBCXX_LONG_DOUBLE_COMPAT]: Likewise.
	* src/locale-inst.cc [_GLIBCXX_LONG_DOUBLE_COMPAT]: Likewise.
	* src/ostream-inst.cc [_GLIBCXX_LONG_DOUBLE_COMPAT]: Likewise.
	* src/wlocale-inst.cc [_GLIBCXX_LONG_DOUBLE_COMPAT]: Likewise.
	* config/locale/generic/c_locale.cc [_GLIBCXX_LONG_DOUBLE_COMPAT]:
	Likewise.
	* config/locale/gnu/c_locale.cc [_GLIBCXX_LONG_DOUBLE_COMPAT]: Likewise.
	* libmath/stubs.c [_GLIBCXX_LONG_DOUBLE_COMPAT]: Likewise.
	* libsupc++/tinfo2.cc [_GLIBCXX_LONG_DOUBLE_COMPAT]: Likewise.

--- gcc/config/rs6000/linux.h.jj	2006-01-26 16:36:57.000000000 +0100
+++ gcc/config/rs6000/linux.h	2006-01-31 14:21:37.000000000 +0100
@@ -120,3 +120,8 @@
 #endif
 
 #define POWERPC_LINUX
+
+/* ppc linux has 128-bit long double support in glibc 2.4 and later.  */
+#ifdef TARGET_DEFAULT_LONG_DOUBLE_128
+#define RS6000_DEFAULT_LONG_DOUBLE_SIZE 128
+#endif
--- gcc/config/rs6000/rs6000.c.jj	2006-01-31 11:20:41.000000000 +0100
+++ gcc/config/rs6000/rs6000.c	2006-02-01 17:16:14.000000000 +0100
@@ -17410,6 +17410,15 @@ rs6000_mangle_fundamental_type (tree typ
   if (type == pixel_type_node) return "u7__pixel";
   if (type == bool_int_type_node) return "U6__booli";
 
+#ifdef POWERPC_LINUX
+  /* On powerpc*-*-linux* where -mlong-double-64 used to be
+     the default, mangle DFmode long double as 'e' and
+     TFmode long double as 'g' (__float128 in Itanium ABI).  */
+  if (TYPE_MAIN_VARIANT (type) == long_double_type_node
+      && TARGET_LONG_DOUBLE_128)
+    return "g";
+#endif
+
   /* For all other types, use normal C++ mangling.  */
   return NULL;
 }
--- gcc/config/rs6000/linux64.h.jj	2006-01-26 16:36:57.000000000 +0100
+++ gcc/config/rs6000/linux64.h	2006-01-31 14:21:51.000000000 +0100
@@ -569,3 +569,8 @@ while (0)
 #endif
 
 #define POWERPC_LINUX
+
+/* ppc{32,64} linux has 128-bit long double support in glibc 2.4 and later.  */
+#ifdef TARGET_DEFAULT_LONG_DOUBLE_128
+#define RS6000_DEFAULT_LONG_DOUBLE_SIZE 128
+#endif
--- gcc/configure.ac.jj	2006-01-31 11:20:41.000000000 +0100
+++ gcc/configure.ac	2006-01-31 14:20:26.000000000 +0100
@@ -3197,6 +3197,39 @@ if test x$gcc_cv_libc_provides_ssp = xye
 	    [Define if your target C library provides stack protector support])
 fi
 
+# Check if TFmode long double should be used by default or not.
+# Some glibc targets used DFmode long double, but with glibc 2.4
+# and later they can use TFmode.
+case "$target" in
+  powerpc*-*-*gnu* | \
+  sparc*-*-linux* | \
+  s390*-*-linux* | \
+  alpha*-*-linux*)
+    AC_ARG_WITH(long-double-128,
+[  --with-long-double-128  Use 128-bit long double by default.],
+      gcc_cv_target_ldbl128="$with_long_double_128",
+      [gcc_cv_target_ldbl128=no
+      if test x$host != x$target || test "x$TARGET_SYSTEM_ROOT" != x; then
+	if test "x$with_sysroot" = x; then
+	  glibc_header_dir="${exec_prefix}/${target_noncanonical}/sys-include"
+	elif test "x$with_sysroot" = xyes; then
+	  glibc_header_dir="${exec_prefix}/${target_noncanonical}/sys-root/usr/include"
+	else
+	  glibc_header_dir="${with_sysroot}/usr/include"
+	fi
+      else
+	glibc_header_dir=/usr/include
+      fi
+      grep '^[ 	]*#[ 	]*define[ 	][ 	]*__LONG_DOUBLE_MATH_OPTIONAL' \
+        $glibc_header_dir/bits/wordsize.h > /dev/null 2>&1 \
+      && gcc_cv_target_ldbl128=yes])
+    ;;
+esac
+if test x$gcc_cv_target_ldbl128 = xyes; then
+  AC_DEFINE(TARGET_DEFAULT_LONG_DOUBLE_128, 1,
+	    [Define if TFmode long double should be the default])
+fi
+
 # Find out what GC implementation we want, or may, use.
 AC_ARG_WITH(gc,
 [  --with-gc={page,zone}   choose the garbage collection mechanism to use
--- gcc/configure.jj	2006-01-31 11:20:41.000000000 +0100
+++ gcc/configure	2006-01-31 14:21:03.000000000 +0100
@@ -932,6 +932,7 @@ Optional Packages:
   --with-libiconv-prefix[=DIR]  search for libiconv in DIR/include and DIR/lib
   --without-libiconv-prefix     don't search for libiconv in includedir and libdir
   --with-system-libunwind use installed libunwind
+  --with-long-double-128  Use 128-bit long double by default.
   --with-gc={page,zone}   choose the garbage collection mechanism to use
                           with the compiler
   --with-system-zlib      use installed libz
@@ -7642,7 +7643,7 @@ if test "${gcc_cv_prog_makeinfo_modern+s
 else
     ac_prog_version=`$MAKEINFO --version 2>&1 |
                    sed -n 's/^.*GNU texinfo.* \([0-9][0-9.]*\).*$/\1/p'`
-  echo "configure:7645: version of makeinfo is $ac_prog_version" >&5
+  echo "configure:7646: version of makeinfo is $ac_prog_version" >&5
   case $ac_prog_version in
     '')     gcc_cv_prog_makeinfo_modern=no;;
     4.[4-9]*)
@@ -15693,6 +15694,46 @@ _ACEOF
 
 fi
 
+# Check if TFmode long double should be used by default or not.
+# Some glibc targets used DFmode long double, but with glibc 2.4
+# and later they can use TFmode.
+case "$target" in
+  powerpc*-*-*gnu* | \
+  sparc*-*-linux* | \
+  s390*-*-linux* | \
+  alpha*-*-linux*)
+
+# Check whether --with-long-double-128 or --without-long-double-128 was given.
+if test "${with_long_double_128+set}" = set; then
+  withval="$with_long_double_128"
+  gcc_cv_target_ldbl128="$with_long_double_128"
+else
+  gcc_cv_target_ldbl128=no
+      if test x$host != x$target || test "x$TARGET_SYSTEM_ROOT" != x; then
+	if test "x$with_sysroot" = x; then
+	  glibc_header_dir="${exec_prefix}/${target_noncanonical}/sys-include"
+	elif test "x$with_sysroot" = xyes; then
+	  glibc_header_dir="${exec_prefix}/${target_noncanonical}/sys-root/usr/include"
+	else
+	  glibc_header_dir="${with_sysroot}/usr/include"
+	fi
+      else
+	glibc_header_dir=/usr/include
+      fi
+      grep '^ 	*#[ 	]*define[ 	][ 	]*__LONG_DOUBLE_MATH_OPTIONAL' \
+        $glibc_header_dir/bits/wordsize.h > /dev/null 2>&1 \
+      && gcc_cv_target_ldbl128=yes
+fi;
+    ;;
+esac
+if test x$gcc_cv_target_ldbl128 = xyes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define TARGET_DEFAULT_LONG_DOUBLE_128 1
+_ACEOF
+
+fi
+
 # Find out what GC implementation we want, or may, use.
 
 # Check whether --with-gc or --without-gc was given.
--- gcc/config.in.jj	2005-12-27 17:31:45.000000000 +0100
+++ gcc/config.in	2006-01-31 14:20:26.000000000 +0100
@@ -1283,6 +1283,12 @@
 #endif
 
 
+/* Define if TFmode long double should be the default */
+#ifndef USED_FOR_TARGET
+#undef TARGET_DEFAULT_LONG_DOUBLE_128
+#endif
+
+
 /* Define if your target C library provides stack protector support */
 #ifndef USED_FOR_TARGET
 #undef TARGET_LIBC_PROVIDES_SSP
--- libstdc++-v3/libmath/stubs.c.jj	2005-11-12 18:07:17.000000000 +0100
+++ libstdc++-v3/libmath/stubs.c	2006-01-31 14:20:26.000000000 +0100
@@ -453,3 +453,87 @@ tanhl(long double x)
   return tanh((double) x);
 }
 #endif
+
+#if defined(_GLIBCXX_SYMVER) && defined(PIC) \
+    && defined(_GLIBCXX_LONG_DOUBLE_COMPAT)
+
+#define _GLIBCXX_MATHL_WRAPPER0(name, argdecl, args) \
+double								\
+__ ## name ## l_wrapper argdecl					\
+{								\
+  return name args;						\
+}								\
+asm (".symver __ " #name "l_wrapper, " #name "l@GLIBCXX_3.4")
+#define _GLIBCXX_MATHL_WRAPPER(name) \
+  _GLIBCXX_MATHL_WRAPPER0 (name, (double x), (x))
+#define _GLIBCXX_MATHL_WRAPPER2(name) \
+  _GLIBCXX_MATHL_WRAPPER0 (name, (double x, double y), (x, y))
+
+#ifdef HAVE_ACOSL
+_GLIBCXX_MATHL_WRAPPER (acos);
+#endif
+#ifdef HAVE_ASINL
+_GLIBCXX_MATHL_WRAPPER (asin);
+#endif
+#ifdef HAVE_ATAN2L
+_GLIBCXX_MATHL_WRAPPER2 (atan2);
+#endif
+#ifdef HAVE_ATANL
+_GLIBCXX_MATHL_WRAPPER (atan);
+#endif
+#ifdef HAVE_CEILL
+_GLIBCXX_MATHL_WRAPPER (ceil);
+#endif
+#ifdef HAVE_COSHL
+_GLIBCXX_MATHL_WRAPPER (cosh);
+#endif
+#ifdef HAVE_COSL
+_GLIBCXX_MATHL_WRAPPER (cos);
+#endif
+#ifdef HAVE_EXPL
+_GLIBCXX_MATHL_WRAPPER (exp);
+#endif
+#ifdef HAVE_FLOORL
+_GLIBCXX_MATHL_WRAPPER (floor);
+#endif
+#ifdef HAVE_FMODL
+_GLIBCXX_MATHL_WRAPPER2 (fmod);
+#endif
+#ifdef HAVE_FREXPL
+_GLIBCXX_MATHL_WRAPPER0 (frexp, (double x, int *y), (x, y));
+#endif
+#ifdef HAVE_HYPOTL
+_GLIBCXX_MATHL_WRAPPER (hypot);
+#endif
+#ifdef HAVE_LDEXPL
+_GLIBCXX_MATHL_WRAPPER0 (ldexp, (double x, int y), (x, y));
+#endif
+#ifdef HAVE_LOG10L
+_GLIBCXX_MATHL_WRAPPER (log10);
+#endif
+#ifdef HAVE_LOGL
+_GLIBCXX_MATHL_WRAPPER (log);
+#endif
+#ifdef HAVE_MODL
+_GLIBCXX_MATHL_WRAPPER0 (mod, (double x, double *y), (x, y));
+#endif
+#ifdef HAVE_POWL
+_GLIBCXX_MATHL_WRAPPER2 (pow);
+#endif
+#ifdef HAVE_SINHL
+_GLIBCXX_MATHL_WRAPPER (sinh);
+#endif
+#ifdef HAVE_SINL
+_GLIBCXX_MATHL_WRAPPER (sin);
+#endif
+#ifdef HAVE_SQRTL
+_GLIBCXX_MATHL_WRAPPER (sqrt);
+#endif
+#ifdef HAVE_TANHL
+_GLIBCXX_MATHL_WRAPPER (tanh);
+#endif
+#ifdef HAVE_TANL
+_GLIBCXX_MATHL_WRAPPER (tan);
+#endif
+
+#endif // _GLIBCXX_LONG_DOUBLE_COMPAT
--- libstdc++-v3/include/bits/locale_facets.h.jj	2005-12-27 17:31:47.000000000 +0100
+++ libstdc++-v3/include/bits/locale_facets.h	2006-01-31 14:20:26.000000000 +0100
@@ -2111,6 +2111,14 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
 	  ios_base::iostate& __err, void*& __v) const
       { return this->do_get(__in, __end, __io, __err, __v); }
 
+#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
+    private:
+      iter_type
+      __get(iter_type __in, iter_type __end, ios_base& __io,
+	    ios_base::iostate& __err, double& __v) const
+      { return this->__do_get(__in, __end, __io, __err, __v); }
+#endif
+
     protected:
       /// Destructor.
       virtual ~num_get() { }
@@ -2176,13 +2184,25 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
       do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
 	     double&) const;
 
+#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
+      virtual iter_type
+      __do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
+	       double&) const;
+#else
       virtual iter_type
       do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
 	     long double&) const;
+#endif
 
       virtual iter_type
       do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
 	     void*&) const;
+
+#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
+      virtual iter_type
+      do_get(iter_type, iter_type, ios_base&, ios_base::iostate& __err,
+	     long double&) const;
+#endif
       //@}
     };
 
@@ -2375,6 +2395,13 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
 	  const void* __v) const
       { return this->do_put(__s, __f, __fill, __v); }
 
+#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
+    private:
+      iter_type
+      __put(iter_type __s, ios_base& __f, char_type __fill, double __v) const
+      { return this->__do_put(__s, __f, __fill, __v); }
+#endif
+
     protected:
       template<typename _ValueT>
         iter_type
@@ -2438,11 +2465,21 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
       virtual iter_type
       do_put(iter_type, ios_base&, char_type __fill, double __v) const;
 
+#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
+      virtual iter_type
+      __do_put(iter_type, ios_base&, char_type __fill, double __v) const;
+#else
       virtual iter_type
       do_put(iter_type, ios_base&, char_type __fill, long double __v) const;
+#endif
 
       virtual iter_type
       do_put(iter_type, ios_base&, char_type __fill, const void* __v) const;
+
+#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
+      virtual iter_type
+      do_put(iter_type, ios_base&, char_type __fill, long double __v) const;
+#endif
       //@}
     };
 
@@ -4052,6 +4089,14 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
 	  ios_base::iostate& __err, string_type& __digits) const
       { return this->do_get(__s, __end, __intl, __io, __err, __digits); }
 
+#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
+    private:
+      iter_type
+      __get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
+	    ios_base::iostate& __err, double& __units) const
+      { return this->__do_get(__s, __end, __intl, __io, __err, __units); }
+#endif
+
     protected:
       /// Destructor.
       virtual
@@ -4064,9 +4109,15 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
        *  value.  This function is a hook for derived classes to change the
        *  value returned.  @see get() for details.
        */
+#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
+      virtual iter_type
+      __do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
+	       ios_base::iostate& __err, double& __units) const;
+#else
       virtual iter_type
       do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
 	     ios_base::iostate& __err, long double& __units) const;
+#endif
 
       /**
        *  @brief  Read and parse a monetary value.
@@ -4079,6 +4130,12 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
       do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
 	     ios_base::iostate& __err, string_type& __digits) const;
 
+#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
+      virtual iter_type
+      do_get(iter_type __s, iter_type __end, bool __intl, ios_base& __io,
+	     ios_base::iostate& __err, long double& __units) const;
+#endif
+
       template<bool _Intl>
         iter_type
         _M_extract(iter_type __s, iter_type __end, ios_base& __io,
@@ -4168,6 +4225,14 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
 	  char_type __fill, const string_type& __digits) const
       { return this->do_put(__s, __intl, __io, __fill, __digits); }
 
+#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
+    private:
+      iter_type
+      __put(iter_type __s, bool __intl, ios_base& __io,
+	    char_type __fill, double __units) const
+      { return this->__do_put(__s, __intl, __io, __fill, __units); }
+#endif
+
     protected:
       /// Destructor.
       virtual
@@ -4191,9 +4256,15 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
        *  @param  units  Place to store result of parsing.
        *  @return  Iterator after writing.
        */
+#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
+      virtual iter_type
+      __do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
+	       double __units) const;
+#else
       virtual iter_type
       do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
 	     long double __units) const;
+#endif
 
       /**
        *  @brief  Format and output a monetary value.
@@ -4217,6 +4288,12 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
       do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
 	     const string_type& __digits) const;
 
+#if defined _GLIBCXX_LONG_DOUBLE_COMPAT && defined __LONG_DOUBLE_128__
+      virtual iter_type
+      do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
+	     long double __units) const;
+#endif
+
       template<bool _Intl>
         iter_type
         _M_insert(iter_type __s, ios_base& __io, char_type __fill,
--- libstdc++-v3/libsupc++/tinfo2.cc.jj	2005-11-12 18:07:29.000000000 +0100
+++ libstdc++-v3/libsupc++/tinfo2.cc	2006-02-01 17:06:08.000000000 +0100
@@ -165,3 +165,22 @@ __pointer_catch (const __pbase_type_info
 }
 
 } // namespace std
+
+#ifdef _GLIBCXX_LONG_DOUBLE_COMPAT
+
+extern void *_ZTVN10__cxxabiv123__fundamental_type_infoE[];
+extern void *_ZTVN10__cxxabiv119__pointer_type_infoE[];
+extern __attribute__((used, weak)) const char _ZTSe[2] = "e";
+extern __attribute__((used, weak)) const char _ZTSPe[3] = "Pe";
+extern __attribute__((used, weak)) const char _ZTSPKe[4] = "PKe";
+extern __attribute__((used, weak)) const void *_ZTIe[2]
+  = { (void *) &_ZTVN10__cxxabiv123__fundamental_type_infoE[2],
+      (void *) _ZTSe };
+extern __attribute__((used, weak)) const void *_ZTIPe[4]
+  = { (void *) &_ZTVN10__cxxabiv119__pointer_type_infoE[2],
+      (void *) _ZTSPe, (void *) 0L, (void *) _ZTIe };
+extern __attribute__((used, weak)) const void *_ZTIPKe[4]
+  = { (void *) &_ZTVN10__cxxabiv119__pointer_type_infoE[2],
+      (void *) _ZTSPKe, (void *) 1L, (void *) _ZTIe };
+
+#endif // _GLIBCXX_LONG_DOUBLE_COMPAT
--- libstdc++-v3/scripts/as_symver_filter.jj	2006-01-31 14:20:26.000000000 +0100
+++ libstdc++-v3/scripts/as_symver_filter	2006-01-31 14:20:26.000000000 +0100
@@ -0,0 +1,26 @@
+#!/bin/sh
+# Assembly filter put in between cc1 and as that allows to pretend
+# that .symver symbol, symbol@@SYMBOLVER is supported by replacing
+# all occurences of symbol except symbol@ with a unique symbol name.
+# In addition to this, it handles two artificial assembly directives:
+# .endchunk_start and .endchunk_end.
+# These surround a block of assembly that is placed at the end of
+# the assembly file.
+
+# First argument is the original assembly file (*.sv).
+# Second argument is a temporary file for sed script (*.se).
+# Third argument is either a name of the output assembly file (*.s)
+# or -, in which case the output is stdout.
+LC_ALL=C
+export LC_ALL
+sed -n -e 's/^.*[^ 	]*\.symver[ 	][ 	]*\([A-Za-z0-9_.][A-Za-z0-9_.]*\)[ 	]*,[ 	]*\1@@.*$/\1/p' \
+  "$1" | \
+sed -e 's/^.*$/s~^&$~_U&~;s~^&[^A-Za-z0-9_.@]~_U\&~;s~\\([^A-Za-z0-9_.]\\)&$~\\1_U&~;s~\\([^A-Za-z0-9_.]\\)&\\([^A-Za-z0-9_.@]\\)~\\1_U&\\2~g;/' \
+  > "$2"
+echo '/^[ 	]*\.endchunk_start[ 	]*$/,/^[ 	]*\.endchunk_end[ 	]*$/{/^[ 	]*\.endchunk_\(start\|end\)[ 	]*$/!H;d};$G' \
+  >> "$2"
+if [ "x$3" = "x-" ]; then
+  sed -f "$2" "$1"
+else
+  sed -f "$2" "$1" > "$3"
+fi
--- libstdc++-v3/src/complex_io.cc.jj	2005-12-27 17:31:49.000000000 +0100
+++ libstdc++-v3/src/complex_io.cc	2006-02-01 13:49:57.000000000 +0100
@@ -92,3 +92,18 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
 #endif //_GLIBCXX_USE_WCHAR_T
 
 _GLIBCXX_END_NAMESPACE
+
+#ifdef _GLIBCXX_LONG_DOUBLE_COMPAT
+
+#define _GLIBCXX_LDBL_COMPAT(dbl, ldbl) \
+  extern "C" void ldbl (void) __attribute__ ((alias (#dbl), weak))
+_GLIBCXX_LDBL_COMPAT (_ZStlsIdcSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E,
+		      _ZStlsIecSt11char_traitsIcEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E);
+_GLIBCXX_LDBL_COMPAT (_ZStlsIdwSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E,
+		      _ZStlsIewSt11char_traitsIwEERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E);
+_GLIBCXX_LDBL_COMPAT (_ZStrsIdcSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E,
+		      _ZStrsIecSt11char_traitsIcEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E);
+_GLIBCXX_LDBL_COMPAT (_ZStrsIdwSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E,
+		      _ZStrsIewSt11char_traitsIwEERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E);
+
+#endif // _GLIBCXX_LONG_DOUBLE_COMPAT
--- libstdc++-v3/src/limits.cc.jj	2005-12-27 17:31:49.000000000 +0100
+++ libstdc++-v3/src/limits.cc	2006-02-01 16:35:52.000000000 +0100
@@ -448,3 +448,33 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
   const float_round_style numeric_limits<long double>::round_style;
 
 _GLIBCXX_END_NAMESPACE
+
+#ifdef _GLIBCXX_LONG_DOUBLE_COMPAT
+
+#define _GLIBCXX_NUM_LIM_COMPAT(type, member, len) \
+  extern "C" type _ZNSt14numeric_limitsIeE ## len ## member ## E \
+  __attribute__ ((alias ("_ZNSt14numeric_limitsIdE" #len #member "E")))
+_GLIBCXX_NUM_LIM_COMPAT (bool, is_specialized, 14);
+_GLIBCXX_NUM_LIM_COMPAT (int, digits, 6);
+_GLIBCXX_NUM_LIM_COMPAT (int, digits10, 8);
+_GLIBCXX_NUM_LIM_COMPAT (bool, is_signed, 9);
+_GLIBCXX_NUM_LIM_COMPAT (bool, is_integer, 10);
+_GLIBCXX_NUM_LIM_COMPAT (bool, is_exact, 8);
+_GLIBCXX_NUM_LIM_COMPAT (int, radix, 5);
+_GLIBCXX_NUM_LIM_COMPAT (int, min_exponent, 12);
+_GLIBCXX_NUM_LIM_COMPAT (int, min_exponent10, 14);
+_GLIBCXX_NUM_LIM_COMPAT (int, max_exponent, 12);
+_GLIBCXX_NUM_LIM_COMPAT (int, max_exponent10, 14);
+_GLIBCXX_NUM_LIM_COMPAT (bool, has_infinity, 12);
+_GLIBCXX_NUM_LIM_COMPAT (bool, has_quiet_NaN, 13);
+_GLIBCXX_NUM_LIM_COMPAT (bool, has_signaling_NaN, 17);
+_GLIBCXX_NUM_LIM_COMPAT (std::float_denorm_style, has_denorm, 10);
+_GLIBCXX_NUM_LIM_COMPAT (bool, has_denorm_loss, 15);
+_GLIBCXX_NUM_LIM_COMPAT (bool, is_iec559, 9);
+_GLIBCXX_NUM_LIM_COMPAT (bool, is_bounded, 10);
+_GLIBCXX_NUM_LIM_COMPAT (bool, is_modulo, 9);
+_GLIBCXX_NUM_LIM_COMPAT (bool, traps, 5);
+_GLIBCXX_NUM_LIM_COMPAT (bool, tinyness_before, 15);
+_GLIBCXX_NUM_LIM_COMPAT (std::float_round_style, round_style, 11);
+
+#endif // _GLIBCXX_LONG_DOUBLE_COMPAT
--- libstdc++-v3/src/Makefile.am.jj	2006-01-03 09:24:34.000000000 +0100
+++ libstdc++-v3/src/Makefile.am	2006-02-01 18:28:31.000000000 +0100
@@ -33,10 +33,15 @@ libstdc++-symbols.ver:  ${glibcxx_srcdir
 		$(port_specific_symbol_files)
 	cp ${glibcxx_srcdir}/$(SYMVER_FILE) ./libstdc++-symbols.ver
 	if test "x$(port_specific_symbol_files)" != x; then \
-	  sed -n '1,/DO NOT DELETE/p' $@ > tmp.top; \
-	  sed -n '/DO NOT DELETE/,$$p' $@ > tmp.bottom; \
-	  cat tmp.top $(port_specific_symbol_files) tmp.bottom > $@; \
-	  rm tmp.top tmp.bottom; \
+	  if grep '^# Appended to version file.' \
+	       $(port_specific_symbol_files) /dev/null > /dev/null 2>&1; then \
+	    cat $(port_specific_symbol_files) >> $@; \
+	  else \
+	    sed -n '1,/DO NOT DELETE/p' $@ > tmp.top; \
+	    sed -n '/DO NOT DELETE/,$$p' $@ > tmp.bottom; \
+	    cat tmp.top $(port_specific_symbol_files) tmp.bottom > $@; \
+	    rm tmp.top tmp.bottom; \
+	  fi; \
 	fi
 
 if ENABLE_SYMVERS_GNU
@@ -193,6 +198,17 @@ concept-inst.lo: concept-inst.cc
 concept-inst.o: concept-inst.cc
 	$(CXXCOMPILE) -D_GLIBCXX_CONCEPT_CHECKS -fimplicit-templates -c $<
 
+# Use special rules for {,w}locale-inst.cc compilation, as we need to do
+# some dirty assembly massaging when building with _GLIBCXX_LONG_DOUBLE_COMPAT.
+locale-inst.lo: locale-inst.cc
+	$(LTCXXCOMPILE) $(SYMVER_CXXFLAGS) -c $<
+locale-inst.o: locale-inst.cc
+	$(CXXCOMPILE) $(SYMVER_CXXFLAGS) -c $<
+wlocale-inst.lo: wlocale-inst.cc
+	$(LTCXXCOMPILE) $(SYMVER_CXXFLAGS) -c $<
+wlocale-inst.o: wlocale-inst.cc
+	$(CXXCOMPILE) $(SYMVER_CXXFLAGS) -c $<
+
 # AM_CXXFLAGS needs to be in each subdirectory so that it can be
 # modified in a per-library or per-sub-library way.  Need to manually
 # set this option because CONFIG_CXXFLAGS has to be after
--- libstdc++-v3/src/Makefile.in.jj	2006-01-03 09:24:34.000000000 +0100
+++ libstdc++-v3/src/Makefile.in	2006-02-01 18:28:47.000000000 +0100
@@ -189,6 +189,7 @@ SECTION_LDFLAGS = @SECTION_LDFLAGS@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
+SYMVER_CXXFLAGS = @SYMVER_CXXFLAGS@
 SYMVER_FILE = @SYMVER_FILE@
 TOPLEVEL_INCLUDES = @TOPLEVEL_INCLUDES@
 USE_NLS = @USE_NLS@
@@ -681,10 +682,15 @@ uninstall-am: uninstall-info-am uninstal
 @ENABLE_SYMVERS_TRUE@		$(port_specific_symbol_files)
 @ENABLE_SYMVERS_TRUE@	cp ${glibcxx_srcdir}/$(SYMVER_FILE) ./libstdc++-symbols.ver
 @ENABLE_SYMVERS_TRUE@	if test "x$(port_specific_symbol_files)" != x; then \
-@ENABLE_SYMVERS_TRUE@	  sed -n '1,/DO NOT DELETE/p' $@ > tmp.top; \
-@ENABLE_SYMVERS_TRUE@	  sed -n '/DO NOT DELETE/,$$p' $@ > tmp.bottom; \
-@ENABLE_SYMVERS_TRUE@	  cat tmp.top $(port_specific_symbol_files) tmp.bottom > $@; \
-@ENABLE_SYMVERS_TRUE@	  rm tmp.top tmp.bottom; \
+@ENABLE_SYMVERS_TRUE@	  if grep '^# Appended to version file.' \
+@ENABLE_SYMVERS_TRUE@	       $(port_specific_symbol_files) /dev/null > /dev/null 2>&1; then \
+@ENABLE_SYMVERS_TRUE@	    cat $(port_specific_symbol_files) >> $@; \
+@ENABLE_SYMVERS_TRUE@	  else \
+@ENABLE_SYMVERS_TRUE@	    sed -n '1,/DO NOT DELETE/p' $@ > tmp.top; \
+@ENABLE_SYMVERS_TRUE@	    sed -n '/DO NOT DELETE/,$$p' $@ > tmp.bottom; \
+@ENABLE_SYMVERS_TRUE@	    cat tmp.top $(port_specific_symbol_files) tmp.bottom > $@; \
+@ENABLE_SYMVERS_TRUE@	    rm tmp.top tmp.bottom; \
+@ENABLE_SYMVERS_TRUE@	  fi; \
 @ENABLE_SYMVERS_TRUE@	fi
 @ENABLE_SYMVERS_DARWIN_TRUE@@ENABLE_SYMVERS_TRUE@libstdc++-symbols.explist : libstdc++-symbols.ver \
 @ENABLE_SYMVERS_DARWIN_TRUE@@ENABLE_SYMVERS_TRUE@		${glibcxx_srcdir}/scripts/make_exports.pl \
@@ -737,6 +743,17 @@ concept-inst.lo: concept-inst.cc
 concept-inst.o: concept-inst.cc
 	$(CXXCOMPILE) -D_GLIBCXX_CONCEPT_CHECKS -fimplicit-templates -c $<
 
+# Use special rules for {,w}locale-inst.cc compilation, as we need to do
+# some dirty assembly massaging when building with _GLIBCXX_LONG_DOUBLE_COMPAT.
+locale-inst.lo: locale-inst.cc
+	$(LTCXXCOMPILE) $(SYMVER_CXXFLAGS) -c $<
+locale-inst.o: locale-inst.cc
+	$(CXXCOMPILE) $(SYMVER_CXXFLAGS) -c $<
+wlocale-inst.lo: wlocale-inst.cc
+	$(LTCXXCOMPILE) $(SYMVER_CXXFLAGS) -c $<
+wlocale-inst.o: wlocale-inst.cc
+	$(CXXCOMPILE) $(SYMVER_CXXFLAGS) -c $<
+
 # Added bits to build debug library.
 @GLIBCXX_BUILD_DEBUG_TRUE@all-local: build_debug
 @GLIBCXX_BUILD_DEBUG_TRUE@install-data-local: install_debug
--- libstdc++-v3/src/istream-inst.cc.jj	2006-01-03 09:24:34.000000000 +0100
+++ libstdc++-v3/src/istream-inst.cc	2006-02-01 18:04:45.000000000 +0100
@@ -96,3 +96,17 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
 #endif
 
 _GLIBCXX_END_NAMESPACE
+
+#ifdef _GLIBCXX_LONG_DOUBLE_COMPAT
+
+#define _GLIBCXX_LDBL_COMPAT(dbl, ldbl) \
+  extern "C" void ldbl (void) __attribute__ ((alias (#dbl), weak))
+_GLIBCXX_LDBL_COMPAT (_ZNSirsERd, _ZNSirsERe);
+_GLIBCXX_LDBL_COMPAT (_ZNSt13basic_istreamIwSt11char_traitsIwEErsERd,
+		      _ZNSt13basic_istreamIwSt11char_traitsIwEErsERe);
+_GLIBCXX_LDBL_COMPAT (_ZNSi10_M_extractIdEERSiRT_,
+		      _ZNSi10_M_extractIeEERSiRT_);
+_GLIBCXX_LDBL_COMPAT (_ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIdEERS2_RT_,
+		      _ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIeEERS2_RT_);
+
+#endif // _GLIBCXX_LONG_DOUBLE_COMPAT
--- libstdc++-v3/src/locale-inst.cc.jj	2005-12-27 17:31:49.000000000 +0100
+++ libstdc++-v3/src/locale-inst.cc	2006-02-01 17:57:09.000000000 +0100
@@ -37,6 +37,8 @@
 // Instantiation configuration.
 #ifndef C
 # define C char
+# define Cc "c"
+# define Cs c
 #endif
 
 _GLIBCXX_BEGIN_NAMESPACE(std)
@@ -48,6 +50,30 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
   template struct __moneypunct_cache<C, true>;
   template class moneypunct_byname<C, false>;
   template class moneypunct_byname<C, true>;
+#ifdef _GLIBCXX_LONG_DOUBLE_COMPAT
+  template<typename _CharT, typename _InIter>
+    _InIter
+    money_get<_CharT, _InIter>::
+    __do_get(iter_type __beg, iter_type __end, bool __intl, ios_base& __io,
+	     ios_base::iostate& __err, double& __units) const
+    {
+      string __str;
+      if (__intl)
+	__beg = _M_extract<true>(__beg, __end, __io, __err, __str);
+      else
+	__beg = _M_extract<false>(__beg, __end, __io, __err, __str);
+      std::__convert_to_v(__str.c_str(), __units, __err, _S_get_c_locale());
+      return __beg;
+    }
+  template<typename _CharT, typename _OutIter>
+    _OutIter
+    money_put<_CharT, _OutIter>::
+    __do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill,
+	     double __units) const
+    {
+      return this->do_put(__s, __intl, __io, __fill, (long double) __units);
+    }
+#endif
   template class money_get<C, istreambuf_iterator<C> >;
   template class money_put<C, ostreambuf_iterator<C> >;
   template
@@ -78,6 +104,26 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
   template class numpunct<C>;
   template struct __numpunct_cache<C>;
   template class numpunct_byname<C>;
+#ifdef _GLIBCXX_LONG_DOUBLE_COMPAT
+  template<typename _CharT, typename _InIter>
+    _InIter
+    num_get<_CharT, _InIter>::
+    __do_get(iter_type __beg, iter_type __end, ios_base& __io,
+	     ios_base::iostate& __err, double& __v) const
+    {
+      string __xtrc;
+      __xtrc.reserve(32);
+      __beg = _M_extract_float(__beg, __end, __io, __err, __xtrc);
+      std::__convert_to_v(__xtrc.c_str(), __v, __err, _S_get_c_locale());
+      return __beg;
+    }
+
+  template<typename _CharT, typename _OutIter>
+    _OutIter
+    num_put<_CharT, _OutIter>::
+    __do_put(iter_type __s, ios_base& __io, char_type __fill, double __v) const
+    { return _M_insert_float(__s, __io, __fill, char(), __v); }
+#endif
   template class num_get<C, istreambuf_iterator<C> >;
   template class num_put<C, ostreambuf_iterator<C> >; 
   template
@@ -315,3 +361,86 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
 #endif
 
 _GLIBCXX_END_NAMESPACE
+
+#ifdef _GLIBCXX_LONG_DOUBLE_COMPAT
+
+#define _GLIBCXX_LDBL_CONCAT7_(a, b, c, d, e, f, g) \
+  a ## b ## c ## d ## e ## f ## g
+#define _GLIBCXX_LDBL_CONCAT7(a, b, c, d, e, f, g) \
+  _GLIBCXX_LDBL_CONCAT7_ (a, b, c, d, e, f, g)
+#define _GLIBCXX_LDBL_CONCAT9_(a, b, c, d, e, f, g, h, i) \
+  a ## b ## c ## d ## e ## f ## g ## h ## i
+#define _GLIBCXX_LDBL_CONCAT9(a, b, c, d, e, f, g, h, i) \
+  _GLIBCXX_LDBL_CONCAT9_ (a, b, c, d, e, f, g, h, i)
+#define _GLIBCXX_LDBL_LCOMPAT1(p1, p2, dbl, ldbl) \
+  extern "C" void \
+  _GLIBCXX_LDBL_CONCAT7 (p1, Cs, p2, Cs, St11char_traitsI, Cs, ldbl) (void) \
+  __attribute__ ((alias (#p1 Cc #p2 Cc "St11char_traitsI" Cc #dbl), weak))
+#define _GLIBCXX_LDBL_LCOMPAT2(p1, p2, dbl, ldbl) \
+  extern "C" void \
+  _GLIBCXX_LDBL_CONCAT9 (p1, Cs, p2, Cs, St11char_traitsI, Cs, ldbl, Cs, e) \
+  (void) \
+  __attribute__ ((alias (#p1 Cc #p2 Cc "St11char_traitsI" Cc #dbl Cc "d"), \
+		  weak))
+#define _GLIBCXX_LDBL_LCOMPAT3(p1, p2, dbl, p3, ldbl) \
+  extern "C" void \
+  _GLIBCXX_LDBL_CONCAT9 (p1, Cs, p2, Cs, St11char_traitsI, Cs, ldbl, Cs, p3) \
+  (void) \
+  __attribute__ ((alias (#p1 Cc #p2 Cc "St11char_traitsI" Cc #dbl Cc #p3), \
+		  weak))
+_GLIBCXX_LDBL_LCOMPAT1 (_ZNKSt7num_getI, St19istreambuf_iteratorI,
+			EEE5__getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd,
+			EEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe);
+_GLIBCXX_LDBL_LCOMPAT1 (_ZNKSt7num_getI, St19istreambuf_iteratorI,
+			EEE8__do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd,
+			EEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRe);
+_GLIBCXX_LDBL_LCOMPAT3 (_ZNKSt7num_putI, St19ostreambuf_iteratorI,
+			EEE15_M_insert_floatIdEES3_S3_RSt8ios_base, cT_,
+			EEE15_M_insert_floatIeEES3_S3_RSt8ios_base);
+_GLIBCXX_LDBL_LCOMPAT2 (_ZNKSt7num_putI, St19ostreambuf_iteratorI,
+			EEE5__putES3_RSt8ios_base,
+			EEE3putES3_RSt8ios_base);
+_GLIBCXX_LDBL_LCOMPAT2 (_ZNKSt7num_putI, St19ostreambuf_iteratorI,
+			EEE8__do_putES3_RSt8ios_base,
+			EEE6do_putES3_RSt8ios_base);
+_GLIBCXX_LDBL_LCOMPAT1 (_ZNKSt9money_getI, St19istreambuf_iteratorI,
+			EEE5__getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRd,
+			EEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe);
+_GLIBCXX_LDBL_LCOMPAT1 (_ZNKSt9money_getI, St19istreambuf_iteratorI,
+			EEE8__do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRd,
+			EEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRe);
+_GLIBCXX_LDBL_LCOMPAT2 (_ZNKSt9money_putI, St19ostreambuf_iteratorI,
+			EEE5__putES3_bRSt8ios_base,
+			EEE3putES3_bRSt8ios_base);
+_GLIBCXX_LDBL_LCOMPAT2 (_ZNKSt9money_putI, St19ostreambuf_iteratorI,
+			EEE8__do_putES3_bRSt8ios_base,
+			EEE6do_putES3_bRSt8ios_base);
+
+#if defined(_GLIBCXX_SYMVER) && defined (PIC)
+
+#if __LONG_MAX__ == 2147483647L
+#define _GLIBCXX_LDBL_VTABLE_ENTRY_SIZE 4
+#else
+#define _GLIBCXX_LDBL_VTABLE_ENTRY_SIZE 8
+#endif
+#define _GLIBCXX_LDBL_VTABLE_2(ldbl, size, entsize) \
+  asm ("\n.endchunk_start\n" \
+       ".weak _V" ldbl "\n" \
+       ".set _V" ldbl ", " ldbl "\n" \
+       ".size _V" ldbl ", " #size "*" #entsize "\n" \
+       ".symver _V" ldbl ", " ldbl "@GLIBCXX_3.4\n" \
+       ".symver " ldbl ", " ldbl "@@GLIBCXX_LDBL_3.4\n" \
+       ".type " ldbl ", @object\n" \
+       ".endchunk_end\n")
+#define _GLIBCXX_LDBL_VTABLE_1(ldbl, size, entsize) \
+  _GLIBCXX_LDBL_VTABLE_2 (ldbl, size, entsize)
+#define _GLIBCXX_LDBL_VTABLE(ldbl, size) \
+  _GLIBCXX_LDBL_VTABLE_1 (ldbl, size, _GLIBCXX_LDBL_VTABLE_ENTRY_SIZE)
+_GLIBCXX_LDBL_VTABLE ("_ZTVSt7num_getI"Cc"St19istreambuf_iteratorI"Cc"St11char_traitsI"Cc"EEE", 15);
+_GLIBCXX_LDBL_VTABLE ("_ZTVSt7num_putI"Cc"St19ostreambuf_iteratorI"Cc"St11char_traitsI"Cc"EEE", 12);
+_GLIBCXX_LDBL_VTABLE ("_ZTVSt9money_getI"Cc"St19istreambuf_iteratorI"Cc"St11char_traitsI"Cc"EEE", 6);
+_GLIBCXX_LDBL_VTABLE ("_ZTVSt9money_putI"Cc"St19ostreambuf_iteratorI"Cc"St11char_traitsI"Cc"EEE", 6);
+
+#endif // _GLIBCXX_SYMVER && PIC
+
+#endif // _GLIBCXX_LONG_DOUBLE_COMPAT
--- libstdc++-v3/src/ostream-inst.cc.jj	2006-01-03 09:24:34.000000000 +0100
+++ libstdc++-v3/src/ostream-inst.cc	2006-02-01 18:05:26.000000000 +0100
@@ -97,3 +97,17 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
 #endif
 
 _GLIBCXX_END_NAMESPACE
+
+#ifdef _GLIBCXX_LONG_DOUBLE_COMPAT
+
+#define _GLIBCXX_LDBL_COMPAT(dbl, ldbl) \
+  extern "C" void ldbl (void) __attribute__ ((alias (#dbl), weak))
+_GLIBCXX_LDBL_COMPAT (_ZNSolsEd, _ZNSolsEe);
+_GLIBCXX_LDBL_COMPAT (_ZNSt13basic_ostreamIwSt11char_traitsIwEElsEd,
+		      _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEe);
+_GLIBCXX_LDBL_COMPAT (_ZNSo9_M_insertIdEERSoT_,
+		      _ZNSo9_M_insertIeEERSoT_);
+_GLIBCXX_LDBL_COMPAT (_ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIdEERS2_T_,
+		      _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIeEERS2_T_);
+
+#endif // _GLIBCXX_LONG_DOUBLE_COMPAT
--- libstdc++-v3/src/wlocale-inst.cc.jj	2005-11-12 18:07:30.000000000 +0100
+++ libstdc++-v3/src/wlocale-inst.cc	2006-02-01 17:57:13.000000000 +0100
@@ -35,5 +35,7 @@
 
 #ifdef _GLIBCXX_USE_WCHAR_T
 #define C wchar_t
+#define Cc "w"
+#define Cs w
 #include "locale-inst.cc"
 #endif
--- libstdc++-v3/config/locale/gnu/c_locale.cc.jj	2005-12-27 17:31:51.000000000 +0100
+++ libstdc++-v3/config/locale/gnu/c_locale.cc	2006-02-01 17:10:34.000000000 +0100
@@ -135,3 +135,12 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
   const char* const* const locale::_S_categories = __gnu_cxx::category_names;
 
 _GLIBCXX_END_NAMESPACE
+
+#ifdef _GLIBCXX_LONG_DOUBLE_COMPAT
+
+#define _GLIBCXX_LDBL_COMPAT(dbl, ldbl) \
+  extern "C" void ldbl (void) __attribute__ ((alias (#dbl)))
+_GLIBCXX_LDBL_COMPAT (_ZSt14__convert_to_vIdEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct,
+		      _ZSt14__convert_to_vIeEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct);
+
+#endif // _GLIBCXX_LONG_DOUBLE_COMPAT
--- libstdc++-v3/config/locale/generic/c_locale.cc.jj	2005-12-27 17:31:51.000000000 +0100
+++ libstdc++-v3/config/locale/generic/c_locale.cc	2006-02-01 17:10:23.000000000 +0100
@@ -171,3 +171,12 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
   const char* const* const locale::_S_categories = __gnu_cxx::category_names;
 
 _GLIBCXX_END_NAMESPACE
+
+#ifdef _GLIBCXX_LONG_DOUBLE_COMPAT
+
+#define _GLIBCXX_LDBL_COMPAT(dbl, ldbl) \
+  extern "C" void ldbl (void) __attribute__ ((alias (#dbl)))
+_GLIBCXX_LDBL_COMPAT (_ZSt14__convert_to_vIdEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct,
+		      _ZSt14__convert_to_vIeEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct);
+
+#endif // _GLIBCXX_LONG_DOUBLE_COMPAT
--- libstdc++-v3/config/os/gnu-linux/ldbl-extra.ver.jj	2006-01-31 14:20:26.000000000 +0100
+++ libstdc++-v3/config/os/gnu-linux/ldbl-extra.ver	2006-02-01 18:17:57.000000000 +0100
@@ -0,0 +1,46 @@
+# Appended to version file.
+
+GLIBCXX_LDBL_3.4 {
+  _ZNSt14numeric_limitsIg*;
+  _ZNKSt7num_getI[cw]St19istreambuf_iteratorI[cw]St11char_traitsI[cw]EEE3getES3_S3_RSt8ios_baseRSt12_Ios_IostateRg;
+  _ZNKSt7num_getI[cw]St19istreambuf_iteratorI[cw]St11char_traitsI[cw]EEE5__getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd;
+  _ZNKSt7num_getI[cw]St19istreambuf_iteratorI[cw]St11char_traitsI[cw]EEE6do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRg;
+  _ZNKSt7num_getI[cw]St19istreambuf_iteratorI[cw]St11char_traitsI[cw]EEE8__do_getES3_S3_RSt8ios_baseRSt12_Ios_IostateRd;
+  _ZTVSt7num_getI[cw]St19istreambuf_iteratorI[cw]St11char_traitsI[cw]EEE;
+  _ZNKSt7num_putI[cw]St19ostreambuf_iteratorI[cw]St11char_traitsI[cw]EEE15_M_insert_floatIgEES3_S3_RSt8ios_base[cw]cT_;
+  _ZNKSt7num_putI[cw]St19ostreambuf_iteratorI[cw]St11char_traitsI[cw]EEE3putES3_RSt8ios_base[cw]g;
+  _ZNKSt7num_putI[cw]St19ostreambuf_iteratorI[cw]St11char_traitsI[cw]EEE5__putES3_RSt8ios_base[cw]d;
+  _ZNKSt7num_putI[cw]St19ostreambuf_iteratorI[cw]St11char_traitsI[cw]EEE6do_putES3_RSt8ios_base[cw]g;
+  _ZNKSt7num_putI[cw]St19ostreambuf_iteratorI[cw]St11char_traitsI[cw]EEE8__do_putES3_RSt8ios_base[cw]d;
+  _ZTVSt7num_putI[cw]St19ostreambuf_iteratorI[cw]St11char_traitsI[cw]EEE;
+  _ZNKSt9money_getI[cw]St19istreambuf_iteratorI[cw]St11char_traitsI[cw]EEE3getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRg;
+  _ZNKSt9money_getI[cw]St19istreambuf_iteratorI[cw]St11char_traitsI[cw]EEE5__getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRd;
+  _ZNKSt9money_getI[cw]St19istreambuf_iteratorI[cw]St11char_traitsI[cw]EEE6do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRg;
+  _ZNKSt9money_getI[cw]St19istreambuf_iteratorI[cw]St11char_traitsI[cw]EEE8__do_getES3_S3_bRSt8ios_baseRSt12_Ios_IostateRd;
+  _ZTVSt9money_getI[cw]St19istreambuf_iteratorI[cw]St11char_traitsI[cw]EEE;
+  _ZNKSt9money_putI[cw]St19ostreambuf_iteratorI[cw]St11char_traitsI[cw]EEE3putES3_bRSt8ios_base[cw]g;
+  _ZNKSt9money_putI[cw]St19ostreambuf_iteratorI[cw]St11char_traitsI[cw]EEE5__putES3_bRSt8ios_base[cw]d;
+  _ZNKSt9money_putI[cw]St19ostreambuf_iteratorI[cw]St11char_traitsI[cw]EEE6do_putES3_bRSt8ios_base[cw]g;
+  _ZNKSt9money_putI[cw]St19ostreambuf_iteratorI[cw]St11char_traitsI[cw]EEE8__do_putES3_bRSt8ios_base[cw]d;
+  _ZTVSt9money_putI[cw]St19ostreambuf_iteratorI[cw]St11char_traitsI[cw]EEE;
+  _ZNSirsERg;
+  _ZNSolsEg;
+  _ZNSt13basic_istreamIwSt11char_traitsIwEErsERg;
+  _ZNSt13basic_ostreamIwSt11char_traitsIwEElsEg;
+  _ZSt14__convert_to_vIgEvPKcRT_RSt12_Ios_IostateRKP15__locale_struct;
+  _ZStlsIg[cw]St11char_traitsI[cw]EERSt13basic_ostreamIT0_T1_ES6_RKSt7complexIT_E;
+  _ZStrsIg[cw]St11char_traitsI[cw]EERSt13basic_istreamIT0_T1_ES6_RSt7complexIT_E;
+};
+
+GLIBCXX_LDBL_3.4.7 {
+  _ZNSi10_M_extractIgEERSiRT_;
+  _ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractIgEERS2_RT_;
+  _ZNSo9_M_insertIgEERSoT_;
+  _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertIgEERS2_T_;
+} GLIBCXX_LDBL_3.4;
+
+CXXABI_LDBL_1.3 {
+  _ZT[IS]g;
+  _ZT[IS]Pg;
+  _ZT[IS]PKg;
+};
--- libstdc++-v3/config/abi/pre/gnu.ver.jj	2006-01-03 09:24:34.000000000 +0100
+++ libstdc++-v3/config/abi/pre/gnu.ver	2006-02-01 18:15:31.000000000 +0100
@@ -90,7 +90,12 @@ GLIBCXX_3.4 {
       std::locale::_S_normalize_category*;
       std::locale::_[T-Za-z]*;
 #     std::[A-Zm-r]*;
-      std::[A-Zm-n]*;
+      std::[A-Z]*;
+      std::m[^o]*;
+      std::money[^_]*;
+      std::money_base*;
+      std::n[^u]*;
+      std::num[^e_]*;
       std::[p-r]*;
       std::ostrstream*;
       std::out_of_range*;
@@ -254,7 +259,7 @@ GLIBCXX_3.4 {
     _ZNSi[0-9][a-h]*;
     _ZNSi[0-9][j-z]*;
     _ZNSi6ignoreE[il][il];
-    _ZNSirsE*;
+    _ZNSirsE*[^g];
 
     # std::basic_istream<wchar_t>
     _ZNSt13basic_istreamIwSt11char_traitsIwEEC*;
@@ -263,7 +268,7 @@ GLIBCXX_3.4 {
     _ZNSt13basic_istreamIwSt11char_traitsIwEE[0-9][a-h]*;
     _ZNSt13basic_istreamIwSt11char_traitsIwEE[0-9][j-z]*;
     _ZNSt13basic_istreamIwSt11char_traitsIwEE6ignoreE[il][ijlm];
-    _ZNSt13basic_istreamIwSt11char_traitsIwEErsE*;
+    _ZNSt13basic_istreamIwSt11char_traitsIwEErsE*[^g];
 
     # std::istream operators and extractors
     _ZSt7getlineI[cw]St11char_traitsI[cw]ESaI[cw]EERSt13basic_istream*;
@@ -281,7 +286,7 @@ GLIBCXX_3.4 {
     _ZNKSo6sentrycvbEv;
     _ZNSo8_M_write*;
     _ZNSo[0-9][a-z]*;
-    _ZNSolsE*;
+    _ZNSolsE*[^g];
 
     # std::basic_ostream<wchar_t>
     _ZNSt13basic_ostreamIwSt11char_traitsIwEEC*;
@@ -294,7 +299,7 @@ GLIBCXX_3.4 {
     _ZNSt13basic_ostreamIwSt11char_traitsIwEE5writeEPKw*;
     _ZNSt13basic_ostreamIwSt11char_traitsIwEE6sentry*;
     _ZNSt13basic_ostreamIwSt11char_traitsIwEE8_M_write*;
-    _ZNSt13basic_ostreamIwSt11char_traitsIwEElsE*;
+    _ZNSt13basic_ostreamIwSt11char_traitsIwEElsE*[^g];
 
     # std::ostream operators and inserters
     _ZSt4end[ls]I[cw]St11char_traitsI[cw]EERSt13basic_ostream*;
@@ -324,16 +329,28 @@ GLIBCXX_3.4 {
     _ZSt9has_facet*;
 
     # std::num_get
-    _ZNKSt7num_getI[cw]St19istreambuf_iteratorI[cw]St11char_traitsI[cw]EEE*;
+    _ZNKSt7num_getI[cw]St19istreambuf_iteratorI[cw]St11char_traitsI[cw]EEE[^58]*[^g];
+    _ZNSt7num_get*;
 
     # std::num_put
-    _ZNKSt7num_putI[cw]St19ostreambuf_iteratorI[cw]St11char_traitsI[cw]EEE*;
+    _ZNKSt7num_putI[cw]St19ostreambuf_iteratorI[cw]St11char_traitsI[cw]EEE[^158]*[^g];
+    _ZNKSt7num_putI[cw]St19ostreambuf_iteratorI[cw]St11char_traitsI[cw]EEE1[^5]*;
+    _ZNKSt7num_putI[cw]St19ostreambuf_iteratorI[cw]St11char_traitsI[cw]EEE15_M_insert_floatI[de]*;
+    _ZNSt7num_put*;
 
     # std::money_get
-    _ZNKSt9money_getI[cw]St19istreambuf_iteratorI[cw]St11char_traitsI[cw]EEE*;
+    _ZNKSt9money_getI[cw]St19istreambuf_iteratorI[cw]St11char_traitsI[cw]EEE[^58]*[^g];
+    _ZNSt9money_get*;
 
     # std::money_put
-    _ZNKSt9money_putI[cw]St19ostreambuf_iteratorI[cw]St11char_traitsI[cw]EEE*;
+    _ZNKSt9money_putI[cw]St19ostreambuf_iteratorI[cw]St11char_traitsI[cw]EEE[^58]*[^g];
+    _ZNSt9money_put*;
+
+    _ZSt9use_facetISt7num_*;
+    _ZSt9use_facetISt9money_*;
+
+    # std::numeric_limits
+    _ZNSt14numeric_limitsI[^g]*;
 
     # std::_Rb_tree
     _ZSt18_Rb_tree_decrementPKSt18_Rb_tree_node_base;
@@ -362,7 +379,7 @@ GLIBCXX_3.4 {
     _ZNSt12__basic_fileIcED*;
 
     # std::__convert_to_v
-    _ZSt14__convert_to_v*;
+    _ZSt14__convert_to_vI[^g]*;
 
     # __gnu_cxx::stdio_sync_filebuf
     _ZTVN9__gnu_cxx18stdio_sync_filebufI[cw]St11char_traitsI[cw]EEE;
@@ -661,10 +678,10 @@ GLIBCXX_3.4.7 {
     _ZNSt11__gnu_debug19_Safe_sequence_base22_M_revalidate_singularEv;
     _ZNSt11__gnu_debug19_Safe_sequence_base7_M_swapERS0_;
 
-    _ZNSo9_M_insertI*;
-    _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertI*;
-    _ZNSi10_M_extractI*;
-    _ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractI*;
+    _ZNSo9_M_insertI[^g]*;
+    _ZNSt13basic_ostreamIwSt11char_traitsIwEE9_M_insertI[^g]*;
+    _ZNSi10_M_extractI[^g]*;
+    _ZNSt13basic_istreamIwSt11char_traitsIwEE10_M_extractI[^g]*;
 
 } GLIBCXX_3.4.6;
 
@@ -740,9 +757,9 @@ CXXABI_1.3 {
     _ZTVN10__cxxabiv121__vmi_class_type_infoE;
 
     # typeinfo structure (and some names)
-    _ZTI[a-z];
-    _ZTIP[a-z];
-    _ZTIPK[a-z];
+    _ZTI[a-fh-z];
+    _ZTIP[a-fh-z];
+    _ZTIPK[a-fh-z];
     _ZTIN10__cxxabiv117__array_type_infoE;
     _ZTIN10__cxxabiv117__class_type_infoE;
     _ZTIN10__cxxabiv116__enum_type_infoE;
@@ -755,9 +772,9 @@ CXXABI_1.3 {
     _ZTIN10__cxxabiv121__vmi_class_type_infoE;
 
     # typeinfo name
-    _ZTS[a-z];
-    _ZTSP[a-z];
-    _ZTSPK[a-z];
+    _ZTS[a-fh-z];
+    _ZTSP[a-fh-z];
+    _ZTSPK[a-fh-z];
     _ZTSN10__cxxabiv117__array_type_infoE;
     _ZTSN10__cxxabiv117__class_type_infoE;
     _ZTSN10__cxxabiv116__enum_type_infoE;
--- libstdc++-v3/configure.jj	2006-01-31 14:06:41.000000000 +0100
+++ libstdc++-v3/configure	2006-01-31 14:22:48.000000000 +0100
@@ -309,7 +309,7 @@ ac_includes_default="\
 # include <unistd.h>
 #endif"
 
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS libtool_VERSION multi_basedir build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar glibcxx_builddir glibcxx_srcdir toplevel_srcdir CC ac_ct_CC EXEEXT OBJEXT CXX ac_ct_CXX CFLAGS CXXFLAGS LN_S AS ac_ct_AS AR ac_ct_AR RANLIB ac_ct_RANLIB MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT LIBTOOL CXXCPP CPPFLAGS enable_shared enable_static GLIBCXX_HOSTED_TRUE GLIBCXX_HOSTED_FALSE GLIBCXX_BUILD_PCH_TRUE GLIBCXX_BUILD_PCH_FALSE glibcxx_PCHFLAGS CSTDIO_H BASIC_FILE_H BASIC_FILE_CC CPP EGREP check_msgfmt glibcxx_MOFILES glibcxx_POFILES glibcxx_localedir USE_NLS CLOCALE_H CMESSAGES_H CCODECVT_CC CCOLLATE_CC CCTYPE_CC CMESSAGES_CC CMONEY_CC CNUMERIC_CC CTIME_H CTIME_CC CLOCALE_CC CLOCALE_INTERNAL_H ALLOCATOR_H ALLOCATOR_NAME C_INCLUDE_DIR GLIBCXX_C_HEADERS_C_TRUE GLIBCXX_C_HEADERS_C_FALSE GLIBCXX_C_HEADERS_C_STD_TRUE GLIBCXX_C_HEADERS_C_STD_FALSE GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE DEBUG_FLAGS GLIBCXX_BUILD_DEBUG_TRUE GLIBCXX_BUILD_DEBUG_FALSE EXTRA_CXX_FLAGS glibcxx_thread_h WERROR SECTION_FLAGS SECTION_LDFLAGS OPT_LDFLAGS LIBMATHOBJS LIBICONV SYMVER_FILE port_specific_symbol_files ENABLE_SYMVERS_TRUE ENABLE_SYMVERS_FALSE ENABLE_SYMVERS_GNU_TRUE ENABLE_SYMVERS_GNU_FALSE ENABLE_SYMVERS_GNU_NAMESPACE_TRUE ENABLE_SYMVERS_GNU_NAMESPACE_FALSE ENABLE_SYMVERS_DARWIN_TRUE ENABLE_SYMVERS_DARWIN_FALSE baseline_dir ATOMICITY_SRCDIR ATOMIC_WORD_SRCDIR CPU_DEFINES_SRCDIR ABI_TWEAKS_SRCDIR OS_INC_SRCDIR glibcxx_prefixdir gxx_include_dir glibcxx_toolexecdir glibcxx_toolexeclibdir GLIBCXX_INCLUDES TOPLEVEL_INCLUDES OPTIMIZE_CXXFLAGS WARN_FLAGS LIBSUPCXX_PICFLAGS LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS libtool_VERSION multi_basedir build build_cpu build_vendor build_os host host_cpu host_vendor host_os target target_cpu target_vendor target_os INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar glibcxx_builddir glibcxx_srcdir toplevel_srcdir CC ac_ct_CC EXEEXT OBJEXT CXX ac_ct_CXX CFLAGS CXXFLAGS LN_S AS ac_ct_AS AR ac_ct_AR RANLIB ac_ct_RANLIB MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT LIBTOOL CXXCPP CPPFLAGS enable_shared enable_static GLIBCXX_HOSTED_TRUE GLIBCXX_HOSTED_FALSE GLIBCXX_BUILD_PCH_TRUE GLIBCXX_BUILD_PCH_FALSE glibcxx_PCHFLAGS CSTDIO_H BASIC_FILE_H BASIC_FILE_CC CPP EGREP check_msgfmt glibcxx_MOFILES glibcxx_POFILES glibcxx_localedir USE_NLS CLOCALE_H CMESSAGES_H CCODECVT_CC CCOLLATE_CC CCTYPE_CC CMESSAGES_CC CMONEY_CC CNUMERIC_CC CTIME_H CTIME_CC CLOCALE_CC CLOCALE_INTERNAL_H ALLOCATOR_H ALLOCATOR_NAME C_INCLUDE_DIR GLIBCXX_C_HEADERS_C_TRUE GLIBCXX_C_HEADERS_C_FALSE GLIBCXX_C_HEADERS_C_STD_TRUE GLIBCXX_C_HEADERS_C_STD_FALSE GLIBCXX_C_HEADERS_COMPATIBILITY_TRUE GLIBCXX_C_HEADERS_COMPATIBILITY_FALSE DEBUG_FLAGS GLIBCXX_BUILD_DEBUG_TRUE GLIBCXX_BUILD_DEBUG_FALSE EXTRA_CXX_FLAGS glibcxx_thread_h WERROR SECTION_FLAGS SECTION_LDFLAGS OPT_LDFLAGS LIBMATHOBJS LIBICONV SYMVER_FILE port_specific_symbol_files ENABLE_SYMVERS_TRUE ENABLE_SYMVERS_FALSE ENABLE_SYMVERS_GNU_TRUE ENABLE_SYMVERS_GNU_FALSE ENABLE_SYMVERS_GNU_NAMESPACE_TRUE ENABLE_SYMVERS_GNU_NAMESPACE_FALSE ENABLE_SYMVERS_DARWIN_TRUE ENABLE_SYMVERS_DARWIN_FALSE baseline_dir SYMVER_CXXFLAGS ATOMICITY_SRCDIR ATOMIC_WORD_SRCDIR CPU_DEFINES_SRCDIR ABI_TWEAKS_SRCDIR OS_INC_SRCDIR glibcxx_prefixdir gxx_include_dir glibcxx_toolexecdir glibcxx_toolexeclibdir GLIBCXX_INCLUDES TOPLEVEL_INCLUDES OPTIMIZE_CXXFLAGS WARN_FLAGS LIBSUPCXX_PICFLAGS LIBOBJS LTLIBOBJS'
 ac_subst_files=''
 
 # Initialize some variables set by options.
@@ -89646,6 +89646,77 @@ done
 
 
 
+SYMVER_CXXFLAGS=
+case "$target" in
+  powerpc*-*-*gnu* | \
+  sparc*-*-linux* | \
+  s390*-*-linux* | \
+  alpha*-*-linux*)
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+#if !defined __LONG_DOUBLE_128__ || (defined (__sparc__) && defined (__arch64__))
+#error no need for long double compatibility
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
+  (eval $ac_compile) 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag"
+			 || test ! -s conftest.err'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+  (eval $ac_try) 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_ldbl_compat=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ac_ldbl_compat=no
+fi
+rm -f conftest.err conftest.$ac_objext conftest.$ac_ext
+  if test "$ac_ldbl_compat" = yes; then
+
+cat >>confdefs.h <<\_ACEOF
+#define _GLIBCXX_LONG_DOUBLE_COMPAT 1
+_ACEOF
+
+    port_specific_symbol_files="\$(top_srcdir)/config/os/gnu-linux/ldbl-extra.ver"
+    $CC $CFLAGS -dumpspecs \
+      | sed '/^\*invoke_as:/{N;s/%{!S:-o %|.s |/%{!S:-o %{DPIC:%g.sv |/;a\
+  as_symver_filter %g.sv %g.se %|.s ;:%|.s } |
+;}' > as_symver_specs
+    SYMVER_CXXFLAGS="-specs=\$(top_builddir)/as_symver_specs -B\$(top_srcdir)/scripts/"
+  fi
+esac
+
+
 # Propagate the target-specific source directories through the build chain.
 ATOMICITY_SRCDIR=config/${atomicity_dir}
 ATOMIC_WORD_SRCDIR=config/${atomic_word_dir}
@@ -90819,6 +90890,7 @@ s,@ENABLE_SYMVERS_GNU_NAMESPACE_FALSE@,$
 s,@ENABLE_SYMVERS_DARWIN_TRUE@,$ENABLE_SYMVERS_DARWIN_TRUE,;t t
 s,@ENABLE_SYMVERS_DARWIN_FALSE@,$ENABLE_SYMVERS_DARWIN_FALSE,;t t
 s,@baseline_dir@,$baseline_dir,;t t
+s,@SYMVER_CXXFLAGS@,$SYMVER_CXXFLAGS,;t t
 s,@ATOMICITY_SRCDIR@,$ATOMICITY_SRCDIR,;t t
 s,@ATOMIC_WORD_SRCDIR@,$ATOMIC_WORD_SRCDIR,;t t
 s,@CPU_DEFINES_SRCDIR@,$CPU_DEFINES_SRCDIR,;t t
--- libstdc++-v3/configure.ac.jj	2006-01-26 16:36:02.000000000 +0100
+++ libstdc++-v3/configure.ac	2006-01-31 14:20:26.000000000 +0100
@@ -287,6 +287,30 @@ GLIBCXX_ENABLE_SYMVERS([yes])
 # This depends on GLIBCXX_ENABLE_SYMVERS and GLIBCXX_IS_NATIVE.
 GLIBCXX_CONFIGURE_TESTSUITE
 
+SYMVER_CXXFLAGS=
+case "$target" in
+  powerpc*-*-*gnu* | \
+  sparc*-*-linux* | \
+  s390*-*-linux* | \
+  alpha*-*-linux*)
+  AC_TRY_COMPILE(, [
+#if !defined __LONG_DOUBLE_128__ || (defined (__sparc__) && defined (__arch64__))
+#error no need for long double compatibility
+#endif
+  ], [ac_ldbl_compat=yes], [ac_ldbl_compat=no])
+  if test "$ac_ldbl_compat" = yes; then
+    AC_DEFINE([_GLIBCXX_LONG_DOUBLE_COMPAT],1,
+	      [Define if compatibility should be provided for -mlong-double-64.])
+    port_specific_symbol_files="\$(top_srcdir)/config/os/gnu-linux/ldbl-extra.ver"
+    $CC $CFLAGS -dumpspecs \
+      | sed '/^\*invoke_as:/{N;s/%{!S:-o %|.s |/%{!S:-o %{DPIC:%g.sv |/;a\
+  as_symver_filter %g.sv %g.se %|.s ;:%|.s } |
+;}' > as_symver_specs
+    SYMVER_CXXFLAGS="-specs=\$(top_builddir)/as_symver_specs -B\$(top_srcdir)/scripts/"
+  fi
+esac
+AC_SUBST(SYMVER_CXXFLAGS)
+
 # Propagate the target-specific source directories through the build chain.
 ATOMICITY_SRCDIR=config/${atomicity_dir}
 ATOMIC_WORD_SRCDIR=config/${atomic_word_dir}
--- libstdc++-v3/config.h.in.jj	2006-01-31 14:06:41.000000000 +0100
+++ libstdc++-v3/config.h.in	2006-01-31 14:20:26.000000000 +0100
@@ -661,6 +661,9 @@
 /* Define to 1 if a full hosted library is built, or 0 if freestanding. */
 #undef _GLIBCXX_HOSTED
 
+/* Define if compatibility should be provided for -mlong-double-64. */
+#undef _GLIBCXX_LONG_DOUBLE_COMPAT
+
 /* Define if ptrdiff_t is int. */
 #undef _GLIBCXX_PTRDIFF_T_IS_INT
 
--- libstdc++-v3/Makefile.in.jj	2005-12-27 17:31:55.000000000 +0100
+++ libstdc++-v3/Makefile.in	2006-02-01 18:28:48.000000000 +0100
@@ -187,6 +187,7 @@ SECTION_LDFLAGS = @SECTION_LDFLAGS@
 SET_MAKE = @SET_MAKE@
 SHELL = @SHELL@
 STRIP = @STRIP@
+SYMVER_CXXFLAGS = @SYMVER_CXXFLAGS@
 SYMVER_FILE = @SYMVER_FILE@
 TOPLEVEL_INCLUDES = @TOPLEVEL_INCLUDES@
 USE_NLS = @USE_NLS@


	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]