https://gcc.gnu.org/g:806de30f51c8b959d031b375ec13343c20b864cf

commit r16-3416-g806de30f51c8b959d031b375ec13343c20b864cf
Author: Nathan Myers <n...@cantrip.org>
Date:   Wed Aug 20 20:24:29 2025 -0400

    libstdc++: Move tai_- and gps_clock::now impls out of ABI
    
    This patch moves std::tai_clock::now() and std::tai_clock::now()
    definitions from header inlines to static members invoked via a
    normal function call, in service of stabilizing the C++20 ABI.
    
    It also changes #if guards to mention the actual __cpp_lib_*
    feature gated, not just the language version, for clarity.
    
    New global function symbols std::chrono::tai_clock::now
    and std::chrono::gps_clock::now are exported.
    
    libstdc++-v3/ChangeLog:
            * include/std/chrono (gps_clock::now, tai_clock::now): Remove
            inline definitions.
            * src/c++20/clock.cc (gps_clock::now, tai_clock::now): New file
            for out-of-line now() impls.
            * src/c++20/Makefile.am: Mention clock.cc.
            * src/c++20/Makefile.in: Regenerate.
            * config/abi/pre/gnu.ver: add mangled now() symbols.

Diff:
---
 libstdc++-v3/config/abi/pre/gnu.ver |  4 +++
 libstdc++-v3/include/std/chrono     | 32 +++++++++++------------
 libstdc++-v3/src/c++20/Makefile.am  |  2 +-
 libstdc++-v3/src/c++20/Makefile.in  |  4 +--
 libstdc++-v3/src/c++20/clock.cc     | 52 +++++++++++++++++++++++++++++++++++++
 5 files changed, 74 insertions(+), 20 deletions(-)

