[libc-commits] [libc] 36b4ffe - [libc] Enable utimes function for riscv (#139181)
via libc-commits
libc-commits at lists.llvm.org
Tue May 13 14:59:52 PDT 2025
Author: Mikhail R. Gadelha
Date: 2025-05-13T18:59:49-03:00
New Revision: 36b4ffeb7ea731dabddc2188950c57053e39ca03
URL: https://github.com/llvm/llvm-project/commit/36b4ffeb7ea731dabddc2188950c57053e39ca03
DIFF: https://github.com/llvm/llvm-project/commit/36b4ffeb7ea731dabddc2188950c57053e39ca03.diff
LOG: [libc] Enable utimes function for riscv (#139181)
RV32 uses SYS_utimensat_time64 instead of SYS_utimensat but the call is
the same.
Added:
Modified:
libc/config/linux/riscv/entrypoints.txt
libc/include/sys/syscall.h.def
libc/src/sys/time/linux/utimes.cpp
Removed:
################################################################################
diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt
index 4bc27b832fdaa..6ee6cd3c7ba11 100644
--- a/libc/config/linux/riscv/entrypoints.txt
+++ b/libc/config/linux/riscv/entrypoints.txt
@@ -289,7 +289,7 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.sys.statvfs.statvfs
# sys/utimes.h entrypoints
- # libc.src.sys.time.utimes
+ libc.src.sys.time.utimes
# sys/utsname.h entrypoints
libc.src.sys.utsname.uname
diff --git a/libc/include/sys/syscall.h.def b/libc/include/sys/syscall.h.def
index ca5a6cc706c27..6d74cc6f78556 100644
--- a/libc/include/sys/syscall.h.def
+++ b/libc/include/sys/syscall.h.def
@@ -2305,6 +2305,10 @@
#define SYS_utimes __NR_utimes
#endif
+#ifdef __NR_utimensat_time64
+#define SYS_utimensat_time64 __NR_utimensat_time64
+#endif
+
#ifdef __NR_utrap_install
#define SYS_utrap_install __NR_utrap_install
#endif
diff --git a/libc/src/sys/time/linux/utimes.cpp b/libc/src/sys/time/linux/utimes.cpp
index e6e3d073a81a4..76b69937a5f48 100644
--- a/libc/src/sys/time/linux/utimes.cpp
+++ b/libc/src/sys/time/linux/utimes.cpp
@@ -9,6 +9,7 @@
#include "src/sys/time/utimes.h"
#include "hdr/fcntl_macros.h"
+#include "hdr/types/struct_timespec.h"
#include "hdr/types/struct_timeval.h"
#include "src/__support/OSUtil/syscall.h"
@@ -20,14 +21,24 @@
namespace LIBC_NAMESPACE_DECL {
+#ifdef SYS_utimes
+constexpr auto UTIMES_SYSCALL_ID = SYS_utimes;
+#elif defined(SYS_utimensat)
+constexpr auto UTIMES_SYSCALL_ID = SYS_utimensat;
+#elif defined(SYS_utimensat_time64)
+constexpr auto UTIMES_SYSCALL_ID = SYS_utimensat_time64;
+#else
+#error "utimes, utimensat, utimensat_time64, syscalls not available."
+#endif
+
LLVM_LIBC_FUNCTION(int, utimes,
(const char *path, const struct timeval times[2])) {
int ret;
#ifdef SYS_utimes
// No need to define a timespec struct, use the syscall directly.
- ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_utimes, path, times);
-#elif defined(SYS_utimensat)
+ ret = LIBC_NAMESPACE::syscall_impl<int>(UTIMES_SYSCALL_ID, path, times);
+#elif defined(SYS_utimensat) || defined(SYS_utimensat_time64)
// the utimensat syscall requires a timespec struct, not timeval.
struct timespec ts[2];
struct timespec *ts_ptr = nullptr; // default value if times is nullptr
@@ -59,11 +70,8 @@ LLVM_LIBC_FUNCTION(int, utimes,
// utimensat syscall.
// flags=0 means don't follow symlinks (like utimes)
- ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_utimensat, AT_FDCWD, path, ts_ptr,
- 0);
-
-#else
-#error "utimensat and utimes syscalls not available."
+ ret = LIBC_NAMESPACE::syscall_impl<int>(UTIMES_SYSCALL_ID, AT_FDCWD, path,
+ ts_ptr, 0);
#endif // SYS_utimensat
if (ret < 0) {
More information about the libc-commits
mailing list