[libc-commits] [libc] 9fd052a - Revert "[libc][windows] start time API implementation (#117775)"

Joseph Huber via libc-commits libc-commits at lists.llvm.org
Thu Dec 5 12:43:24 PST 2024


Author: Joseph Huber
Date: 2024-12-05T14:43:06-06:00
New Revision: 9fd052a1223c19245664922c68c101a79cb694f0

URL: https://github.com/llvm/llvm-project/commit/9fd052a1223c19245664922c68c101a79cb694f0
DIFF: https://github.com/llvm/llvm-project/commit/9fd052a1223c19245664922c68c101a79cb694f0.diff

LOG: Revert "[libc][windows] start time API implementation (#117775)"

This reverts commit 0adff0af20c7d9bae8bd8bdf402506c10369ead1.

Breaks the GPU build

Added: 
    libc/src/__support/time/linux/clock_gettime.h
    libc/src/time/linux/time.cpp

Modified: 
    libc/config/windows/entrypoints.txt
    libc/hdr/CMakeLists.txt
    libc/hdr/time_macros.h
    libc/hdr/types/clockid_t.h
    libc/src/CMakeLists.txt
    libc/src/__support/time/CMakeLists.txt
    libc/src/__support/time/linux/CMakeLists.txt
    libc/src/__support/time/linux/clock_conversion.h
    libc/src/__support/time/linux/clock_gettime.cpp
    libc/src/time/CMakeLists.txt
    libc/src/time/linux/CMakeLists.txt
    libc/src/time/linux/clock.cpp
    libc/src/time/linux/clock_gettime.cpp
    libc/src/time/linux/gettimeofday.cpp
    libc/src/time/linux/timespec_get.cpp
    libc/test/src/CMakeLists.txt
    libc/test/src/__support/threads/linux/raw_mutex_test.cpp
    libc/test/src/time/CMakeLists.txt
    libc/test/src/time/time_test.cpp
    utils/bazel/llvm-project-overlay/libc/BUILD.bazel

Removed: 
    libc/include/llvm-libc-macros/windows/CMakeLists.txt
    libc/include/llvm-libc-macros/windows/time-macros-ext.h
    libc/src/__support/time/clock_gettime.h
    libc/src/__support/time/windows/CMakeLists.txt
    libc/src/__support/time/windows/clock_gettime.cpp
    libc/src/time/time.cpp


