Patchwork [v3] patch, configuring GCC --disable-libgomp causes libstdc++ abi check to fail.

login
register
mail settings
Submitter Benjamin Kosnik
Date Sept. 28, 2012, 8:02 p.m.
Message ID <20120928130246.37efbcf8@coso>
Download mbox | patch
Permalink /patch/187895/
State New
Headers show

Comments

Benjamin Kosnik - Sept. 28, 2012, 8:02 p.m.
Hey Iain.

I looked at this, and easily reproduced your results.

The following symbols are actually required by all
namespace associated-modes, not just parallel, and do not require
parallel capability:

> Symbols reported as missing by the abi.exp code:
> 
> _ZNSt9__cxx199815_List_node_base8transferEPS0_S1_
> std::__cxx1998::_List_node_base::transfer(std::__cxx1998::_List_node_base*,
> std::__cxx1998::_List_node_base*)
> 
> _ZNSt9__cxx199815_List_node_base4swapERS0_S1_
> std::__cxx1998::_List_node_base::swap(std::__cxx1998::_List_node_base&,
> std::__cxx1998::_List_node_base&)
> 
> _ZNSt9__cxx199815_List_node_base9_M_unhookEv
> std::__cxx1998::_List_node_base::_M_unhook()
> 
> _ZNSt9__cxx199815_List_node_base10_M_reverseEv
> std::__cxx1998::_List_node_base::_M_reverse()
>
> _ZNSt9__cxx199815_List_node_base11_M_transferEPS0_S1_
> std::__cxx1998::_List_node_base::_M_transfer(std::__cxx1998::_List_node_base*,
> std::__cxx1998::_List_node_base*)
> 
> _ZNSt9__cxx199815_List_node_base7reverseEv
> std::__cxx1998::_List_node_base::reverse()
> 
> _ZNSt9__cxx199815_List_node_base4hookEPS0_
> std::__cxx1998::_List_node_base::hook(std::__cxx1998::_List_node_base*)
> 
> _ZNSt9__cxx199815_List_node_base6unhookEv
> std::__cxx1998::_List_node_base::unhook()
> 
> _ZNSt9__cxx199815_List_node_base7_M_hookEPS0_
> std::__cxx1998::_List_node_base::_M_hook(std::__cxx1998::_List_node_base*)
> 

I've adjusted the Makefiles accordingly, and renamed some of these
files to accurately reflect what is necessary for compatibility and
what is not.

And the remaining:

> _ZN14__gnu_parallel9_Settings3setERS0_
> __gnu_parallel::_Settings::set(__gnu_parallel::_Settings&)
> 
> _ZN14__gnu_parallel9_Settings3getEv
> __gnu_parallel::_Settings::get()
> 

are sufficiently generic such that they can safely be defined even
without libgomp being built. So let's do so! 

(The only problem may be
targets that had shared libraries with symbol versioning and disabled
libgomp, as now new symbols (ie, get/set from _Settings, above) will be
in the shared library but with an older version number.  In practice
this may not be an issue.)

There's no reason for this unintentional  ABI breakage with this
configure flag.

tested x86/linux
tested x86/linux --disable-libgomp

Patch


2012-09-28  Benjamin Kosnik  <bkoz@redhat.com>

	* acinclude.m4 (GLIBCXX_ENABLE_PARALLEL): Remove ENABLE_PARALLEL.
	* include/Makefile.am: Same.
	* src/c++98/Makefile.am: Same.
	* src/Makefile.am: Same.
	* Makefile.in: Regenerated.
	* aclocal.m4: Same.
	* configure: Same.
	* doc/Makefile.in: Same.
	* include/Makefile.in: Same.
	* libsupc++/Makefile.in: Same.
	* po/Makefile.in: Same.
	* python/Makefile.in: Same.
	* src/Makefile.in: Same.
	* testsuite/Makefile.in: Same.
	* src/c++11/Makefile.in: Same.
	* src/c++98/Makefile.in: Same.

	* src/c++98/compatibility-debug_list-2.cc: Update comments.
	* src/c++98/compatibility-debug_list.cc: Same.
	* src/c++98/compatibility-list-2.cc: Renamed to src/c++98/list-aux-2.cc
	* src/c++98/compatibility-list.cc: Renamed to src/c++98/list-aux.cc
	* src/c++98/compatibility-parallel_list-2.cc: Renamed to
	src/c++98/list_associated-2.cc.
	* src/c++98/compatibility-parallel_list.cc: Renamed to
	src/c++98/list_associated.cc.

