[libc-commits] [libc] [libc] Add backwards-compatibility macro to struct stat. (PR #182601)

Alexey Samsonov via libc-commits libc-commits at lists.llvm.org
Fri Feb 20 14:12:45 PST 2026


https://github.com/vonosmas created https://github.com/llvm/llvm-project/pull/182601

Older code may use `st_atime` which recorded timestamps with one-second precision, instead of `struct timespec st_atim` that is available in later POSIX versions.

Add `#define st_atime` (& friends) to type declaration as suggested in https://man7.org/linux/man-pages/man3/stat.3type.html

>From fb284d0307c1a8e15cf19571c7b4f4fbed1f71a4 Mon Sep 17 00:00:00 2001
From: Alexey Samsonov <vonosmas at gmail.com>
Date: Fri, 20 Feb 2026 22:09:40 +0000
Subject: [PATCH] [libc] Add backwards-compatibility macro to struct stat.

---
 libc/include/llvm-libc-types/struct_stat.h | 5 +++++
 libc/test/src/sys/time/utimes_test.cpp     | 4 ++++
 2 files changed, 9 insertions(+)

diff --git a/libc/include/llvm-libc-types/struct_stat.h b/libc/include/llvm-libc-types/struct_stat.h
index 4026679f8d67f..599194af62737 100644
--- a/libc/include/llvm-libc-types/struct_stat.h
+++ b/libc/include/llvm-libc-types/struct_stat.h
@@ -34,6 +34,11 @@ struct stat {
   struct timespec st_ctim;
   blksize_t st_blksize;
   blkcnt_t st_blocks;
+  // Backwards compatibility macros for older kernel/standards
+  // that recorded timestamps in stat with one-second precision.
+  #define st_atime st_atim.tv_sec
+  #define st_mtime st_mtim.tv_sec
+  #define st_ctime st_ctim.tv_sec
 };
 
 #endif // LLVM_LIBC_TYPES_STRUCT_STAT_H
diff --git a/libc/test/src/sys/time/utimes_test.cpp b/libc/test/src/sys/time/utimes_test.cpp
index 36c1e8b75d514..2501c7385bd2e 100644
--- a/libc/test/src/sys/time/utimes_test.cpp
+++ b/libc/test/src/sys/time/utimes_test.cpp
@@ -57,6 +57,10 @@ TEST_F(LlvmLibcUtimesTest, ChangeTimesSpecific) {
   ASSERT_EQ(statbuf.st_mtim.tv_nsec,
             static_cast<long>(times[1].tv_usec * 1000));
 
+  // legacy way to check seconds
+  ASSERT_EQ(statbuf.st_atime, times[0].tv_sec);
+  ASSERT_EQ(statbuf.st_mtime, times[1].tv_sec);
+
   ASSERT_THAT(LIBC_NAMESPACE::remove(TEST_FILE), Succeeds(0));
 }
 



More information about the libc-commits mailing list