10 changes: 8 additions & 2 deletions libc/src/time/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
36 changes: 14 additions & 22 deletions libc/src/time/gpu/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,14 +1,3 @@
add_object_library(
time_utils
SRCS
time_utils.cpp
HDRS
time_utils.h
DEPENDS
libc.hdr.types.clock_t
libc.hdr.time_macros
)

add_entrypoint_object(
clock
SRCS
Expand All @@ -18,7 +7,8 @@ add_entrypoint_object(
DEPENDS
libc.include.time
libc.src.__support.GPU.utils
.time_utils
libc.src.__support.time.clock_gettime
libc.src.__support.time.gpu.time_utils
)

add_entrypoint_object(
Expand All @@ -30,29 +20,31 @@ add_entrypoint_object(
DEPENDS
libc.include.time
libc.src.__support.GPU.utils
.time_utils
libc.src.__support.time.gpu.time_utils
)

add_entrypoint_object(
clock_gettime
timespec_get
SRCS
clock_gettime.cpp
timespec_get.cpp
HDRS
../clock_gettime.h
../timespec_get.h
DEPENDS
libc.hdr.types.clockid_t
libc.hdr.time_macros
libc.hdr.types.struct_timespec
.time_utils
libc.src.__support.time.gpu.time_utils
)

add_entrypoint_object(
timespec_get
clock_gettime
SRCS
timespec_get.cpp
clock_gettime.cpp
HDRS
../timespec_get.h
../clock_gettime.h
DEPENDS
libc.hdr.time_macros
libc.hdr.types.clockid_t
libc.hdr.types.struct_timespec
.time_utils
libc.src.__support.time.gpu.time_utils
libc.src.__support.time.clock_gettime
)
2 changes: 1 addition & 1 deletion libc/src/time/gpu/clock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@

#include "src/time/clock.h"
#include "src/__support/macros/config.h"
#include "src/time/gpu/time_utils.h"
#include "src/__support/time/gpu/time_utils.h"

namespace LIBC_NAMESPACE_DECL {

Expand Down
19 changes: 6 additions & 13 deletions libc/src/time/gpu/clock_gettime.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,23 +10,16 @@

#include "src/__support/common.h"
#include "src/__support/macros/config.h"
#include "time_utils.h"
#include "src/__support/time/clock_gettime.h"
#include "src/__support/time/gpu/time_utils.h"

namespace LIBC_NAMESPACE_DECL {

constexpr uint64_t TICKS_PER_SEC = 1000000000UL;

LLVM_LIBC_FUNCTION(int, clock_gettime, (clockid_t clockid, timespec *ts)) {
if (clockid != CLOCK_MONOTONIC || !ts)
return -1;

uint64_t ns_per_tick = TICKS_PER_SEC / GPU_CLOCKS_PER_SEC;
uint64_t ticks = gpu::fixed_frequency_clock();

ts->tv_nsec = (ticks * ns_per_tick) % TICKS_PER_SEC;
ts->tv_sec = (ticks * ns_per_tick) / TICKS_PER_SEC;

return 0;
ErrorOr<int> result = internal::clock_gettime(clockid, ts);
if (result)
return result.value();
return result.error();
}

} // namespace LIBC_NAMESPACE_DECL
2 changes: 1 addition & 1 deletion libc/src/time/gpu/nanosleep.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
#include "src/time/nanosleep.h"

#include "src/__support/macros/config.h"
#include "time_utils.h"
#include "src/__support/time/gpu/time_utils.h"

namespace LIBC_NAMESPACE_DECL {

Expand Down
21 changes: 4 additions & 17 deletions libc/src/time/linux/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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(
timespec_get
SRCS
Expand All @@ -20,7 +7,7 @@ add_entrypoint_object(
DEPENDS
libc.hdr.time_macros
libc.hdr.types.struct_timespec
libc.src.__support.time.linux.clock_gettime
libc.src.__support.time.clock_gettime
libc.src.errno.errno
)

Expand All @@ -34,7 +21,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
)
Expand Down Expand Up @@ -62,7 +49,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
)

Expand All @@ -75,7 +62,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
)
2 changes: 1 addition & 1 deletion libc/src/time/linux/clock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
2 changes: 1 addition & 1 deletion libc/src/time/linux/clock_gettime.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion libc/src/time/linux/gettimeofday.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down
2 changes: 1 addition & 1 deletion libc/src/time/linux/timespec_get.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#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"

namespace LIBC_NAMESPACE_DECL {
Expand Down
8 changes: 4 additions & 4 deletions libc/src/time/linux/time.cpp → libc/src/time/time.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,14 @@
#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"

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.
// avoid inconsitent clang-format behavior
using time_ptr_t = time_t *;
LLVM_LIBC_FUNCTION(time_t, time, (time_ptr_t tp)) {
struct timespec ts;
auto result = internal::clock_gettime(CLOCK_REALTIME, &ts);
if (!result.has_value()) {
Expand Down
2 changes: 1 addition & 1 deletion libc/test/src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ add_subdirectory(stdio)
add_subdirectory(stdlib)
add_subdirectory(string)
add_subdirectory(wchar)
add_subdirectory(time)

# Depends on utilities in stdlib
add_subdirectory(inttypes)
Expand All @@ -82,7 +83,6 @@ add_subdirectory(network)
add_subdirectory(setjmp)
add_subdirectory(signal)
add_subdirectory(spawn)
add_subdirectory(time)
add_subdirectory(locale)

if(${LIBC_TARGET_OS} STREQUAL "linux")
Expand Down
2 changes: 1 addition & 1 deletion libc/test/src/__support/threads/linux/raw_mutex_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
2 changes: 1 addition & 1 deletion libc/test/src/time/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
)

Expand Down
2 changes: 0 additions & 2 deletions libc/test/src/time/time_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@
#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);
Expand Down
6 changes: 3 additions & 3 deletions utils/bazel/llvm-project-overlay/libc/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -1471,13 +1471,13 @@ libc_support_library(
}),
deps = [
":__support_time",
":__support_time_linux_clock_gettime",
":__support_time_clock_gettime",
],
)

libc_support_library(
name = "__support_time_linux_clock_gettime",
hdrs = ["src/__support/time/linux/clock_gettime.h"],
name = "__support_time_clock_gettime",
hdrs = ["src/__support/time/clock_gettime.h"],
target_compatible_with = select({
"@platforms//os:linux": [],
"//conditions:default": ["@platforms//:incompatible"],
Expand Down