2013-05-24  Benjamin Kosnik  <bkoz@redhat.com>

	* include/std/chrono: Wrap clocks in inline namespace _V2.
	* src/c++11/chrono.cc: Same.
	* src/c++11/compatibility-chrono.cc: Revert to previous chrono.cc
	file, with default configure macros selected.

	* config/abi/pre/gnu.ver (GLIBCXX_3.4.19): Use symbols from inline
	namespace.
	* config/abi/post/x86_64-linux-gnu/baseline_symbols.txt: Fix up.

diff --git a/libstdc++-v3/config/abi/post/x86_64-linux-gnu/baseline_symbols.txt b/libstdc++-v3/config/abi/post/x86_64-linux-gnu/baseline_symbols.txt
index 165638b..0217375 100644
--- a/libstdc++-v3/config/abi/post/x86_64-linux-gnu/baseline_symbols.txt
+++ b/libstdc++-v3/config/abi/post/x86_64-linux-gnu/baseline_symbols.txt
@@ -1937,9 +1937,9 @@ FUNC:_ZNSt6__norm15_List_node_base7_M_hookEPS0_@@GLIBCXX_3.4.14
 FUNC:_ZNSt6__norm15_List_node_base7reverseEv@@GLIBCXX_3.4.9
 FUNC:_ZNSt6__norm15_List_node_base8transferEPS0_S1_@@GLIBCXX_3.4.9
 FUNC:_ZNSt6__norm15_List_node_base9_M_unhookEv@@GLIBCXX_3.4.14
-FUNC:_ZNSt6chrono12steady_clock3nowEv@@GLIBCXX_3.4.19
-FUNC:_ZNSt6chrono12steady_clock3nowEv@GLIBCXX_3.4.17
 FUNC:_ZNSt6chrono12system_clock3nowEv@@GLIBCXX_3.4.11
+FUNC:_ZNSt6chrono3_V212steady_clock3nowEv@@GLIBCXX_3.4.19
+FUNC:_ZNSt6chrono3_V212system_clock3nowEv@@GLIBCXX_3.4.19
 FUNC:_ZNSt6gslice8_IndexerC1EmRKSt8valarrayImES4_@@GLIBCXX_3.4
 FUNC:_ZNSt6gslice8_IndexerC2EmRKSt8valarrayImES4_@@GLIBCXX_3.4
 FUNC:_ZNSt6locale11_M_coalesceERKS_S1_i@@GLIBCXX_3.4
@@ -2953,6 +2953,8 @@ OBJECT:1:_ZNSt21__numeric_limits_base9is_iec559E@@GLIBCXX_3.4
 OBJECT:1:_ZNSt21__numeric_limits_base9is_moduloE@@GLIBCXX_3.4
 OBJECT:1:_ZNSt21__numeric_limits_base9is_signedE@@GLIBCXX_3.4
 OBJECT:1:_ZNSt6chrono12system_clock12is_monotonicE@@GLIBCXX_3.4.11
+OBJECT:1:_ZNSt6chrono3_V212steady_clock9is_steadyE@@GLIBCXX_3.4.19
+OBJECT:1:_ZNSt6chrono3_V212system_clock9is_steadyE@@GLIBCXX_3.4.19
 OBJECT:1:_ZSt10adopt_lock@@GLIBCXX_3.4.11
 OBJECT:1:_ZSt10defer_lock@@GLIBCXX_3.4.11
 OBJECT:1:_ZSt11try_to_lock@@GLIBCXX_3.4.11
diff --git a/libstdc++-v3/config/abi/pre/gnu.ver b/libstdc++-v3/config/abi/pre/gnu.ver
index 9c64a0d..9e1f4da 100644
--- a/libstdc++-v3/config/abi/pre/gnu.ver
+++ b/libstdc++-v3/config/abi/pre/gnu.ver
@@ -1320,11 +1320,8 @@ GLIBCXX_3.4.17 {
     _ZNSt13__future_base19_Async_state_commonD1Ev;
     _ZNSt13__future_base19_Async_state_commonD2Ev;
 
-#ifdef HAVE_SYMVER_SYMBOL_RENAMING_RUNTIME_SUPPORT
-   # GLIBCXX_ABI compatibility only.
     # std::chrono::steady_clock::now()
     _ZNSt6chrono12steady_clock3nowEv;
-#endif
 
 } GLIBCXX_3.4.16;
 