diff --git a/libstdc++-v3/config/abi/pre/gnu.ver 
b/libstdc++-v3/config/abi/pre/gnu.ver
index b5a89c31e0eb..e1601dc39d25 100644
--- a/libstdc++-v3/config/abi/pre/gnu.ver
+++ b/libstdc++-v3/config/abi/pre/gnu.ver
@@ -2555,6 +2555,10 @@ GLIBCXX_3.4.35 {
     
_ZNSt8__detail17__wait_until_implEPKvRNS_16__wait_args_baseERKNSt6chrono8durationI[lx]St5ratioIL[lx]1EL[lx]1000000000EEEE;
     _ZNSt8__detail11__wait_args22_M_load_proxy_wait_valEPKv;
 
+    # std::chrono::gps_clock::now, tai_clock::now
+    _ZNSt6chrono9gps_clock3nowEv;
+    _ZNSt6chrono9tai_clock3nowEv;
+
     # __gnu_debug::_Safe_iterator_base and _Safe_sequence_base const
     
_ZN11__gnu_debug19_Safe_iterator_base9_M_attachEPKNS_19_Safe_sequence_baseEb;
     
_ZN11__gnu_debug19_Safe_iterator_base16_M_attach_singleEPKNS_19_Safe_sequence_baseEb;
diff --git a/libstdc++-v3/include/std/chrono b/libstdc++-v3/include/std/chrono
index cb8213e2f9f9..d1a01fbdf0a8 100644
--- a/libstdc++-v3/include/std/chrono
+++ b/libstdc++-v3/include/std/chrono
@@ -22,6 +22,8 @@
 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 // <http://www.gnu.org/licenses/>.
 
+// [time]
+
 /** @file include/chrono
  *  This is a Standard C++ Library header.
  *  @ingroup chrono
@@ -42,12 +44,16 @@
 # include <bits/c++0x_warning.h>
 #else
 
+#define __glibcxx_want_chrono
+#define __glibcxx_want_chrono_udls
+#include <bits/version.h>
+
 #include <bits/chrono.h>
 
-#if __cplusplus >= 202002L
+#if __cpp_lib_bitops >= 201907L
 # include <bit> // __countr_zero
 #endif
-#if __cplusplus >= 202002L && _GLIBCXX_HOSTED
+#if __cpp_lib_chrono >= 201803L && _GLIBCXX_HOSTED
 # include <sstream>
 # include <string>
 # include <vector>
@@ -56,10 +62,6 @@
 # include <bits/unique_ptr.h>
 #endif
 
-#define __glibcxx_want_chrono
-#define __glibcxx_want_chrono_udls
-#include <bits/version.h>
-
 namespace std _GLIBCXX_VISIBILITY(default)
 {
 _GLIBCXX_BEGIN_NAMESPACE_VERSION
@@ -79,7 +81,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
    */
   namespace chrono
   {
-#if __cplusplus >= 202002L
+#if __cpp_lib_chrono >= 201803L
     /// @addtogroup chrono
     /// @{
     struct local_t { };
@@ -175,13 +177,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       using period                    = system_clock::period;
       using duration                  = chrono::duration<rep, period>;
       using time_point                = chrono::time_point<tai_clock>;
-      static constexpr bool is_steady = false; // XXX true for CLOCK_TAI?
+      static constexpr bool is_steady = false;
 
-      // TODO move into lib, use CLOCK_TAI on linux, add extension point.
       [[nodiscard]]
       static time_point
-      now()
-      { return from_utc(utc_clock::now()); }
+      now();  // in src/c++20/clock.cc
 
       template<typename _Duration>
        [[nodiscard]]
@@ -215,13 +215,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       using period                    = system_clock::period;
       using duration                  = chrono::duration<rep, period>;
       using time_point                = chrono::time_point<gps_clock>;
-      static constexpr bool is_steady = false; // XXX
+      static constexpr bool is_steady = false;
 
-      // TODO move into lib, add extension point.
       [[nodiscard]]
       static time_point
-      now()
-      { return from_utc(utc_clock::now()); }
+      now();  // in src/c++20/clock.cc
 
       template<typename _Duration>
        [[nodiscard]]
@@ -3321,7 +3319,7 @@ namespace __detail
 #endif // C++20
   } // namespace chrono
 
-#if __cplusplus >= 202002L
+#if __cpp_lib_chrono >= 201803L
   inline namespace literals
   {
   inline namespace chrono_literals
@@ -3350,7 +3348,7 @@ namespace __detail
 _GLIBCXX_END_NAMESPACE_VERSION
 } // namespace std
 
-#if __cplusplus >= 202002L && _GLIBCXX_HOSTED
+#if __cpp_lib_chrono >= 201803L && _GLIBCXX_HOSTED
 # include <bits/chrono_io.h>
 #endif
 
diff --git a/libstdc++-v3/src/c++20/Makefile.am 
b/libstdc++-v3/src/c++20/Makefile.am
index 15e6f3445fb6..736558ff24a7 100644
--- a/libstdc++-v3/src/c++20/Makefile.am
+++ b/libstdc++-v3/src/c++20/Makefile.am
@@ -36,7 +36,7 @@ else
 inst_sources =
 endif
 
-sources = tzdb.cc format.cc atomic.cc
+sources = tzdb.cc format.cc atomic.cc clock.cc
 
 vpath % $(top_srcdir)/src/c++20
 
diff --git a/libstdc++-v3/src/c++20/Makefile.in 
b/libstdc++-v3/src/c++20/Makefile.in
index d9e1615bbca8..3cb6d6fea5f3 100644
--- a/libstdc++-v3/src/c++20/Makefile.in
+++ b/libstdc++-v3/src/c++20/Makefile.in
@@ -121,7 +121,7 @@ CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 LTLIBRARIES = $(noinst_LTLIBRARIES)
 libc__20convenience_la_LIBADD =
-am__objects_1 = tzdb.lo format.lo atomic.lo
+am__objects_1 = tzdb.lo format.lo atomic.lo clock.lo
 @ENABLE_EXTERN_TEMPLATE_TRUE@am__objects_2 = sstream-inst.lo
 @GLIBCXX_HOSTED_TRUE@am_libc__20convenience_la_OBJECTS =  \
 @GLIBCXX_HOSTED_TRUE@  $(am__objects_1) $(am__objects_2)
@@ -432,7 +432,7 @@ headers =
 @ENABLE_EXTERN_TEMPLATE_TRUE@inst_sources = \
 @ENABLE_EXTERN_TEMPLATE_TRUE@  sstream-inst.cc
 
-sources = tzdb.cc format.cc atomic.cc
+sources = tzdb.cc format.cc atomic.cc clock.cc
 @GLIBCXX_HOSTED_FALSE@libc__20convenience_la_SOURCES = 
 @GLIBCXX_HOSTED_TRUE@libc__20convenience_la_SOURCES = $(sources)  
$(inst_sources)
 
diff --git a/libstdc++-v3/src/c++20/clock.cc b/libstdc++-v3/src/c++20/clock.cc
new file mode 100644
index 000000000000..9d674b0b46a2
--- /dev/null
+++ b/libstdc++-v3/src/c++20/clock.cc
@@ -0,0 +1,52 @@
+// std::chrono::tai_clock, gps_clock
+
+// Copyright (C) 2021-2025 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/>.
+
+//
+// ISO C++ 14882:2020
+// 27.7.4 [time.clock.tai], 27.7.5 [time.clock.gps]
+// P0355R7
+
+#include <chrono>
+
+namespace std _GLIBCXX_VISIBILITY(default)
+{
+_GLIBCXX_BEGIN_NAMESPACE_VERSION
+
+namespace chrono
+{
+#if __cpp_lib_chrono >= 201803L && _GLIBCXX_HOSTED
+  // TODO use CLOCK_TAI on linux, add extension point.
+  time_point<tai_clock>
+  tai_clock::now()
+  { return from_utc(utc_clock::now()); }
+
+  // TODO add extension point.
+  time_point<gps_clock>
+  gps_clock::now()
+  { return from_utc(utc_clock::now()); }
+#endif
+}
+
+_GLIBCXX_END_NAMESPACE_VERSION
+}

Reply via email to