[libcxx-commits] [PATCH] D99516: [libc++] Avoid <climits> dependency in <thread>

Joerg Sonnenberger via Phabricator via libcxx-commits libcxx-commits at lists.llvm.org
Mon Mar 29 09:44:59 PDT 2021

joerg created this revision.
joerg requested review of this revision.
Herald added a project: libc++.
Herald added a subscriber: libcxx-commits.
Herald added a reviewer: libc++.

The standard guarantees sleep durations of 2^63-1 nanoseconds to work.
Instead of depending on INT64_MAX or ULONGLONG_MAX to exist via the
header pollution, fold the constant directly. That has the additional
positive side effect that it avoids long double arithmetic bugs in GCC.

  rG LLVM Github Monorepo



Index: libcxx/include/thread
--- libcxx/include/thread
+++ libcxx/include/thread
@@ -362,12 +362,11 @@
     if (__d > chrono::duration<_Rep, _Period>::zero())
-#if defined(_LIBCPP_COMPILER_GCC) && (__powerpc__ || __POWERPC__)
-    //  GCC's long double const folding is incomplete for IBM128 long doubles.
-        _LIBCPP_CONSTEXPR chrono::duration<long double> _Max = chrono::duration<long double>(ULLONG_MAX/1000000000ULL) ;
-        _LIBCPP_CONSTEXPR chrono::duration<long double> _Max = chrono::nanoseconds::max();
+        // The standard guarantees a 64bit signed integer resolution for nanoseconds,
+        // so use INT64_MAX / 1e9 as cut-off point. Use a constant to avoid <climits>
+        // and issues with long double folding on PowerPC with GCC.
+        _LIBCPP_CONSTEXPR chrono::duration<long double> _Max =
+            chrono::duration<long double>(9223372036.0L);
         chrono::nanoseconds __ns;
         if (__d < _Max)

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D99516.333912.patch
Type: text/x-patch
Size: 1050 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libcxx-commits/attachments/20210329/481c20ec/attachment.bin>

More information about the libcxx-commits mailing list