[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