@@ -1349,8 +1346,11 @@ GLIBCXX_3.4.18 {
 
 GLIBCXX_3.4.19 {
 
-    # std::chrono::steady_clock::now()
-    _ZNSt6chrono12steady_clock3nowEv;
+    # chrono second generation
+    _ZNSt6chrono3_V212steady_clock3nowEv;
+    _ZNSt6chrono3_V212steady_clock9is_steadyE;
+    _ZNSt6chrono3_V212system_clock3nowEv;
+    _ZNSt6chrono3_V212system_clock9is_steadyE;
 
 } GLIBCXX_3.4.18;
 
diff --git a/libstdc++-v3/include/std/chrono b/libstdc++-v3/include/std/chrono
index 7111319..19ea8c1 100644
--- a/libstdc++-v3/include/std/chrono
+++ b/libstdc++-v3/include/std/chrono
@@ -686,6 +686,15 @@ _GLIBCXX_END_NAMESPACE_VERSION
 		 const time_point<_Clock, _Dur2>& __rhs)
       { return !(__lhs < __rhs); }
 
+    // To support the (forward) evolving definition of the library's
+    // defined clocks, wrap inside inline namespace so that these
+    // types are uniquely mangled. This way, new code can use the
+    // current clocks, while the library can contain old definitions.
+    // At some point, when these clocks settle down, the inlined
+    // namespaces can be removed.
+    // XXX GLIBCXX_ABI Deprecated
+    inline namespace _V2 {
+
     /// system_clock
     struct system_clock
     {
@@ -742,10 +751,18 @@ _GLIBCXX_END_NAMESPACE_VERSION
       now() noexcept;
     };
 #else
-    typedef system_clock steady_clock;
+    // Forward declare only.
+    struct steady_clock;
 #endif
 
+#ifdef _GLIBCXX_USE_CLOCK_REALTIME
     typedef system_clock high_resolution_clock;
+#else
+    // Forward declare only.
+    struct high_resolution_clock;
+#endif
+
+  } // end inline namespace _V2
 
   _GLIBCXX_END_NAMESPACE_VERSION
   } // namespace chrono
diff --git a/libstdc++-v3/src/c++11/chrono.cc b/libstdc++-v3/src/c++11/chrono.cc
index 15de4eb..219d674 100644
--- a/libstdc++-v3/src/c++11/chrono.cc
+++ b/libstdc++-v3/src/c++11/chrono.cc
@@ -23,28 +23,17 @@
 // <http://www.gnu.org/licenses/>.
 
 #include <bits/c++config.h>
-
-#ifndef _GLIBCXX_USE_CLOCK_MONOTONIC
-// If !_GLIBCXX_USE_CLOCK_MONOTONIC, std::chrono::steady_clock
-// is just a typedef to std::chrono::system_clock, for ABI compatibility
-// force it not to be a typedef now and export it anyway.  Programs
-// using the headers where it is a typedef will actually just use
-// std::chrono::system_clock instead, and this remains here just as a fallback.
-#define _GLIBCXX_USE_CLOCK_MONOTONIC
-#include <chrono>
-#undef _GLIBCXX_USE_CLOCK_MONOTONIC
-#else
 #include <chrono>
-#endif
 
 #ifdef _GLIBCXX_USE_C99_STDINT_TR1
 
-// conditional inclusion of sys/time.h for gettimeofday
+// Conditional inclusion of sys/time.h for gettimeofday
 #if !defined(_GLIBCXX_USE_CLOCK_MONOTONIC) && \
     !defined(_GLIBCXX_USE_CLOCK_REALTIME) && \
      defined(_GLIBCXX_USE_GETTIMEOFDAY)
 #include <sys/time.h>
 #endif
+
 #ifdef _GLIBCXX_USE_CLOCK_GETTIME_SYSCALL
 #include <unistd.h>
 #include <sys/syscall.h>
@@ -56,7 +45,9 @@ namespace std _GLIBCXX_VISIBILITY(default)
   {
   _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
-#ifndef _GLIBCXX_COMPATIBILITY_CXX0X
+    // XXX GLIBCXX_ABI Deprecated
+    inline namespace _V2 {
+
     constexpr bool system_clock::is_steady;
 
     system_clock::time_point
@@ -83,11 +74,9 @@ namespace std _GLIBCXX_VISIBILITY(default)
       return system_clock::from_time_t(__sec);
 #endif
     }
-#endif
+
     
-#ifndef _GLIBCXX_COMPATIBILITY_CXX0X
     constexpr bool steady_clock::is_steady;
-#endif
 
 #if defined(_GLIBCXX_SYMVER_GNU) && defined(_GLIBCXX_SHARED) \
     && defined(_GLIBCXX_HAVE_AS_SYMVER_DIRECTIVE) \
@@ -113,6 +102,8 @@ namespace std _GLIBCXX_VISIBILITY(default)
 #endif
     }
 
+  } // end inline namespace _V2
+
   _GLIBCXX_END_NAMESPACE_VERSION
   } // namespace chrono
 } // namespace std
