[libc-commits] [libc] [llvm] [libc] suppress more clang-cl warnings (PR #117718)
Schrodinger ZHU Yifan via libc-commits
libc-commits at lists.llvm.org
Tue Nov 26 11:47:21 PST 2024
https://github.com/SchrodingerZhu updated https://github.com/llvm/llvm-project/pull/117718
>From fdabbd72200af7388ad599524b568eebd577318a Mon Sep 17 00:00:00 2001
From: Schrodinger ZHU Yifan <i at zhuyi.fan>
Date: Tue, 26 Nov 2024 06:44:35 -0800
Subject: [PATCH 1/2] [libc] suppress more clang-cl warnings
---
.../__support/threads/linux/CMakeLists.txt | 2 +-
libc/src/complex/generic/CMakeLists.txt | 20 +++++++++----------
libc/src/pthread/CMakeLists.txt | 2 +-
libc/src/setjmp/riscv/CMakeLists.txt | 4 ++--
libc/src/setjmp/x86_64/CMakeLists.txt | 4 ++--
libc/src/signal/linux/CMakeLists.txt | 2 +-
libc/src/stdfix/CMakeLists.txt | 14 ++++++-------
libc/src/string/CMakeLists.txt | 2 +-
libc/src/threads/CMakeLists.txt | 2 +-
libc/test/src/math/smoke/LdExpTest.h | 3 ++-
10 files changed, 28 insertions(+), 27 deletions(-)
diff --git a/libc/src/__support/threads/linux/CMakeLists.txt b/libc/src/__support/threads/linux/CMakeLists.txt
index fa11458f99b6c9..47598d98c98863 100644
--- a/libc/src/__support/threads/linux/CMakeLists.txt
+++ b/libc/src/__support/threads/linux/CMakeLists.txt
@@ -88,7 +88,7 @@ add_object_library(
libc.src.__support.error_or
libc.src.__support.threads.thread_common
COMPILE_OPTIONS
- -O3
+ ${libc_opt_high_flag}
-fno-omit-frame-pointer # This allows us to sniff out the thread args from
# the new thread's stack reliably.
-Wno-frame-address # Yes, calling __builtin_return_address with a
diff --git a/libc/src/complex/generic/CMakeLists.txt b/libc/src/complex/generic/CMakeLists.txt
index a63871b32afbf1..a3da781c602378 100644
--- a/libc/src/complex/generic/CMakeLists.txt
+++ b/libc/src/complex/generic/CMakeLists.txt
@@ -5,7 +5,7 @@ add_entrypoint_object(
HDRS
../creal.h
COMPILE_OPTIONS
- -O3
+ ${libc_opt_high_flag}
DEPENDS
libc.src.__support.CPP.bit
libc.src.__support.complex_type
@@ -18,7 +18,7 @@ add_entrypoint_object(
HDRS
../crealf.h
COMPILE_OPTIONS
- -O3
+ ${libc_opt_high_flag}
DEPENDS
libc.src.__support.CPP.bit
libc.src.__support.complex_type
@@ -31,7 +31,7 @@ add_entrypoint_object(
HDRS
../creall.h
COMPILE_OPTIONS
- -O3
+ ${libc_opt_high_flag}
DEPENDS
libc.src.__support.CPP.bit
libc.src.__support.complex_type
@@ -44,7 +44,7 @@ add_entrypoint_object(
HDRS
../crealf16.h
COMPILE_OPTIONS
- -O3
+ ${libc_opt_high_flag}
DEPENDS
libc.src.__support.CPP.bit
libc.src.__support.complex_type
@@ -59,7 +59,7 @@ add_entrypoint_object(
HDRS
../crealf128.h
COMPILE_OPTIONS
- -O3
+ ${libc_opt_high_flag}
DEPENDS
libc.src.__support.CPP.bit
libc.src.__support.complex_type
@@ -74,7 +74,7 @@ add_entrypoint_object(
HDRS
../cimag.h
COMPILE_OPTIONS
- -O3
+ ${libc_opt_high_flag}
DEPENDS
libc.src.__support.CPP.bit
libc.src.__support.complex_type
@@ -87,7 +87,7 @@ add_entrypoint_object(
HDRS
../cimagf.h
COMPILE_OPTIONS
- -O3
+ ${libc_opt_high_flag}
DEPENDS
libc.src.__support.CPP.bit
libc.src.__support.complex_type
@@ -100,7 +100,7 @@ add_entrypoint_object(
HDRS
../cimagl.h
COMPILE_OPTIONS
- -O3
+ ${libc_opt_high_flag}
DEPENDS
libc.src.__support.CPP.bit
libc.src.__support.complex_type
@@ -113,7 +113,7 @@ add_entrypoint_object(
HDRS
../cimagf16.h
COMPILE_OPTIONS
- -O3
+ ${libc_opt_high_flag}
DEPENDS
libc.src.__support.CPP.bit
libc.src.__support.complex_type
@@ -128,7 +128,7 @@ add_entrypoint_object(
HDRS
../cimagf128.h
COMPILE_OPTIONS
- -O3
+ ${libc_opt_high_flag}
DEPENDS
libc.src.__support.CPP.bit
libc.src.__support.complex_type
diff --git a/libc/src/pthread/CMakeLists.txt b/libc/src/pthread/CMakeLists.txt
index 8480fd89422223..c8c66805667fa9 100644
--- a/libc/src/pthread/CMakeLists.txt
+++ b/libc/src/pthread/CMakeLists.txt
@@ -333,7 +333,7 @@ add_entrypoint_object(
libc.src.pthread.pthread_attr_getstack
libc.src.errno.errno
COMPILE_OPTIONS
- -O3
+ ${libc_opt_high_flag}
-fno-omit-frame-pointer
)
diff --git a/libc/src/setjmp/riscv/CMakeLists.txt b/libc/src/setjmp/riscv/CMakeLists.txt
index 464144758cbbea..c68e318a0f08ba 100644
--- a/libc/src/setjmp/riscv/CMakeLists.txt
+++ b/libc/src/setjmp/riscv/CMakeLists.txt
@@ -7,7 +7,7 @@ add_entrypoint_object(
DEPENDS
libc.hdr.types.jmp_buf
COMPILE_OPTIONS
- -O3
+ ${libc_opt_high_flag}
-fomit-frame-pointer
)
@@ -20,6 +20,6 @@ add_entrypoint_object(
DEPENDS
libc.hdr.types.jmp_buf
COMPILE_OPTIONS
- -O3
+ ${libc_opt_high_flag}
-fomit-frame-pointer
)
diff --git a/libc/src/setjmp/x86_64/CMakeLists.txt b/libc/src/setjmp/x86_64/CMakeLists.txt
index b5b0d9ba65599c..96d5751bc81dd2 100644
--- a/libc/src/setjmp/x86_64/CMakeLists.txt
+++ b/libc/src/setjmp/x86_64/CMakeLists.txt
@@ -7,7 +7,7 @@ add_entrypoint_object(
DEPENDS
libc.hdr.types.jmp_buf
COMPILE_OPTIONS
- -O3
+ ${libc_opt_high_flag}
)
add_entrypoint_object(
@@ -19,6 +19,6 @@ add_entrypoint_object(
DEPENDS
libc.hdr.types.jmp_buf
COMPILE_OPTIONS
- -O3
+ ${libc_opt_high_flag}
-fomit-frame-pointer
)
diff --git a/libc/src/signal/linux/CMakeLists.txt b/libc/src/signal/linux/CMakeLists.txt
index e314242dc376fb..f7457d31cf4f85 100644
--- a/libc/src/signal/linux/CMakeLists.txt
+++ b/libc/src/signal/linux/CMakeLists.txt
@@ -41,7 +41,7 @@ add_object_library(
__restore.cpp
COMPILE_OPTIONS
-fomit-frame-pointer
- -O3
+ ${libc_opt_high_flag}
-Wframe-larger-than=0
-Wno-attributes
# asan creates asan.module_ctor which uses stack space, causing warnings.
diff --git a/libc/src/stdfix/CMakeLists.txt b/libc/src/stdfix/CMakeLists.txt
index 238b86728188ad..815f739d23efa4 100644
--- a/libc/src/stdfix/CMakeLists.txt
+++ b/libc/src/stdfix/CMakeLists.txt
@@ -10,7 +10,7 @@ foreach(suffix IN ITEMS hr r lr hk k lk)
SRCS
abs${suffix}.cpp
COMPILE_OPTIONS
- -O3
+ ${libc_opt_high_flag}
DEPENDS
libc.src.__support.fixed_point.fx_bits
)
@@ -24,7 +24,7 @@ foreach(suffix IN ITEMS uhr ur ulr uhk uk)
SRCS
sqrt${suffix}.cpp
COMPILE_OPTIONS
- -O3
+ ${libc_opt_high_flag}
DEPENDS
libc.src.__support.fixed_point.sqrt
)
@@ -38,7 +38,7 @@ foreach(suffix IN ITEMS hr r lr hk k lk uhr ur ulr uhk uk ulk)
SRCS
round${suffix}.cpp
COMPILE_OPTIONS
- -O3
+ ${libc_opt_high_flag}
DEPENDS
libc.src.__support.fixed_point.fx_bits
)
@@ -62,7 +62,7 @@ add_entrypoint_object(
SRCS
uhksqrtus.cpp
COMPILE_OPTIONS
- -O3
+ ${libc_opt_high_flag}
DEPENDS
libc.src.__support.fixed_point.sqrt
)
@@ -74,7 +74,7 @@ add_entrypoint_object(
SRCS
uksqrtui.cpp
COMPILE_OPTIONS
- -O3
+ ${libc_opt_high_flag}
DEPENDS
libc.src.__support.fixed_point.sqrt
)
@@ -86,7 +86,7 @@ add_entrypoint_object(
SRCS
exphk.cpp
COMPILE_OPTIONS
- -O3
+ ${libc_opt_high_flag}
DEPENDS
libc.src.__support.fixed_point.fx_rep
libc.src.__support.CPP.bit
@@ -99,7 +99,7 @@ add_entrypoint_object(
SRCS
expk.cpp
COMPILE_OPTIONS
- -O3
+ ${libc_opt_high_flag}
DEPENDS
libc.src.__support.fixed_point.fx_rep
libc.src.__support.CPP.bit
diff --git a/libc/src/string/CMakeLists.txt b/libc/src/string/CMakeLists.txt
index d6e300754d4f9c..8fe1226dd6a7a5 100644
--- a/libc/src/string/CMakeLists.txt
+++ b/libc/src/string/CMakeLists.txt
@@ -506,7 +506,7 @@ function(add_implementation name impl_name)
SRCS ${ADD_IMPL_SRCS}
HDRS ${ADD_IMPL_HDRS}
DEPENDS ${ADD_IMPL_DEPENDS}
- COMPILE_OPTIONS -O3 ${ADD_IMPL_COMPILE_OPTIONS}
+ COMPILE_OPTIONS ${libc_opt_high_flag} ${ADD_IMPL_COMPILE_OPTIONS}
)
get_fq_target_name(${impl_name} fq_target_name)
set_target_properties(${fq_target_name} PROPERTIES REQUIRE_CPU_FEATURES "${ADD_IMPL_REQUIRE}")
diff --git a/libc/src/threads/CMakeLists.txt b/libc/src/threads/CMakeLists.txt
index c33be265369fec..17dea3920a07aa 100644
--- a/libc/src/threads/CMakeLists.txt
+++ b/libc/src/threads/CMakeLists.txt
@@ -24,7 +24,7 @@ add_entrypoint_object(
libc.include.threads
libc.src.errno.errno
COMPILE_OPTIONS
- -O3
+ ${libc_opt_high_flag}
-fno-omit-frame-pointer # This allows us to sniff out the thread args from
# the new thread's stack reliably.
)
diff --git a/libc/test/src/math/smoke/LdExpTest.h b/libc/test/src/math/smoke/LdExpTest.h
index 42e4c6a3a5184f..094cc7e4e9e7d0 100644
--- a/libc/test/src/math/smoke/LdExpTest.h
+++ b/libc/test/src/math/smoke/LdExpTest.h
@@ -50,7 +50,8 @@ class LdExpTestTemplate : public LIBC_NAMESPACE::testing::FEnvSafeTest {
if constexpr (sizeof(U) < sizeof(long) || sizeof(long) == sizeof(int))
return;
- long long_exp_array[4] = {LONG_MIN, INT_MIN - 1L, INT_MAX + 1L, LONG_MAX};
+ long long_exp_array[4] = {LONG_MIN, static_cast<long>(INT_MIN - 1LL),
+ static_cast<long>(INT_MAX + 1LL), LONG_MAX};
for (long exp : long_exp_array) {
ASSERT_FP_EQ(zero, func(zero, exp));
ASSERT_FP_EQ(neg_zero, func(neg_zero, exp));
>From 9cfe775d54b8c23afd7d0da0707f2c468f15ea95 Mon Sep 17 00:00:00 2001
From: Schrodinger ZHU Yifan <i at zhuyi.fan>
Date: Tue, 26 Nov 2024 11:46:51 -0800
Subject: [PATCH 2/2] [libc][windows] start time API implementation
---
libc/config/windows/entrypoints.txt | 3 +
libc/hdr/types/clockid_t.h | 2 +-
.../llvm-libc-macros/windows/CMakeLists.txt | 6 ++
.../windows/time-macros-ext.h | 15 ++++
libc/src/CMakeLists.txt | 2 +-
libc/src/__support/time/CMakeLists.txt | 7 ++
.../time/{linux => }/clock_gettime.h | 10 +--
libc/src/__support/time/linux/CMakeLists.txt | 2 +-
.../__support/time/linux/clock_conversion.h | 2 +-
.../__support/time/linux/clock_gettime.cpp | 2 +-
.../src/__support/time/windows/CMakeLists.txt | 16 ++++
.../__support/time/windows/clock_gettime.cpp | 89 +++++++++++++++++++
libc/src/time/CMakeLists.txt | 10 ++-
libc/src/time/linux/CMakeLists.txt | 19 +---
libc/src/time/linux/clock.cpp | 2 +-
libc/src/time/linux/clock_gettime.cpp | 2 +-
libc/src/time/linux/gettimeofday.cpp | 2 +-
libc/src/time/{linux => }/time.cpp | 9 +-
.../threads/linux/raw_mutex_test.cpp | 2 +-
.../llvm-project-overlay/libc/BUILD.bazel | 2 +-
20 files changed, 166 insertions(+), 38 deletions(-)
create mode 100644 libc/include/llvm-libc-macros/windows/CMakeLists.txt
create mode 100644 libc/include/llvm-libc-macros/windows/time-macros-ext.h
rename libc/src/__support/time/{linux => }/clock_gettime.h (72%)
create mode 100644 libc/src/__support/time/windows/CMakeLists.txt
create mode 100644 libc/src/__support/time/windows/clock_gettime.cpp
rename libc/src/time/{linux => }/time.cpp (82%)
diff --git a/libc/config/windows/entrypoints.txt b/libc/config/windows/entrypoints.txt
index 8f0b50bcc83ea2..d0796b85aec2af 100644
--- a/libc/config/windows/entrypoints.txt
+++ b/libc/config/windows/entrypoints.txt
@@ -95,6 +95,9 @@ 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/types/clockid_t.h b/libc/hdr/types/clockid_t.h
index 333342072a2ff2..06fafc5b150612 100644
--- a/libc/hdr/types/clockid_t.h
+++ b/libc/hdr/types/clockid_t.h
@@ -9,7 +9,7 @@
#ifndef LLVM_LIBC_HDR_TYPES_CLOCKID_T_H
#define LLVM_LIBC_HDR_TYPES_CLOCKID_T_H
-#ifdef LIBC_FULL_BUILD
+#if defined(LIBC_FULL_BUILD) || defined(_MSC_VER)
#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
new file mode 100644
index 00000000000000..48afc795178a0d
--- /dev/null
+++ b/libc/include/llvm-libc-macros/windows/CMakeLists.txt
@@ -0,0 +1,6 @@
+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
new file mode 100644
index 00000000000000..e629a92f371c4a
--- /dev/null
+++ b/libc/include/llvm-libc-macros/windows/time-macros-ext.h
@@ -0,0 +1,15 @@
+//===-- 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
+
+#endif // LLVM_LIBC_MACROS_WINDOWS_TIME_MACROS_EXT_H
diff --git a/libc/src/CMakeLists.txt b/libc/src/CMakeLists.txt
index 02c193e635362e..dd3b51886edfea 100644
--- a/libc/src/CMakeLists.txt
+++ b/libc/src/CMakeLists.txt
@@ -13,6 +13,7 @@ add_subdirectory(stdio)
add_subdirectory(stdlib)
add_subdirectory(string)
add_subdirectory(wchar)
+add_subdirectory(time)
if(${LIBC_TARGET_OS} STREQUAL "linux")
add_subdirectory(dirent)
@@ -40,5 +41,4 @@ 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 89ddffb099388b..e73f2744b15a0e 100644
--- a/libc/src/__support/time/CMakeLists.txt
+++ b/libc/src/__support/time/CMakeLists.txt
@@ -2,6 +2,13 @@ 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/clock_gettime.h b/libc/src/__support/time/clock_gettime.h
similarity index 72%
rename from libc/src/__support/time/linux/clock_gettime.h
rename to libc/src/__support/time/clock_gettime.h
index f7f996ce7c1975..584bf546cd60cd 100644
--- a/libc/src/__support/time/linux/clock_gettime.h
+++ b/libc/src/__support/time/clock_gettime.h
@@ -6,21 +6,17 @@
//
//===----------------------------------------------------------------------===//
-#ifndef LLVM_LIBC_SRC___SUPPORT_TIME_LINUX_CLOCK_GETTIME_H
-#define LLVM_LIBC_SRC___SUPPORT_TIME_LINUX_CLOCK_GETTIME_H
+#ifndef LLVM_LIBC_SRC___SUPPORT_TIME_CLOCK_GETTIME_H
+#define LLVM_LIBC_SRC___SUPPORT_TIME_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_LINUX_CLOCK_GETTIME_H
+#endif // LLVM_LIBC_SRC___SUPPORT_TIME_CLOCK_GETTIME_H
diff --git a/libc/src/__support/time/linux/CMakeLists.txt b/libc/src/__support/time/linux/CMakeLists.txt
index 94ed09e6521524..6fec7eeba99add 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 7a52873263a14c..ac5357d308d7c5 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/linux/clock_gettime.h"
+#include "src/__support/time/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 3a0eca417724ac..944fc0a2b80fe7 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/linux/clock_gettime.h"
+#include "src/__support/time/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/windows/CMakeLists.txt b/libc/src/__support/time/windows/CMakeLists.txt
new file mode 100644
index 00000000000000..24b5fa7e086265
--- /dev/null
+++ b/libc/src/__support/time/windows/CMakeLists.txt
@@ -0,0 +1,16 @@
+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.include.llvm-libc-macros.windows.time_macros_ext
+ libc.src.__support.common
+ libc.src.__support.error_or
+ libc.src.__support.OSUtil.osutil
+ libc.src.__support.CPP.atomic
+)
diff --git a/libc/src/__support/time/windows/clock_gettime.cpp b/libc/src/__support/time/windows/clock_gettime.cpp
new file mode 100644
index 00000000000000..6e0b7e028c9789
--- /dev/null
+++ b/libc/src/__support/time/windows/clock_gettime.cpp
@@ -0,0 +1,89 @@
+//===--- 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 "src/__support/time/clock_gettime.h"
+#include "include/llvm-libc-macros/windows/time-macros-ext.h"
+#include "src/__support/CPP/atomic.h"
+#include "src/__support/CPP/bit.h"
+#include "src/__support/time/units.h"
+#include <Windows.h>
+
+#ifdef __clang__
+#define UNINITIALIZED [[clang::uninitialized]]
+#else
+#define UNINITIALIZED
+#endif
+
+namespace LIBC_NAMESPACE_DECL {
+
+static long long get_ticks_per_second() {
+ static cpp::Atomic<long long> frequency = 0;
+ if (!frequency) {
+ 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 = buffer.QuadPart;
+ return buffer.QuadPart;
+ }
+ return frequency.load(cpp::MemoryOrder::RELAXED);
+}
+
+ErrorOr<int> clock_gettime(clockid_t clockid, timespec *ts) {
+ using namespace time_units;
+ ErrorOr<int> ret = 0;
+ __try {
+ 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.
+ 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;
+ 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
+ UNINITIALIZED FILETIME file_time;
+ 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 HNS_PER_SEC = 1_s_ns / 100ULL;
+ 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;
+ ts->tv_sec = static_cast<decltype(ts->tv_sec)>(tv_sec);
+ ts->tv_nsec = static_cast<decltype(ts->tv_nsec)>(tv_nsec);
+ break;
+ }
+ }
+ } __except (EXCEPTION_EXECUTE_HANDLER) {
+ ret = cpp::unexpected(EFAULT);
+ }
+ return ret;
+}
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/time/CMakeLists.txt b/libc/src/time/CMakeLists.txt
index b3318e7ca87fa5..bc7a2e1c113fc6 100644
--- a/libc/src/time/CMakeLists.txt
+++ b/libc/src/time/CMakeLists.txt
@@ -106,9 +106,15 @@ add_entrypoint_object(
add_entrypoint_object(
time
- ALIAS
+ SRCS
+ time.cpp
+ HDRS
+ time_func.h
DEPENDS
- .${LIBC_TARGET_OS}.time
+ libc.hdr.time_macros
+ libc.hdr.types.time_t
+ libc.src.__support.time.clock_gettime
+ libc.src.errno.errno
)
add_entrypoint_object(
diff --git a/libc/src/time/linux/CMakeLists.txt b/libc/src/time/linux/CMakeLists.txt
index c15fb44ad5d123..3e1a943843be85 100644
--- a/libc/src/time/linux/CMakeLists.txt
+++ b/libc/src/time/linux/CMakeLists.txt
@@ -1,16 +1,3 @@
-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(
clock
SRCS
@@ -21,7 +8,7 @@ add_entrypoint_object(
libc.hdr.time_macros
libc.hdr.types.clock_t
libc.src.__support.time.units
- libc.src.__support.time.linux.clock_gettime
+ libc.src.__support.time.clock_gettime
libc.src.__support.CPP.limits
libc.src.errno.errno
)
@@ -49,7 +36,7 @@ add_entrypoint_object(
DEPENDS
libc.hdr.types.clockid_t
libc.hdr.types.struct_timespec
- libc.src.__support.time.linux.clock_gettime
+ libc.src.__support.time.clock_gettime
libc.src.errno.errno
)
@@ -62,7 +49,7 @@ add_entrypoint_object(
DEPENDS
libc.hdr.time_macros
libc.hdr.types.suseconds_t
- libc.src.__support.time.linux.clock_gettime
+ libc.src.__support.time.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 f43e1bcad6a3a1..ee4fa82b4f8944 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/linux/clock_gettime.h"
+#include "src/__support/time/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 a2b20a6dbc9879..743c644d65d024 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/linux/clock_gettime.h"
+#include "src/__support/time/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 19d9988ae73a6e..e8ddf482fc9840 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/linux/clock_gettime.h"
+#include "src/__support/time/clock_gettime.h"
#include "src/__support/time/units.h"
#include "src/errno/libc_errno.h"
diff --git a/libc/src/time/linux/time.cpp b/libc/src/time/time.cpp
similarity index 82%
rename from libc/src/time/linux/time.cpp
rename to libc/src/time/time.cpp
index 20fb86e8e29dbb..e3615d995116b8 100644
--- a/libc/src/time/linux/time.cpp
+++ b/libc/src/time/time.cpp
@@ -9,14 +9,17 @@
#include "hdr/time_macros.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
-#include "src/__support/time/linux/clock_gettime.h"
+#include "src/__support/time/clock_gettime.h"
#include "src/errno/libc_errno.h"
#include "src/time/time_func.h"
+#ifdef _MSC_VER
+#include "include/llvm-libc-macros/windows/time-macros-ext.h"
+#endif
+
namespace LIBC_NAMESPACE_DECL {
-LLVM_LIBC_FUNCTION(time_t, time, (time_t * tp)) {
- // TODO: Use the Linux VDSO to fetch the time and avoid the syscall.
+LLVM_LIBC_FUNCTION(time_t, time, (time_t *tp)) {
struct timespec ts;
auto result = internal::clock_gettime(CLOCK_REALTIME, &ts);
if (!result.has_value()) {
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 918f5d35c94f42..dadc706421d06e 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/linux/clock_gettime.h"
+#include "src/__support/time/clock_gettime.h"
#include "src/stdlib/exit.h"
#include "src/sys/mman/mmap.h"
#include "src/sys/mman/munmap.h"
diff --git a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
index 2573788658d59b..5f730f2eacb2d7 100644
--- a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
+++ b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
@@ -1475,7 +1475,7 @@ libc_support_library(
libc_support_library(
name = "__support_time_linux_clock_gettime",
- hdrs = ["src/__support/time/linux/clock_gettime.h"],
+ hdrs = ["src/__support/time/clock_gettime.h"],
target_compatible_with = select({
"@platforms//os:linux": [],
"//conditions:default": ["@platforms//:incompatible"],
More information about the libc-commits
mailing list