summaryrefslogtreecommitdiff
path: root/libc
diff options
context:
space:
mode:
authorMikhail R. Gadelha <mikhail@igalia.com>2023-05-04 18:34:01 -0300
committerMikhail R. Gadelha <mikhail@igalia.com>2023-05-04 19:07:16 -0300
commit4c9c1a4e4f854b2a4891813b2b1d7e1079a52a62 (patch)
treeb1cd6849bb9360455ff02405f982451fd001667d /libc
parent8052c1e6ebbd993439006bd996bd34b9e8d32f57 (diff)
downloadllvm-4c9c1a4e4f854b2a4891813b2b1d7e1079a52a62.tar.gz
[libc] Enable linux directory entries syscalls in riscv64
This patch updates the struct dirent to be on par with glibc (by adding a missing d_type member) and update the readdir call to use SYS_getdents64 instead of SYS_getdents. Reviewed By: sivachandra Differential Revision: https://reviews.llvm.org/D147738
Diffstat (limited to 'libc')
-rw-r--r--libc/config/linux/riscv64/entrypoints.txt6
-rw-r--r--libc/config/linux/riscv64/headers.txt1
-rw-r--r--libc/include/llvm-libc-types/struct_dirent.h1
-rw-r--r--libc/src/__support/File/CMakeLists.txt2
-rw-r--r--libc/src/__support/File/dir.cpp2
-rw-r--r--libc/src/__support/File/linux_dir.cpp9
6 files changed, 15 insertions, 6 deletions
diff --git a/libc/config/linux/riscv64/entrypoints.txt b/libc/config/linux/riscv64/entrypoints.txt
index dc700941c667..c36a623701e5 100644
--- a/libc/config/linux/riscv64/entrypoints.txt
+++ b/libc/config/linux/riscv64/entrypoints.txt
@@ -341,6 +341,12 @@ if(LLVM_LIBC_FULL_BUILD)
# assert.h entrypoints
libc.src.assert.__assert_fail
+ # dirent.h entrypoints
+ libc.src.dirent.closedir
+ libc.src.dirent.dirfd
+ libc.src.dirent.opendir
+ libc.src.dirent.readdir
+
# network.h entrypoints
libc.src.network.htonl
libc.src.network.htons
diff --git a/libc/config/linux/riscv64/headers.txt b/libc/config/linux/riscv64/headers.txt
index 2d8ed5001c14..aaa75a9dd08c 100644
--- a/libc/config/linux/riscv64/headers.txt
+++ b/libc/config/linux/riscv64/headers.txt
@@ -1,6 +1,7 @@
set(TARGET_PUBLIC_HEADERS
libc.include.assert
libc.include.ctype
+ libc.include.dirent
libc.include.errno
libc.include.fcntl
libc.include.fenv
diff --git a/libc/include/llvm-libc-types/struct_dirent.h b/libc/include/llvm-libc-types/struct_dirent.h
index 44bda4caae45..fde3f8ce4798 100644
--- a/libc/include/llvm-libc-types/struct_dirent.h
+++ b/libc/include/llvm-libc-types/struct_dirent.h
@@ -18,6 +18,7 @@ struct dirent {
off_t d_off;
unsigned short d_reclen;
#endif
+ unsigned char d_type;
// The user code should use strlen to determine actual the size of d_name.
// Likewise, it is incorrect and prohibited by the POSIX standard to detemine
// the size of struct dirent type using sizeof. The size should be got using
diff --git a/libc/src/__support/File/CMakeLists.txt b/libc/src/__support/File/CMakeLists.txt
index 2d94c2f30a49..79de9250c642 100644
--- a/libc/src/__support/File/CMakeLists.txt
+++ b/libc/src/__support/File/CMakeLists.txt
@@ -11,7 +11,6 @@ add_object_library(
HDRS
file.h
DEPENDS
-
libc.src.__support.CPP.new
libc.src.__support.CPP.span
libc.src.__support.threads.mutex
@@ -37,7 +36,6 @@ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS}_file.cpp)
${LIBC_TARGET_OS}_file.cpp
DEPENDS
.file
-
libc.include.fcntl
libc.include.stdio
libc.include.sys_syscall
diff --git a/libc/src/__support/File/dir.cpp b/libc/src/__support/File/dir.cpp
index 70f550ffab72..e632c9293d61 100644
--- a/libc/src/__support/File/dir.cpp
+++ b/libc/src/__support/File/dir.cpp
@@ -12,8 +12,6 @@
#include "src/__support/error_or.h"
#include "src/errno/libc_errno.h" // For error macros
-#include <stdlib.h>
-
namespace __llvm_libc {
ErrorOr<Dir *> Dir::open(const char *path) {
diff --git a/libc/src/__support/File/linux_dir.cpp b/libc/src/__support/File/linux_dir.cpp
index 86aaaae907d2..aae565ffb337 100644
--- a/libc/src/__support/File/linux_dir.cpp
+++ b/libc/src/__support/File/linux_dir.cpp
@@ -34,8 +34,13 @@ ErrorOr<int> platform_opendir(const char *name) {
}
ErrorOr<size_t> platform_fetch_dirents(int fd, cpp::span<uint8_t> buffer) {
- long size =
- __llvm_libc::syscall_impl(SYS_getdents, fd, buffer.data(), buffer.size());
+#ifdef SYS_getdents64
+ long size = __llvm_libc::syscall_impl(SYS_getdents64, fd, buffer.data(),
+ buffer.size());
+#else
+#error "getdents64 syscalls not available to perform a fetch dirents operation."
+#endif
+
if (size < 0) {
return __llvm_libc::Error(static_cast<int>(-size));
}