diff --git a/libstdc++-v3/src/c++11/compatibility-chrono.cc b/libstdc++-v3/src/c++11/compatibility-chrono.cc
index ada0946..60d2108 100644
--- a/libstdc++-v3/src/c++11/compatibility-chrono.cc
+++ b/libstdc++-v3/src/c++11/compatibility-chrono.cc
@@ -22,37 +22,84 @@
 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 // <http://www.gnu.org/licenses/>.
 
-#define _GLIBCXX_COMPATIBILITY_CXX0X
 #include <bits/c++config.h>
 
-#if defined(_GLIBCXX_SYMVER_GNU) && defined(_GLIBCXX_SHARED) \
-    && defined(_GLIBCXX_HAVE_AS_SYMVER_DIRECTIVE)\
-    && defined(_GLIBCXX_HAVE_SYMVER_SYMBOL_RENAMING_RUNTIME_SUPPORT)
+#ifdef _GLIBCXX_USE_C99_STDINT_TR1
 
+#ifdef _GLIBCXX_USE_GETTIMEOFDAY
+#include <sys/time.h>
+#endif
+
+#define system_clock system_clockXX
 #define steady_clock steady_clockXX
-#include "chrono.cc"
-
-// The rename syntax for default exported names is
-//   asm (".symver name1,exportedname@GLIBCXX_3.4.17")
-//   asm (".symver name2,exportedname@@GLIBCXX_3.4.19")
-// In the future, GLIBCXX_ABI > 6 should remove all uses of
-// _GLIBCXX_*_SYMVER macros in this file.
-
-#define _GLIBCXX_3_4_17_SYMVER(XXname, name) \
-   extern "C" void \
-   _X##name() \
-   __attribute__ ((alias(#XXname))); \
-   asm (".symver " "_X" #name "," #name "@GLIBCXX_3.4.17");
-
-#define _GLIBCXX_3_4_19_SYMVER(XXname, name) \
-   extern "C" void \
-   _Y##name() \
-   __attribute__ ((alias(#XXname))); \
-   asm (".symver " "_Y" #name  "," #name "@@GLIBCXX_3.4.19");
-
-_GLIBCXX_3_4_17_SYMVER(_ZNSt6chrono14steady_clockXX3nowEv,
-		       _ZNSt6chrono12steady_clock3nowEv)
-_GLIBCXX_3_4_19_SYMVER(_ZNSt6chrono14steady_clockXX3nowEv,
-		       _ZNSt6chrono12steady_clock3nowEv)
+#include <chrono>
+#undef system_clock
+#undef steady_clock
 
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+  namespace chrono
+  {
+  _GLIBCXX_BEGIN_NAMESPACE_VERSION
+ 
+    // NB: Default configuration was no realtime.
+    struct system_clock
+    {
+#ifdef _GLIBCXX_USE_GETTIMEOFDAY
+      typedef chrono::microseconds    				duration;
+#else
+      typedef chrono::seconds	      				duration;
 #endif
+
+      typedef duration::rep    					rep;
+      typedef duration::period 					period;
+      typedef chrono::time_point<system_clock, duration> 	time_point;
+
+      static_assert(system_clock::duration::min()
+		    < system_clock::duration::zero(),
+		    "a clock's minimum duration cannot be less than its epoch");
+
+      static constexpr bool is_steady = false;
+
+      static time_point
+      now() noexcept;
+
+      // Map to C API
+      static std::time_t
+      to_time_t(const time_point& __t) noexcept
+      {
+	return std::time_t(duration_cast<chrono::seconds>
+			   (__t.time_since_epoch()).count());
+      }
+
+      static time_point
+      from_time_t(std::time_t __t) noexcept
+      {
+	typedef chrono::time_point<system_clock, seconds>	__from;
+	return time_point_cast<system_clock::duration>
+	       (__from(chrono::seconds(__t)));
+      }
+    };
+
+    constexpr bool system_clock::is_steady;
+
+    system_clock::time_point
+    system_clock::now() noexcept
+    {
+#ifdef _GLIBCXX_USE_GETTIMEOFDAY
+      timeval tv;
+      // EINVAL, EFAULT
+      gettimeofday(&tv, 0);
+      return time_point(duration(chrono::seconds(tv.tv_sec)
+				 + chrono::microseconds(tv.tv_usec)));
+#else
+      std::time_t __sec = std::time(0);
+      return system_clock::from_time_t(__sec);
+#endif
+    }
+
+  _GLIBCXX_END_NAMESPACE_VERSION
+  } // namespace chrono
+} // namespace std
+
+#endif // _GLIBCXX_USE_C99_STDINT_TR1
