[libc-commits] [libc] [libc] Enable utimes function for riscv (PR #139181)

Mikhail R. Gadelha via libc-commits libc-commits at lists.llvm.org
Tue May 13 14:51:04 PDT 2025


https://github.com/mikhailramalho updated https://github.com/llvm/llvm-project/pull/139181

>From 5376c0d2dfa0f8f99c123a35c9b640d66d9cbd93 Mon Sep 17 00:00:00 2001
From: "Mikhail R. Gadelha" <mikhail at igalia.com>
Date: Thu, 8 May 2025 11:21:59 -0300
Subject: [PATCH 1/3] [libc] Enable utimes function for riscv

RV32 uses SYS_utimensat_time64 instead of SYS_utimensat but the call is
the same.
---
 libc/config/linux/riscv/entrypoints.txt |  2 +-
 libc/include/sys/syscall.h.def          |  4 ++++
 libc/src/sys/time/linux/utimes.cpp      | 22 +++++++++++++++-------
 3 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt
index 30d9d00dfefc9..0ee53e26a9286 100644
--- a/libc/config/linux/riscv/entrypoints.txt
+++ b/libc/config/linux/riscv/entrypoints.txt
@@ -290,7 +290,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 03c19eb0885ed..6f309c8bab331 100644
--- a/libc/include/sys/syscall.h.def
+++ b/libc/include/sys/syscall.h.def
@@ -2301,6 +2301,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..aed04160d5f9d 100644
--- a/libc/src/sys/time/linux/utimes.cpp
+++ b/libc/src/sys/time/linux/utimes.cpp
@@ -10,6 +10,7 @@
 
 #include "hdr/fcntl_macros.h"
 #include "hdr/types/struct_timeval.h"
+#include "hdr/types/struct_timespec.h"
 
 #include "src/__support/OSUtil/syscall.h"
 #include "src/__support/common.h"
@@ -20,14 +21,24 @@
 
 namespace LIBC_NAMESPACE_DECL {
 
+#if 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) {

>From decfa4ca49c9d6be789e87c48ae5d9fa1000d1af Mon Sep 17 00:00:00 2001
From: "Mikhail R. Gadelha" <mikhail at igalia.com>
Date: Thu, 8 May 2025 21:48:26 -0300
Subject: [PATCH 2/3] Include order

Signed-off-by: Mikhail R. Gadelha <mikhail at igalia.com>
---
 libc/src/sys/time/linux/utimes.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libc/src/sys/time/linux/utimes.cpp b/libc/src/sys/time/linux/utimes.cpp
index aed04160d5f9d..7a27a64151b46 100644
--- a/libc/src/sys/time/linux/utimes.cpp
+++ b/libc/src/sys/time/linux/utimes.cpp
@@ -9,8 +9,8 @@
 #include "src/sys/time/utimes.h"
 
 #include "hdr/fcntl_macros.h"
-#include "hdr/types/struct_timeval.h"
 #include "hdr/types/struct_timespec.h"
+#include "hdr/types/struct_timeval.h"
 
 #include "src/__support/OSUtil/syscall.h"
 #include "src/__support/common.h"

>From f8ed14a7bca0e92bd65c63d42c2d18fa274e23ce Mon Sep 17 00:00:00 2001
From: "Mikhail R. Gadelha" <mikhail at igalia.com>
Date: Tue, 13 May 2025 18:50:50 -0300
Subject: [PATCH 3/3] Fixed ifdef

Signed-off-by: Mikhail R. Gadelha <mikhail at igalia.com>
---
 libc/src/sys/time/linux/utimes.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libc/src/sys/time/linux/utimes.cpp b/libc/src/sys/time/linux/utimes.cpp
index 7a27a64151b46..76b69937a5f48 100644
--- a/libc/src/sys/time/linux/utimes.cpp
+++ b/libc/src/sys/time/linux/utimes.cpp
@@ -21,7 +21,7 @@
 
 namespace LIBC_NAMESPACE_DECL {
 
-#if SYS_utimes
+#ifdef SYS_utimes
 constexpr auto UTIMES_SYSCALL_ID = SYS_utimes;
 #elif defined(SYS_utimensat)
 constexpr auto UTIMES_SYSCALL_ID = SYS_utimensat;



More information about the libc-commits mailing list