diff --git a/libstdc++-v3/acinclude.m4 b/libstdc++-v3/acinclude.m4
index ab26660..b9aa5c7 100644
--- a/libstdc++-v3/acinclude.m4
+++ b/libstdc++-v3/acinclude.m4
@@ -2173,7 +2173,6 @@  AC_DEFUN([GLIBCXX_ENABLE_PARALLEL], [
 
   AC_MSG_CHECKING([for parallel mode support])
   AC_MSG_RESULT([$enable_parallel])
-  GLIBCXX_CONDITIONAL(ENABLE_PARALLEL, test $enable_parallel = yes)
 ])
 
 
diff --git a/libstdc++-v3/include/Makefile.am b/libstdc++-v3/include/Makefile.am
index 7b12ea2..09925d5 100644
--- a/libstdc++-v3/include/Makefile.am
+++ b/libstdc++-v3/include/Makefile.am
@@ -737,7 +737,6 @@  debug_headers = \
 # Parallel mode headers
 parallel_srcdir = ${glibcxx_srcdir}/include/parallel
 parallel_builddir = ./parallel
-if ENABLE_PARALLEL
 parallel_headers = \
 	${parallel_srcdir}/algo.h \
 	${parallel_srcdir}/algobase.h \
@@ -782,9 +781,6 @@  parallel_headers = \
 	${parallel_srcdir}/types.h \
 	${parallel_srcdir}/unique_copy.h \
 	${parallel_srcdir}/workstealing.h
-else
-parallel_headers =
-endif
 
 # Profile mode headers
 profile_srcdir = ${glibcxx_srcdir}/include/profile