################################################################################
diff  --git a/libc/config/windows/entrypoints.txt b/libc/config/windows/entrypoints.txt
index d0796b85aec2af..8f0b50bcc83ea2 100644
--- a/libc/config/windows/entrypoints.txt
+++ b/libc/config/windows/entrypoints.txt
@@ -95,9 +95,6 @@ set(TARGET_LIBC_ENTRYPOINTS
 
     # errno.h entrypoints
     libc.src.errno.errno
-
-    # time.h entrypoints
-    libc.src.time.time
 )
 
 set(TARGET_LIBM_ENTRYPOINTS

diff  --git a/libc/hdr/CMakeLists.txt b/libc/hdr/CMakeLists.txt
index 5eb311f4bb2298..93da271f5e040b 100644
--- a/libc/hdr/CMakeLists.txt
+++ b/libc/hdr/CMakeLists.txt
@@ -135,18 +135,10 @@ add_proxy_header_library(
     libc.include.llvm-libc-macros.unistd_macros
 )
 
-if (WIN32)
-  set(windows_addtional_time_macros libc.include.llvm-libc-macros.windows.time_macros_ext)
-else()
-  set(windows_addtional_time_macros "")
-endif()
-
 add_proxy_header_library(
   time_macros
   HDRS
     time_macros.h
-  DEPENDS
-    ${windows_addtional_time_macros}
   FULL_BUILD_DEPENDS
     libc.include.time
     libc.include.llvm-libc-macros.time_macros

diff  --git a/libc/hdr/time_macros.h b/libc/hdr/time_macros.h
index 4488a24848c359..dc36fe66f7a802 100644
--- a/libc/hdr/time_macros.h
+++ b/libc/hdr/time_macros.h
@@ -19,10 +19,4 @@
 
 #endif // LLVM_LIBC_FULL_BUILD
 
-// TODO: For now, on windows, let's always include the extension header.
-// We will need to decide how to export this header.
-#ifdef _WIN32
-#include "include/llvm-libc-macros/windows/time-macros-ext.h"
-#endif // _WIN32
-
 #endif // LLVM_LIBC_HDR_TIME_MACROS_H

diff  --git a/libc/hdr/types/clockid_t.h b/libc/hdr/types/clockid_t.h
index 729e580aba4384..333342072a2ff2 100644
--- a/libc/hdr/types/clockid_t.h
+++ b/libc/hdr/types/clockid_t.h
@@ -9,8 +9,7 @@
 #ifndef LLVM_LIBC_HDR_TYPES_CLOCKID_T_H
 #define LLVM_LIBC_HDR_TYPES_CLOCKID_T_H
 
-// TODO: we will need to decide how to export extension to windows.
-#if defined(LIBC_FULL_BUILD) || defined(_WIN32)
+#ifdef LIBC_FULL_BUILD
 
 #include "include/llvm-libc-types/clockid_t.h"
 

diff  --git a/libc/include/llvm-libc-macros/windows/CMakeLists.txt b/libc/include/llvm-libc-macros/windows/CMakeLists.txt
deleted file mode 100644
index 48afc795178a0d..00000000000000
--- a/libc/include/llvm-libc-macros/windows/CMakeLists.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-add_header(
-  time_macros_ext
-  HDR
-    time-macros-ext.h
-)
-

diff  --git a/libc/include/llvm-libc-macros/windows/time-macros-ext.h b/libc/include/llvm-libc-macros/windows/time-macros-ext.h
deleted file mode 100644
index 71d914b4518771..00000000000000
--- a/libc/include/llvm-libc-macros/windows/time-macros-ext.h
+++ /dev/null
@@ -1,17 +0,0 @@
-//===-- Windows Time Macros Extension -------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_LIBC_MACROS_WINDOWS_TIME_MACROS_EXT_H
-#define LLVM_LIBC_MACROS_WINDOWS_TIME_MACROS_EXT_H
-
-#define CLOCK_MONOTONIC 0
-#define CLOCK_REALTIME 1
-#define CLOCK_PROCESS_CPUTIME_ID 2
-#define CLOCK_THREAD_CPUTIME_ID 3
-
-#endif // LLVM_LIBC_MACROS_WINDOWS_TIME_MACROS_EXT_H

diff  --git a/libc/src/CMakeLists.txt b/libc/src/CMakeLists.txt
index dd3b51886edfea..02c193e635362e 100644
--- a/libc/src/CMakeLists.txt
+++ b/libc/src/CMakeLists.txt
@@ -13,7 +13,6 @@ add_subdirectory(stdio)
 add_subdirectory(stdlib)
 add_subdirectory(string)
 add_subdirectory(wchar)
-add_subdirectory(time)
 
 if(${LIBC_TARGET_OS} STREQUAL "linux")
   add_subdirectory(dirent)
@@ -41,4 +40,5 @@ add_subdirectory(setjmp)
 add_subdirectory(signal)
 add_subdirectory(spawn)
 add_subdirectory(threads)
+add_subdirectory(time)
 add_subdirectory(locale)

diff  --git a/libc/src/__support/time/CMakeLists.txt b/libc/src/__support/time/CMakeLists.txt
index e73f2744b15a0e..89ddffb099388b 100644
--- a/libc/src/__support/time/CMakeLists.txt
+++ b/libc/src/__support/time/CMakeLists.txt
@@ -2,13 +2,6 @@ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS})
   add_subdirectory(${LIBC_TARGET_OS})
 endif()
 