@@ -1283,10 +1279,8 @@  install-headers:
 	$(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${debug_builddir}
 	for file in ${debug_headers}; do \
 	  $(INSTALL_DATA) $${file} $(DESTDIR)${gxx_include_dir}/${debug_builddir}; done
-	parallel_headers_install='${parallel_headers}';\
-	test -z "$$parallel_headers_install" || \
-	  $(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${parallel_builddir};\
-	for file in $$parallel_headers_install; do \
+	$(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${parallel_builddir}
+	for file in ${parallel_headers}; do \
 	  $(INSTALL_DATA) $${file} $(DESTDIR)${gxx_include_dir}/${parallel_builddir}; done
 	$(mkinstalldirs) $(DESTDIR)${gxx_include_dir}/${profile_builddir}
 	for file in ${profile_headers}; do \
diff --git a/libstdc++-v3/src/Makefile.am b/libstdc++-v3/src/Makefile.am
index f64dca4..0251289 100644
--- a/libstdc++-v3/src/Makefile.am
+++ b/libstdc++-v3/src/Makefile.am
@@ -38,21 +38,16 @@  else
 ldbl_compat_sources =
 endif
 
-if ENABLE_PARALLEL
+
 parallel_compat_sources = \
 	compatibility-parallel_list.cc  compatibility-parallel_list-2.cc
-else
-parallel_compat_sources =
-endif
+
 
 cxx98_sources = \
 	compatibility.cc \
 	compatibility-debug_list.cc \
 	compatibility-debug_list-2.cc \
-	compatibility-list.cc \
-	compatibility-list-2.cc \
-	${ldbl_compat_sources} \
-	${parallel_compat_sources}
+	${ldbl_compat_sources} 
 
 cxx11_sources = \
 	compatibility-c++0x.cc \
@@ -79,18 +74,6 @@  libstdc___la_LDFLAGS = \
 libstdc___la_LINK = $(CXXLINK) $(libstdc___la_LDFLAGS)
 
 
-# Use special rules for parallel mode compilation.
-PARALLEL_FLAGS = -fopenmp -D_GLIBCXX_PARALLEL -I$(glibcxx_builddir)/../libgomp
-compatibility-parallel_list.lo: compatibility-parallel_list.cc
-	$(LTCXXCOMPILE) -c $<
-compatibility-parallel_list.o: compatibility-parallel_list.cc
-	$(CXXCOMPILE) -c $<
-
-compatibility-parallel_list-2.lo: compatibility-parallel_list-2.cc
-	$(LTCXXCOMPILE) -c $<
-compatibility-parallel_list-2.o: compatibility-parallel_list-2.cc
-	$(CXXCOMPILE) -c $<
-
 # Use special rules for compatibility-ldbl.cc compilation, as we need to
 # pass -mlong-double-64.
 if GLIBCXX_LDBL_COMPAT
diff --git a/libstdc++-v3/src/c++98/Makefile.am b/libstdc++-v3/src/c++98/Makefile.am
index c153a59..5733f34 100644
--- a/libstdc++-v3/src/c++98/Makefile.am
+++ b/libstdc++-v3/src/c++98/Makefile.am
@@ -82,11 +82,6 @@  c++locale.cc: ${glibcxx_srcdir}/$(CLOCALE_CC)
 basic_file.cc: ${glibcxx_srcdir}/$(BASIC_FILE_CC)
 	$(LN_S) ${glibcxx_srcdir}/$(BASIC_FILE_CC) ./$@ || true
 
-if ENABLE_PARALLEL
-parallel_sources = parallel_settings.cc
-else
-parallel_sources =
-endif
 
 if ENABLE_EXTERN_TEMPLATE
 XTEMPLATE_FLAGS = -fno-implicit-templates
@@ -108,6 +103,8 @@  XTEMPLATE_FLAGS =
 inst_sources =
 endif
 
+parallel_sources = parallel_settings.cc
+
 # Sources present in the src directory, always present.
 sources = \
 	bitmap_allocator.cc \
@@ -124,6 +121,10 @@  sources = \
 	ios_init.cc \
 	ios_locale.cc \
 	list.cc \
+	list-aux.cc \
+	list-aux-2.cc \
+	list_associated.cc \
+	list_associated-2.cc \
 	locale.cc \
 	locale_init.cc \
 	locale_facets.cc \
diff --git a/libstdc++-v3/src/c++98/compatibility-debug_list-2.cc b/libstdc++-v3/src/c++98/compatibility-debug_list-2.cc
index c032ff8..7091ecd 100644
--- a/libstdc++-v3/src/c++98/compatibility-debug_list-2.cc
+++ b/libstdc++-v3/src/c++98/compatibility-debug_list-2.cc
@@ -1,6 +1,6 @@ 
 // Compatibility symbols for previous versions, debug list -*- C++ -*-
 
-// Copyright (C) 2011 Free Software Foundation, Inc.
+// Copyright (C) 2011, 2012 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -25,4 +25,4 @@ 
 #define _GLIBCXX_BEGIN_NAMESPACE_COMPAT namespace __norm {
 #define _GLIBCXX_END_NAMESPACE_COMPAT }
 
-#include "compatibility-list-2.cc"
+#include "list-aux-2.cc"
diff --git a/libstdc++-v3/src/c++98/compatibility-debug_list.cc b/libstdc++-v3/src/c++98/compatibility-debug_list.cc
index 76cceec..eb20884 100644
--- a/libstdc++-v3/src/c++98/compatibility-debug_list.cc
+++ b/libstdc++-v3/src/c++98/compatibility-debug_list.cc
@@ -1,6 +1,6 @@ 
 // Compatibility symbols for previous versions, debug list -*- C++ -*-
 
-// Copyright (C) 2010, 2011 Free Software Foundation, Inc.
+// Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
 // software; you can redistribute it and/or modify it under the
@@ -25,4 +25,4 @@ 
 #define _GLIBCXX_BEGIN_NAMESPACE_COMPAT namespace __norm {
 #define _GLIBCXX_END_NAMESPACE_COMPAT }
 
-#include "compatibility-list.cc"
+#include "list-aux.cc"
diff --git a/libstdc++-v3/src/c++98/compatibility-list-2.cc b/libstdc++-v3/src/c++98/compatibility-list-2.cc
deleted file mode 100644
index 0e118ff..0000000
--- a/libstdc++-v3/src/c++98/compatibility-list-2.cc
+++ /dev/null
@@ -1,117 +0,0 @@ 
-// Compatibility symbols for previous versions, list bits -*- C++ -*-
-
-// Copyright (C) 2011, 2012 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library.  This library 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 3, or (at your option)
-// any later version.
-
-// This library 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.
-
-// Under Section 7 of GPL version 3, you are granted additional
-// permissions described in the GCC Runtime Library Exception, version
-// 3.1, as published by the Free Software Foundation.
-
-// You should have received a copy of the GNU General Public License and
-// a copy of the GCC Runtime Library Exception along with this program;
-// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-// <http://www.gnu.org/licenses/>.
-
-#include <bits/move.h>
-
-#ifdef _GLIBCXX_SHARED
-
-#ifndef _GLIBCXX_BEGIN_NAMESPACE_COMPAT
-# define _GLIBCXX_BEGIN_NAMESPACE_COMPAT
-#endif
-
-#ifndef _GLIBCXX_END_NAMESPACE_COMPAT
-# define _GLIBCXX_END_NAMESPACE_COMPAT
-#endif
-
-namespace std _GLIBCXX_VISIBILITY(default)
-{
-_GLIBCXX_BEGIN_NAMESPACE_COMPAT
-
-  struct _List_node_base
-  {
-    _List_node_base* _M_next;
-    _List_node_base* _M_prev;
-
-    void
-    _M_transfer(_List_node_base * const __first,
-		_List_node_base * const __last) _GLIBCXX_USE_NOEXCEPT;
-
-    void
-    _M_reverse() _GLIBCXX_USE_NOEXCEPT;
-
-    void
-    _M_hook(_List_node_base * const __position) _GLIBCXX_USE_NOEXCEPT;
-
-    void
-    _M_unhook() _GLIBCXX_USE_NOEXCEPT;
-  };
-
-  void
-  _List_node_base::
-  _M_transfer(_List_node_base * const __first,
-	      _List_node_base * const __last) _GLIBCXX_USE_NOEXCEPT
-  {
-    if (this != __last)
-    {
-      // Remove [first, last) from its old position.
-      __last->_M_prev->_M_next  = this;
-      __first->_M_prev->_M_next = __last;
-      this->_M_prev->_M_next    = __first;
-
-      // Splice [first, last) into its new position.
-      _List_node_base* const __tmp = this->_M_prev;
-      this->_M_prev                = __last->_M_prev;
-      __last->_M_prev              = __first->_M_prev;
-      __first->_M_prev             = __tmp;
-    }
-  }
-
-  void
-  _List_node_base::_M_reverse() _GLIBCXX_USE_NOEXCEPT
-  {
-    _List_node_base* __tmp = this;
-    do
-    {
-      std::swap(__tmp->_M_next, __tmp->_M_prev);
-
-      // Old next node is now prev.
-      __tmp = __tmp->_M_prev;
-    }
-    while (__tmp != this);
-  }
-
-  void
-  _List_node_base::
-  _M_hook(_List_node_base* const __position) _GLIBCXX_USE_NOEXCEPT
-  {
-    this->_M_next = __position;
-    this->_M_prev = __position->_M_prev;
-    __position->_M_prev->_M_next = this;
-    __position->_M_prev = this;
-  }
-
-  void
-  _List_node_base::_M_unhook() _GLIBCXX_USE_NOEXCEPT
-  {
-    _List_node_base* const __next_node = this->_M_next;
-    _List_node_base* const __prev_node = this->_M_prev;
-    __prev_node->_M_next = __next_node;
-    __next_node->_M_prev = __prev_node;
-  }
-
-_GLIBCXX_END_NAMESPACE_COMPAT
-
-} // namespace std
-
-#endif
diff --git a/libstdc++-v3/src/c++98/compatibility-list.cc b/libstdc++-v3/src/c++98/compatibility-list.cc
deleted file mode 100644
index 7e074a7..0000000
--- a/libstdc++-v3/src/c++98/compatibility-list.cc
+++ /dev/null
@@ -1,146 +0,0 @@ 
-// Compatibility symbols for previous versions, list bits -*- C++ -*-
-
-// Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library.  This library 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 3, or (at your option)
-// any later version.
-
-// This library 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.
-
-// Under Section 7 of GPL version 3, you are granted additional
-// permissions described in the GCC Runtime Library Exception, version
-// 3.1, as published by the Free Software Foundation.
-
-// You should have received a copy of the GNU General Public License and
-// a copy of the GCC Runtime Library Exception along with this program;
-// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-// <http://www.gnu.org/licenses/>.
-
-#include <bits/move.h>
-
-#ifndef _GLIBCXX_BEGIN_NAMESPACE_COMPAT
-# define _GLIBCXX_BEGIN_NAMESPACE_COMPAT
-#endif
-
-#ifndef _GLIBCXX_END_NAMESPACE_COMPAT
-# define _GLIBCXX_END_NAMESPACE_COMPAT
-#endif
-
-namespace std _GLIBCXX_VISIBILITY(default)
-{
-_GLIBCXX_BEGIN_NAMESPACE_COMPAT
-
-  struct _List_node_base
-  {
-    _List_node_base* _M_next;
-    _List_node_base* _M_prev;
-
-    static void
-    swap(_List_node_base& __x, _List_node_base& __y) throw ();
-
-    void
-    transfer(_List_node_base * const __first,
-	     _List_node_base * const __last) throw ();
-
-    void
-    reverse() throw ();
-
-    void
-    hook(_List_node_base * const __position) throw ();
-
-    void
-    unhook() throw ();
-  };
-
-  void
-  _List_node_base::swap(_List_node_base& __x, _List_node_base& __y) throw()
-  {
-    if ( __x._M_next != &__x )
-      {
-	if ( __y._M_next != &__y )
-	  {
-	    // Both __x and __y are not empty.
-	    std::swap(__x._M_next,__y._M_next);
-	    std::swap(__x._M_prev,__y._M_prev);
-	    __x._M_next->_M_prev = __x._M_prev->_M_next = &__x;
-	    __y._M_next->_M_prev = __y._M_prev->_M_next = &__y;
-	  }
-	else
-	  {
-	    // __x is not empty, __y is empty.
-	    __y._M_next = __x._M_next;
-	    __y._M_prev = __x._M_prev;
-	    __y._M_next->_M_prev = __y._M_prev->_M_next = &__y;
-	    __x._M_next = __x._M_prev = &__x;
-	  }
-      }
-    else if ( __y._M_next != &__y )
-      {
-	// __x is empty, __y is not empty.
-	__x._M_next = __y._M_next;
-	__x._M_prev = __y._M_prev;
-	__x._M_next->_M_prev = __x._M_prev->_M_next = &__x;
-	__y._M_next = __y._M_prev = &__y;
-      }
-  }
-
-  void
-  _List_node_base::transfer(_List_node_base * const __first,
-			    _List_node_base * const __last) throw ()
-  {
-    if (this != __last)
-    {
-      // Remove [first, last) from its old position.
-      __last->_M_prev->_M_next  = this;
-      __first->_M_prev->_M_next = __last;
-      this->_M_prev->_M_next    = __first;
-
-      // Splice [first, last) into its new position.
-      _List_node_base* const __tmp = this->_M_prev;
-      this->_M_prev                = __last->_M_prev;
-      __last->_M_prev              = __first->_M_prev;
-      __first->_M_prev             = __tmp;
-    }
-  }
-
-  void
-  _List_node_base::reverse() throw ()
-  {
-    _List_node_base* __tmp = this;
-    do
-    {
-      std::swap(__tmp->_M_next, __tmp->_M_prev);
-
-      // Old next node is now prev.
-      __tmp = __tmp->_M_prev;
-    }
-    while (__tmp != this);
-  }
-
-  void
-  _List_node_base::hook(_List_node_base* const __position) throw ()
-  {
-    this->_M_next = __position;
-    this->_M_prev = __position->_M_prev;
-    __position->_M_prev->_M_next = this;
-    __position->_M_prev = this;
-  }
-
-  void
-  _List_node_base::unhook() throw ()
-  {
-    _List_node_base* const __next_node = this->_M_next;
-    _List_node_base* const __prev_node = this->_M_prev;
-    __prev_node->_M_next = __next_node;
-    __next_node->_M_prev = __prev_node;
-  }
-
-_GLIBCXX_END_NAMESPACE_COMPAT
-
-} // namespace std
diff --git a/libstdc++-v3/src/c++98/compatibility-parallel_list-2.cc b/libstdc++-v3/src/c++98/compatibility-parallel_list-2.cc
deleted file mode 100644
index 8dc837a..0000000
--- a/libstdc++-v3/src/c++98/compatibility-parallel_list-2.cc
+++ /dev/null
@@ -1,28 +0,0 @@ 
-// Compatibility symbols for previous versions, parallel list -*- C++ -*-
-
-// Copyright (C) 2011 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library.  This library 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 3, or (at your option)
-// any later version.
-
-// This library 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.
-
-// Under Section 7 of GPL version 3, you are granted additional
-// permissions described in the GCC Runtime Library Exception, version
-// 3.1, as published by the Free Software Foundation.
-
-// You should have received a copy of the GNU General Public License and
-// a copy of the GCC Runtime Library Exception along with this program;
-// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-// <http://www.gnu.org/licenses/>.
-
-#define _GLIBCXX_BEGIN_NAMESPACE_COMPAT namespace __cxx1998 {
-#define _GLIBCXX_END_NAMESPACE_COMPAT }
-
-#include "compatibility-list-2.cc"
diff --git a/libstdc++-v3/src/c++98/compatibility-parallel_list.cc b/libstdc++-v3/src/c++98/compatibility-parallel_list.cc
deleted file mode 100644
index 05e50fa..0000000
--- a/libstdc++-v3/src/c++98/compatibility-parallel_list.cc
+++ /dev/null
@@ -1,28 +0,0 @@ 
-// Compatibility symbols for previous versions, parallel list -*- C++ -*-
-
-// Copyright (C) 2010, 2011 Free Software Foundation, Inc.
-//
-// This file is part of the GNU ISO C++ Library.  This library 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 3, or (at your option)
-// any later version.
-
-// This library 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.
-
-// Under Section 7 of GPL version 3, you are granted additional
-// permissions described in the GCC Runtime Library Exception, version
-// 3.1, as published by the Free Software Foundation.
-
-// You should have received a copy of the GNU General Public License and
-// a copy of the GCC Runtime Library Exception along with this program;
-// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
-// <http://www.gnu.org/licenses/>.
-
-#define _GLIBCXX_BEGIN_NAMESPACE_COMPAT namespace __cxx1998 {
-#define _GLIBCXX_END_NAMESPACE_COMPAT }
-
-#include "compatibility-list.cc"
diff --git a/libstdc++-v3/src/c++98/list-aux-2.cc b/libstdc++-v3/src/c++98/list-aux-2.cc
new file mode 100644
index 0000000..0e118ff
--- /dev/null
+++ b/libstdc++-v3/src/c++98/list-aux-2.cc
@@ -0,0 +1,117 @@ 
+// Compatibility symbols for previous versions, list bits -*- C++ -*-
+
+// Copyright (C) 2011, 2012 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library 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 3, or (at your option)
+// any later version.
+
+// This library 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.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+#include <bits/move.h>
+
+#ifdef _GLIBCXX_SHARED
+
+#ifndef _GLIBCXX_BEGIN_NAMESPACE_COMPAT
+# define _GLIBCXX_BEGIN_NAMESPACE_COMPAT
+#endif
+
+#ifndef _GLIBCXX_END_NAMESPACE_COMPAT
+# define _GLIBCXX_END_NAMESPACE_COMPAT
+#endif
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+_GLIBCXX_BEGIN_NAMESPACE_COMPAT
+
+  struct _List_node_base
+  {
+    _List_node_base* _M_next;
+    _List_node_base* _M_prev;
+
+    void
+    _M_transfer(_List_node_base * const __first,
+		_List_node_base * const __last) _GLIBCXX_USE_NOEXCEPT;
+
+    void
+    _M_reverse() _GLIBCXX_USE_NOEXCEPT;
+
+    void
+    _M_hook(_List_node_base * const __position) _GLIBCXX_USE_NOEXCEPT;
+
+    void
+    _M_unhook() _GLIBCXX_USE_NOEXCEPT;
+  };
+
+  void
+  _List_node_base::
+  _M_transfer(_List_node_base * const __first,
+	      _List_node_base * const __last) _GLIBCXX_USE_NOEXCEPT
+  {
+    if (this != __last)
+    {
+      // Remove [first, last) from its old position.
+      __last->_M_prev->_M_next  = this;
+      __first->_M_prev->_M_next = __last;
+      this->_M_prev->_M_next    = __first;
+
+      // Splice [first, last) into its new position.
+      _List_node_base* const __tmp = this->_M_prev;
+      this->_M_prev                = __last->_M_prev;
+      __last->_M_prev              = __first->_M_prev;
+      __first->_M_prev             = __tmp;
+    }
+  }
+
+  void
+  _List_node_base::_M_reverse() _GLIBCXX_USE_NOEXCEPT
+  {
+    _List_node_base* __tmp = this;
+    do
+    {
+      std::swap(__tmp->_M_next, __tmp->_M_prev);
+
+      // Old next node is now prev.
+      __tmp = __tmp->_M_prev;
+    }
+    while (__tmp != this);
+  }
+
+  void
+  _List_node_base::
+  _M_hook(_List_node_base* const __position) _GLIBCXX_USE_NOEXCEPT
+  {
+    this->_M_next = __position;
+    this->_M_prev = __position->_M_prev;
+    __position->_M_prev->_M_next = this;
+    __position->_M_prev = this;
+  }
+
+  void
+  _List_node_base::_M_unhook() _GLIBCXX_USE_NOEXCEPT
+  {
+    _List_node_base* const __next_node = this->_M_next;
+    _List_node_base* const __prev_node = this->_M_prev;
+    __prev_node->_M_next = __next_node;
+    __next_node->_M_prev = __prev_node;
+  }
+
+_GLIBCXX_END_NAMESPACE_COMPAT
+
+} // namespace std
+
+#endif
diff --git a/libstdc++-v3/src/c++98/list-aux.cc b/libstdc++-v3/src/c++98/list-aux.cc
new file mode 100644
index 0000000..7e074a7
--- /dev/null
+++ b/libstdc++-v3/src/c++98/list-aux.cc
@@ -0,0 +1,146 @@ 
+// Compatibility symbols for previous versions, list bits -*- C++ -*-
+
+// Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library 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 3, or (at your option)
+// any later version.
+
+// This library 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.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+#include <bits/move.h>
+
+#ifndef _GLIBCXX_BEGIN_NAMESPACE_COMPAT
+# define _GLIBCXX_BEGIN_NAMESPACE_COMPAT
+#endif
+
+#ifndef _GLIBCXX_END_NAMESPACE_COMPAT
+# define _GLIBCXX_END_NAMESPACE_COMPAT
+#endif
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+_GLIBCXX_BEGIN_NAMESPACE_COMPAT
+
+  struct _List_node_base
+  {
+    _List_node_base* _M_next;
+    _List_node_base* _M_prev;
+
+    static void
+    swap(_List_node_base& __x, _List_node_base& __y) throw ();
+
+    void
+    transfer(_List_node_base * const __first,
+	     _List_node_base * const __last) throw ();
+
+    void
+    reverse() throw ();
+
+    void
+    hook(_List_node_base * const __position) throw ();
+
+    void
+    unhook() throw ();
+  };
+
+  void
+  _List_node_base::swap(_List_node_base& __x, _List_node_base& __y) throw()
+  {
+    if ( __x._M_next != &__x )
+      {
+	if ( __y._M_next != &__y )
+	  {
+	    // Both __x and __y are not empty.
+	    std::swap(__x._M_next,__y._M_next);
+	    std::swap(__x._M_prev,__y._M_prev);
+	    __x._M_next->_M_prev = __x._M_prev->_M_next = &__x;
+	    __y._M_next->_M_prev = __y._M_prev->_M_next = &__y;
+	  }
+	else
+	  {
+	    // __x is not empty, __y is empty.
+	    __y._M_next = __x._M_next;
+	    __y._M_prev = __x._M_prev;
+	    __y._M_next->_M_prev = __y._M_prev->_M_next = &__y;
+	    __x._M_next = __x._M_prev = &__x;
+	  }
+      }
+    else if ( __y._M_next != &__y )
+      {
+	// __x is empty, __y is not empty.
+	__x._M_next = __y._M_next;
+	__x._M_prev = __y._M_prev;
+	__x._M_next->_M_prev = __x._M_prev->_M_next = &__x;
+	__y._M_next = __y._M_prev = &__y;
+      }
+  }
+
+  void
+  _List_node_base::transfer(_List_node_base * const __first,
+			    _List_node_base * const __last) throw ()
+  {
+    if (this != __last)
+    {
+      // Remove [first, last) from its old position.
+      __last->_M_prev->_M_next  = this;
+      __first->_M_prev->_M_next = __last;
+      this->_M_prev->_M_next    = __first;
+
+      // Splice [first, last) into its new position.
+      _List_node_base* const __tmp = this->_M_prev;
+      this->_M_prev                = __last->_M_prev;
+      __last->_M_prev              = __first->_M_prev;
+      __first->_M_prev             = __tmp;
+    }
+  }
+
+  void
+  _List_node_base::reverse() throw ()
+  {
+    _List_node_base* __tmp = this;
+    do
+    {
+      std::swap(__tmp->_M_next, __tmp->_M_prev);
+
+      // Old next node is now prev.
+      __tmp = __tmp->_M_prev;
+    }
+    while (__tmp != this);
+  }
+
+  void
+  _List_node_base::hook(_List_node_base* const __position) throw ()
+  {
+    this->_M_next = __position;
+    this->_M_prev = __position->_M_prev;
+    __position->_M_prev->_M_next = this;
+    __position->_M_prev = this;
+  }
+
+  void
+  _List_node_base::unhook() throw ()
+  {
+    _List_node_base* const __next_node = this->_M_next;
+    _List_node_base* const __prev_node = this->_M_prev;
+    __prev_node->_M_next = __next_node;
+    __next_node->_M_prev = __prev_node;
+  }
+
+_GLIBCXX_END_NAMESPACE_COMPAT
+
+} // namespace std
diff --git a/libstdc++-v3/src/c++98/list_associated-2.cc b/libstdc++-v3/src/c++98/list_associated-2.cc
new file mode 100644
index 0000000..fd92a25
--- /dev/null
+++ b/libstdc++-v3/src/c++98/list_associated-2.cc
@@ -0,0 +1,28 @@ 
+// Default definitions when using namespace associations, list -*- C++ -*-
+
+// Copyright (C) 2011, 2012 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library 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 3, or (at your option)
+// any later version.
+
+// This library 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.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+#define _GLIBCXX_BEGIN_NAMESPACE_COMPAT namespace __cxx1998 {
+#define _GLIBCXX_END_NAMESPACE_COMPAT }
+
+#include "list-aux-2.cc"
diff --git a/libstdc++-v3/src/c++98/list_associated.cc b/libstdc++-v3/src/c++98/list_associated.cc
new file mode 100644
index 0000000..b2dd9e0
--- /dev/null
+++ b/libstdc++-v3/src/c++98/list_associated.cc
@@ -0,0 +1,29 @@ 
+
+// Default definitions when using namespace associations, list -*- C++ -*-
+
+// Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library 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 3, or (at your option)
+// any later version.
+
+// This library 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.
+
+// Under Section 7 of GPL version 3, you are granted additional
+// permissions described in the GCC Runtime Library Exception, version
+// 3.1, as published by the Free Software Foundation.
+
+// You should have received a copy of the GNU General Public License and
+// a copy of the GCC Runtime Library Exception along with this program;
+// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
+// <http://www.gnu.org/licenses/>.
+
+#define _GLIBCXX_BEGIN_NAMESPACE_COMPAT namespace __cxx1998 {
+#define _GLIBCXX_END_NAMESPACE_COMPAT }
+
+#include "list-aux.cc"