-add_object_library(
-  clock_gettime
-  ALIAS
-  DEPENDS
-    libc.src.__support.time.${LIBC_TARGET_OS}.clock_gettime
-)
-
 add_header_library(
   units
   HDRS

diff  --git a/libc/src/__support/time/linux/CMakeLists.txt b/libc/src/__support/time/linux/CMakeLists.txt
index 6fec7eeba99add..94ed09e6521524 100644
--- a/libc/src/__support/time/linux/CMakeLists.txt
+++ b/libc/src/__support/time/linux/CMakeLists.txt
@@ -1,7 +1,7 @@
 add_object_library(
   clock_gettime
   HDRS
-    ../clock_gettime.h
+    clock_gettime.h
   SRCS
     clock_gettime.cpp
   DEPENDS

diff  --git a/libc/src/__support/time/linux/clock_conversion.h b/libc/src/__support/time/linux/clock_conversion.h
index ac5357d308d7c5..7a52873263a14c 100644
--- a/libc/src/__support/time/linux/clock_conversion.h
+++ b/libc/src/__support/time/linux/clock_conversion.h
@@ -10,7 +10,7 @@
 #define LLVM_LIBC_SRC___SUPPORT_TIME_LINUX_CLOCK_CONVERSION_H
 
 #include "src/__support/macros/config.h"
-#include "src/__support/time/clock_gettime.h"
+#include "src/__support/time/linux/clock_gettime.h"
 #include "src/__support/time/units.h"
 
 namespace LIBC_NAMESPACE_DECL {

diff  --git a/libc/src/__support/time/linux/clock_gettime.cpp b/libc/src/__support/time/linux/clock_gettime.cpp
index 944fc0a2b80fe7..3a0eca417724ac 100644
--- a/libc/src/__support/time/linux/clock_gettime.cpp
+++ b/libc/src/__support/time/linux/clock_gettime.cpp
@@ -6,7 +6,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "src/__support/time/clock_gettime.h"
+#include "src/__support/time/linux/clock_gettime.h"
 #include "hdr/types/clockid_t.h"
 #include "hdr/types/struct_timespec.h"
 #include "src/__support/OSUtil/linux/vdso.h"

diff  --git a/libc/src/__support/time/clock_gettime.h b/libc/src/__support/time/linux/clock_gettime.h
similarity index 72%
rename from libc/src/__support/time/clock_gettime.h
rename to libc/src/__support/time/linux/clock_gettime.h
index 584bf546cd60cd..f7f996ce7c1975 100644
--- a/libc/src/__support/time/clock_gettime.h
+++ b/libc/src/__support/time/linux/clock_gettime.h
@@ -6,17 +6,21 @@
 //
 //===----------------------------------------------------------------------===//
 
-#ifndef LLVM_LIBC_SRC___SUPPORT_TIME_CLOCK_GETTIME_H
-#define LLVM_LIBC_SRC___SUPPORT_TIME_CLOCK_GETTIME_H
+#ifndef LLVM_LIBC_SRC___SUPPORT_TIME_LINUX_CLOCK_GETTIME_H
+#define LLVM_LIBC_SRC___SUPPORT_TIME_LINUX_CLOCK_GETTIME_H
 
 #include "hdr/types/clockid_t.h"
 #include "hdr/types/struct_timespec.h"
 #include "src/__support/error_or.h"
 
+#if defined(SYS_clock_gettime64)
+#include <linux/time_types.h>
+#endif
+
 namespace LIBC_NAMESPACE_DECL {
 namespace internal {
 ErrorOr<int> clock_gettime(clockid_t clockid, timespec *ts);
 } // namespace internal
 } // namespace LIBC_NAMESPACE_DECL
 
-#endif // LLVM_LIBC_SRC___SUPPORT_TIME_CLOCK_GETTIME_H
+#endif // LLVM_LIBC_SRC___SUPPORT_TIME_LINUX_CLOCK_GETTIME_H

diff  --git a/libc/src/__support/time/windows/CMakeLists.txt b/libc/src/__support/time/windows/CMakeLists.txt
deleted file mode 100644
index 0f557ed8800802..00000000000000
--- a/libc/src/__support/time/windows/CMakeLists.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-add_object_library(
-  clock_gettime
-  HDRS
-    ../clock_gettime.h
-  SRCS
-    clock_gettime.cpp
-  DEPENDS
-    libc.hdr.types.struct_timespec
-    libc.hdr.types.clockid_t
-    libc.hdr.errno_macros
-    libc.src.__support.common
-    libc.src.__support.error_or
-    libc.src.__support.OSUtil.osutil
-    libc.src.__support.CPP.atomic
-    libc.src.__support.CPP.limits
-)

diff  --git a/libc/src/__support/time/windows/clock_gettime.cpp b/libc/src/__support/time/windows/clock_gettime.cpp
deleted file mode 100644
index c2536acf37d799..00000000000000
--- a/libc/src/__support/time/windows/clock_gettime.cpp
+++ /dev/null
@@ -1,150 +0,0 @@
-//===--- clock_gettime windows implementation -------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "hdr/time_macros.h"
-
-#include "src/__support/CPP/atomic.h"
-#include "src/__support/CPP/bit.h"
-#include "src/__support/CPP/limits.h"
-#include "src/__support/macros/optimization.h"
-#include "src/__support/time/clock_gettime.h"
-#include "src/__support/time/units.h"
-
-#define WIN32_LEAN_AND_MEAN
-#define NOMINMAX
-#include <Windows.h>
-
-namespace LIBC_NAMESPACE_DECL {
-namespace internal {
-static long long get_ticks_per_second() {
-  static cpp::Atomic<long long> frequency = 0;
-  // Relaxed ordering is enough. It is okay to record the frequency multiple
-  // times. The store operation itself is atomic and the value must propagate
-  // as required by cache coherence.
-  auto freq = frequency.load(cpp::MemoryOrder::RELAXED);
-  if (!freq) {
-    [[clang::uninitialized]] LARGE_INTEGER buffer;
-    // On systems that run Windows XP or later, the function will always
-    // succeed and will thus never return zero.
-    ::QueryPerformanceFrequency(&buffer);
-    frequency.store(buffer.QuadPart, cpp::MemoryOrder::RELAXED);
-    return buffer.QuadPart;
-  }
-  return freq;
-}
-
-ErrorOr<int> clock_gettime(clockid_t clockid, timespec *ts) {
-  using namespace time_units;
-  constexpr unsigned long long HNS_PER_SEC = 1_s_ns / 100ULL;
-  constexpr long long SEC_LIMIT =
-      cpp::numeric_limits<decltype(ts->tv_sec)>::max();
-  ErrorOr<int> ret = 0;
-  switch (clockid) {
-  default:
-    ret = cpp::unexpected(EINVAL);
-    break;
-
-  case CLOCK_MONOTONIC: {
-    // see
-    // https://learn.microsoft.com/en-us/windows/win32/sysinfo/acquiring-high-resolution-time-stamps
-    // Is the performance counter monotonic (non-decreasing)?
-    // Yes. QPC does not go backward.
-    [[clang::uninitialized]] LARGE_INTEGER buffer;
-    // On systems that run Windows XP or later, the function will always
-    // succeed and will thus never return zero.
-    ::QueryPerformanceCounter(&buffer);
-    long long freq = get_ticks_per_second();
-    long long ticks = buffer.QuadPart;
-    long long tv_sec = ticks / freq;
-    long long tv_nsec = (ticks % freq) * 1_s_ns / freq;
-    if (LIBC_UNLIKELY(tv_sec > SEC_LIMIT)) {
-      ret = cpp::unexpected(EOVERFLOW);
-      break;
-    }
-    ts->tv_sec = static_cast<decltype(ts->tv_sec)>(tv_sec);
-    ts->tv_nsec = static_cast<decltype(ts->tv_nsec)>(tv_nsec);
-    break;
-  }
-  case CLOCK_REALTIME: {
-    // https://learn.microsoft.com/en-us/windows/win32/api/sysinfoapi/nf-sysinfoapi-getsystemtimepreciseasfiletime
-    // GetSystemTimePreciseAsFileTime
-    // This function is best suited for high-resolution time-of-day
-    // measurements, or time stamps that are synchronized to UTC
-    [[clang::uninitialized]] FILETIME file_time;
-    [[clang::uninitialized]] ULARGE_INTEGER time;
-    ::GetSystemTimePreciseAsFileTime(&file_time);
-    time.LowPart = file_time.dwLowDateTime;
-    time.HighPart = file_time.dwHighDateTime;
-
-    // adjust to POSIX epoch (from Jan 1, 1601 to Jan 1, 1970)
-    constexpr unsigned long long POSIX_TIME_SHIFT =
-        (11644473600ULL * HNS_PER_SEC);
-    if (LIBC_UNLIKELY(POSIX_TIME_SHIFT > time.QuadPart)) {
-      ret = cpp::unexpected(EOVERFLOW);
-      break;
-    }
-    time.QuadPart -= (11644473600ULL * HNS_PER_SEC);
-    unsigned long long tv_sec = time.QuadPart / HNS_PER_SEC;
-    unsigned long long tv_nsec = (time.QuadPart % HNS_PER_SEC) * 100ULL;
-    if (LIBC_UNLIKELY(tv_sec > SEC_LIMIT)) {
-      ret = cpp::unexpected(EOVERFLOW);
-      break;
-    }
-    ts->tv_sec = static_cast<decltype(ts->tv_sec)>(tv_sec);
-    ts->tv_nsec = static_cast<decltype(ts->tv_nsec)>(tv_nsec);
-    break;
-  }
-  case CLOCK_PROCESS_CPUTIME_ID:
-  case CLOCK_THREAD_CPUTIME_ID: {
-    [[clang::uninitialized]] FILETIME creation_time;
-    [[clang::uninitialized]] FILETIME exit_time;
-    [[clang::uninitialized]] FILETIME kernel_time;
-    [[clang::uninitialized]] FILETIME user_time;
-    bool success;
-    if (clockid == CLOCK_PROCESS_CPUTIME_ID) {
-      // https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getprocesstimes
-      success = ::GetProcessTimes(::GetCurrentProcess(), &creation_time,
-                                  &exit_time, &kernel_time, &user_time);
-    } else {
-      // https://learn.microsoft.com/en-us/windows/win32/api/processthreadsapi/nf-processthreadsapi-getthreadtimes
-      success = ::GetThreadTimes(::GetCurrentThread(), &creation_time,
-                                 &exit_time, &kernel_time, &user_time);
-    }
-    if (!success) {
-      ret = cpp::unexpected(EINVAL);
-      break;
-    }
-    // https://learn.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-filetime
-    // It is not recommended that you add and subtract values from the FILETIME
-    // structure to obtain relative times. Instead, you should copy the low- and
-    // high-order parts of the file time to a ULARGE_INTEGER structure, perform
-    // 64-bit arithmetic on the QuadPart member, and copy the LowPart and
-    // HighPart members into the FILETIME structure.
-    auto kernel_time_hns = cpp::bit_cast<ULARGE_INTEGER>(kernel_time);
-    auto user_time_hns = cpp::bit_cast<ULARGE_INTEGER>(user_time);
-    unsigned long long total_time_hns =
-        kernel_time_hns.QuadPart + user_time_hns.QuadPart;
-
-    unsigned long long tv_sec = total_time_hns / HNS_PER_SEC;
-    unsigned long long tv_nsec = (total_time_hns % HNS_PER_SEC) * 100ULL;
-
-    if (LIBC_UNLIKELY(tv_sec > SEC_LIMIT)) {
-      ret = cpp::unexpected(EOVERFLOW);
-      break;
-    }
-
-    ts->tv_sec = static_cast<decltype(ts->tv_sec)>(tv_sec);
-    ts->tv_nsec = static_cast<decltype(ts->tv_nsec)>(tv_nsec);
-
-    break;
-  }
-  }
-  return ret;
-}
-} // namespace internal
-} // namespace LIBC_NAMESPACE_DECL

diff  --git a/libc/src/time/CMakeLists.txt b/libc/src/time/CMakeLists.txt
index 3e8e6882ffc5d4..f18e74a15e6fc2 100644
--- a/libc/src/time/CMakeLists.txt
+++ b/libc/src/time/CMakeLists.txt
@@ -106,15 +106,9 @@ add_entrypoint_object(
 
 add_entrypoint_object(
   time
-  SRCS
-    time.cpp
-  HDRS
-    time_func.h
+  ALIAS
   DEPENDS
-    libc.hdr.time_macros
-    libc.hdr.types.time_t
-    libc.src.__support.time.clock_gettime
-    libc.src.errno.errno
+    .${LIBC_TARGET_OS}.time
 )
 
 add_entrypoint_object(

diff  --git a/libc/src/time/linux/CMakeLists.txt b/libc/src/time/linux/CMakeLists.txt
index 314623f9f425e7..31fd7d1e64c85c 100644
--- a/libc/src/time/linux/CMakeLists.txt
+++ b/libc/src/time/linux/CMakeLists.txt
@@ -1,3 +1,16 @@
+add_entrypoint_object(
+  time
+  SRCS
+    time.cpp
+  HDRS
+    ../time_func.h
+  DEPENDS
+    libc.hdr.time_macros
+    libc.hdr.types.time_t
+    libc.src.__support.time.linux.clock_gettime
+    libc.src.errno.errno
+)
+
 add_entrypoint_object(
   timespec_get
   SRCS
@@ -7,7 +20,7 @@ add_entrypoint_object(
   DEPENDS
     libc.hdr.time_macros
     libc.hdr.types.struct_timespec
-    libc.src.__support.time.clock_gettime
+    libc.src.__support.time.linux.clock_gettime
     libc.src.errno.errno
 )
 
@@ -21,7 +34,7 @@ add_entrypoint_object(
     libc.hdr.time_macros
     libc.hdr.types.clock_t
     libc.src.__support.time.units
-    libc.src.__support.time.clock_gettime
+    libc.src.__support.time.linux.clock_gettime
     libc.src.__support.CPP.limits
     libc.src.errno.errno
 )
@@ -49,7 +62,7 @@ add_entrypoint_object(
   DEPENDS
     libc.hdr.types.clockid_t
     libc.hdr.types.struct_timespec
-    libc.src.__support.time.clock_gettime
+    libc.src.__support.time.linux.clock_gettime
     libc.src.errno.errno
 )
 
@@ -62,7 +75,7 @@ add_entrypoint_object(
   DEPENDS
     libc.hdr.time_macros
     libc.hdr.types.suseconds_t
-    libc.src.__support.time.clock_gettime
+    libc.src.__support.time.linux.clock_gettime
     libc.src.__support.time.units
     libc.src.errno.errno
 )

diff  --git a/libc/src/time/linux/clock.cpp b/libc/src/time/linux/clock.cpp
index ee4fa82b4f8944..f43e1bcad6a3a1 100644
--- a/libc/src/time/linux/clock.cpp
+++ b/libc/src/time/linux/clock.cpp
@@ -11,7 +11,7 @@
 #include "src/__support/CPP/limits.h"
 #include "src/__support/common.h"
 #include "src/__support/macros/config.h"
-#include "src/__support/time/clock_gettime.h"
+#include "src/__support/time/linux/clock_gettime.h"
 #include "src/__support/time/units.h"
 #include "src/errno/libc_errno.h"
 

diff  --git a/libc/src/time/linux/clock_gettime.cpp b/libc/src/time/linux/clock_gettime.cpp
index 743c644d65d024..a2b20a6dbc9879 100644
--- a/libc/src/time/linux/clock_gettime.cpp
+++ b/libc/src/time/linux/clock_gettime.cpp
@@ -9,7 +9,7 @@
 #include "src/time/clock_gettime.h"
 #include "src/__support/common.h"
 #include "src/__support/macros/config.h"
-#include "src/__support/time/clock_gettime.h"
+#include "src/__support/time/linux/clock_gettime.h"
 #include "src/errno/libc_errno.h"
 
 namespace LIBC_NAMESPACE_DECL {

diff  --git a/libc/src/time/linux/gettimeofday.cpp b/libc/src/time/linux/gettimeofday.cpp
index e8ddf482fc9840..19d9988ae73a6e 100644
--- a/libc/src/time/linux/gettimeofday.cpp
+++ b/libc/src/time/linux/gettimeofday.cpp
@@ -11,7 +11,7 @@
 #include "hdr/types/suseconds_t.h"
 #include "src/__support/common.h"
 #include "src/__support/macros/config.h"
-#include "src/__support/time/clock_gettime.h"
+#include "src/__support/time/linux/clock_gettime.h"
 #include "src/__support/time/units.h"
 #include "src/errno/libc_errno.h"
 

diff  --git a/libc/src/time/time.cpp b/libc/src/time/linux/time.cpp
similarity index 83%
rename from libc/src/time/time.cpp
rename to libc/src/time/linux/time.cpp
index 4a0b614a68ef5f..20fb86e8e29dbb 100644
--- a/libc/src/time/time.cpp
+++ b/libc/src/time/linux/time.cpp
@@ -9,14 +9,14 @@
 #include "hdr/time_macros.h"
 #include "src/__support/common.h"
 #include "src/__support/macros/config.h"
-#include "src/__support/time/clock_gettime.h"
+#include "src/__support/time/linux/clock_gettime.h"
 #include "src/errno/libc_errno.h"
 #include "src/time/time_func.h"
 
 namespace LIBC_NAMESPACE_DECL {
-// avoid inconsitent clang-format behavior
-using time_ptr_t = time_t *;
-LLVM_LIBC_FUNCTION(time_t, time, (time_ptr_t tp)) {
+
+LLVM_LIBC_FUNCTION(time_t, time, (time_t * tp)) {
+  // TODO: Use the Linux VDSO to fetch the time and avoid the syscall.
   struct timespec ts;
   auto result = internal::clock_gettime(CLOCK_REALTIME, &ts);
   if (!result.has_value()) {

diff  --git a/libc/src/time/linux/timespec_get.cpp b/libc/src/time/linux/timespec_get.cpp
index cf5174523aa4f9..ba9f8eb2e4426b 100644
--- a/libc/src/time/linux/timespec_get.cpp
+++ b/libc/src/time/linux/timespec_get.cpp
@@ -10,7 +10,7 @@
 #include "hdr/time_macros.h"
 #include "src/__support/common.h"
 #include "src/__support/macros/config.h"
-#include "src/__support/time/clock_gettime.h"
+#include "src/__support/time/linux/clock_gettime.h"
 #include "src/errno/libc_errno.h"
 
 namespace LIBC_NAMESPACE_DECL {

diff  --git a/libc/test/src/CMakeLists.txt b/libc/test/src/CMakeLists.txt
index 606f6d837e4fe7..8ac8f91e98d4cc 100644
--- a/libc/test/src/CMakeLists.txt
+++ b/libc/test/src/CMakeLists.txt
@@ -59,7 +59,6 @@ add_subdirectory(stdio)
 add_subdirectory(stdlib)
 add_subdirectory(string)
 add_subdirectory(wchar)
-add_subdirectory(time)
 
 # Depends on utilities in stdlib
 add_subdirectory(inttypes)
@@ -83,6 +82,7 @@ add_subdirectory(network)
 add_subdirectory(setjmp)
 add_subdirectory(signal)
 add_subdirectory(spawn)
+add_subdirectory(time)
 add_subdirectory(locale)
 
 if(${LIBC_TARGET_OS} STREQUAL "linux")

diff  --git a/libc/test/src/__support/threads/linux/raw_mutex_test.cpp b/libc/test/src/__support/threads/linux/raw_mutex_test.cpp
index dadc706421d06e..918f5d35c94f42 100644
--- a/libc/test/src/__support/threads/linux/raw_mutex_test.cpp
+++ b/libc/test/src/__support/threads/linux/raw_mutex_test.cpp
@@ -12,7 +12,7 @@
 #include "src/__support/OSUtil/syscall.h"
 #include "src/__support/threads/linux/raw_mutex.h"
 #include "src/__support/threads/sleep.h"
-#include "src/__support/time/clock_gettime.h"
+#include "src/__support/time/linux/clock_gettime.h"
 #include "src/stdlib/exit.h"
 #include "src/sys/mman/mmap.h"
 #include "src/sys/mman/munmap.h"

diff  --git a/libc/test/src/time/CMakeLists.txt b/libc/test/src/time/CMakeLists.txt
index d2a98677a55435..7151526b72b26d 100644
--- a/libc/test/src/time/CMakeLists.txt
+++ b/libc/test/src/time/CMakeLists.txt
@@ -157,8 +157,8 @@ add_libc_unittest(
   SRCS
     time_test.cpp
   DEPENDS
+    libc.include.time
     libc.src.time.time
-    libc.src.__support.time.clock_gettime
     libc.src.errno.errno
 )
 

diff  --git a/libc/test/src/time/time_test.cpp b/libc/test/src/time/time_test.cpp
index 7cdb4e834633e5..d3d4dc9a285158 100644
--- a/libc/test/src/time/time_test.cpp
+++ b/libc/test/src/time/time_test.cpp
@@ -9,6 +9,8 @@
 #include "src/time/time_func.h"
 #include "test/UnitTest/Test.h"
 
+#include <time.h>
+
 TEST(LlvmLibcTimeTest, SmokeTest) {
   time_t t1;
   time_t t2 = LIBC_NAMESPACE::time(&t1);

diff  --git a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
index 957b49fe6afe8e..c5a0076d2ef308 100644
--- a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
+++ b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
@@ -1471,13 +1471,13 @@ libc_support_library(
     }),
     deps = [
         ":__support_time",
-        ":__support_time_clock_gettime",
+        ":__support_time_linux_clock_gettime",
     ],
 )
 
 libc_support_library(
-    name = "__support_time_clock_gettime",
-    hdrs = ["src/__support/time/clock_gettime.h"],
+    name = "__support_time_linux_clock_gettime",
+    hdrs = ["src/__support/time/linux/clock_gettime.h"],
     target_compatible_with = select({
         "@platforms//os:linux": [],
         "//conditions:default": ["@platforms//:incompatible"],


        


More information about the libc-commits mailing list