diff --git a/libc/docs/dev/index.rst b/libc/docs/dev/index.rst index 91fb0b682e46..c0085e63cbad 100644 --- a/libc/docs/dev/index.rst +++ b/libc/docs/dev/index.rst @@ -21,3 +21,4 @@ Navigate to the links below for information on the respective topics: implementation_standard undefined_behavior printf_behavior + syscall_wrapper_refactor diff --git a/libc/docs/dev/syscall_wrapper_refactor.rst b/libc/docs/dev/syscall_wrapper_refactor.rst new file mode 100644 index 000000000000..40535b04d90e --- /dev/null +++ b/libc/docs/dev/syscall_wrapper_refactor.rst @@ -0,0 +1,75 @@ +.. _syscall_wrapper_refactor: + +============================== +Syscall Wrapper Refactoring +============================== + +Purpose +======= + +LLVM-libc is transitioning to a centralized system for Linux syscalls. The goal +is to move all direct ``syscall_impl`` calls into a dedicated directory: +``src/__support/OSUtil/linux/syscall_wrappers/``. + +This refactor provides several benefits: + +* **Reusability**: Allows multiple entrypoints to share a single syscall + implementation without public APIs depending on other public APIs. +* **Type Safety**: Using ``ErrorOr`` ensures that error conditions are + handled explicitly. +* **Consistency**: Standardizes the conversion of syscall return values into + errno-compatible objects. +* **Maintainability**: Centralizes platform-specific syscall logic, making it + easier to audit and update. + +The Pattern +=========== + +Each syscall should have its own header-only library in the ``syscall_wrappers`` +directory. The wrapper function should return an ``ErrorOr``. Wrappers live +in the ``linux_syscalls`` namespace to make call sites self-documenting and to +clearly identify any leakage into OS-generic code. + +Example Wrapper (``src/__support/OSUtil/linux/syscall_wrappers/read.h``): +-------------------------------------------------------------------------- + +.. code-block:: c++ + + #include "hdr/types/ssize_t.h" + #include "src/__support/OSUtil/linux/syscall.h" // For syscall_impl + #include "src/__support/common.h" + #include "src/__support/error_or.h" + #include "src/__support/macros/config.h" + #include // For syscall numbers + + namespace LIBC_NAMESPACE_DECL { + namespace linux_syscalls { + + LIBC_INLINE ErrorOr read(int fd, void *buf, size_t count) { + ssize_t ret = syscall_impl(SYS_read, fd, buf, count); + if (ret < 0) { + return Error(-static_cast(ret)); + } + return ret; + } + + } // namespace linux_syscalls + } // namespace LIBC_NAMESPACE_DECL + +How to Migrate +============== + +1. **Cleanup Existing Implementation**: If the syscall was previously + implemented in ``OSUtil/linux/fcntl.cpp`` (or similar), remove the old + implementation to replace it with the new wrapper. +2. **Create the Wrapper**: Add a new header file in + ``src/__support/OSUtil/linux/syscall_wrappers/``. +3. **Update CMake**: Add a ``add_header_library`` target for the new wrapper in + ``src/__support/OSUtil/linux/syscall_wrappers/CMakeLists.txt``. +4. **Refactor Entrypoints**: + + * Include the new wrapper header (e.g., ``read.h``). + * Replace direct ``syscall_impl`` calls with + ``linux_syscalls::``. + * Update the entrypoint's ``DEPENDS`` in ``CMakeLists.txt`` to include the + new wrapper target. diff --git a/libc/src/__support/HashTable/CMakeLists.txt b/libc/src/__support/HashTable/CMakeLists.txt index d5861e7e825c..82e88c02ae44 100644 --- a/libc/src/__support/HashTable/CMakeLists.txt +++ b/libc/src/__support/HashTable/CMakeLists.txt @@ -16,7 +16,7 @@ if (NOT ${getrandom_index} EQUAL -1) message(STATUS "Using getrandom for hashtable randomness") set(randomness_compile_flags -DLIBC_HASHTABLE_USE_GETRANDOM) set(randomness_extra_depends - libc.src.__support.OSUtil.linux.getrandom + libc.src.__support.OSUtil.linux.syscall_wrappers.getrandom libc.hdr.errno_macros) endif() diff --git a/libc/src/__support/HashTable/randomness.h b/libc/src/__support/HashTable/randomness.h index 7e54c9aa6ad1..38dc703a0db9 100644 --- a/libc/src/__support/HashTable/randomness.h +++ b/libc/src/__support/HashTable/randomness.h @@ -15,7 +15,7 @@ #include "src/__support/macros/config.h" #if defined(LIBC_HASHTABLE_USE_GETRANDOM) #include "hdr/errno_macros.h" -#include "src/__support/OSUtil/linux/getrandom.h" +#include "src/__support/OSUtil/linux/syscall_wrappers/getrandom.h" #endif namespace LIBC_NAMESPACE_DECL { @@ -38,7 +38,7 @@ LIBC_INLINE uint64_t next_random_seed() { size_t count = sizeof(entropy); uint8_t *buffer = reinterpret_cast(entropy); while (count > 0) { - auto len = internal::getrandom(buffer, count, 0); + auto len = linux_syscalls::getrandom(buffer, count, 0); if (!len.has_value()) { if (len.error() == ENOSYS) break; diff --git a/libc/src/__support/OSUtil/linux/CMakeLists.txt b/libc/src/__support/OSUtil/linux/CMakeLists.txt index 406c618eaba1..8a686d4bce7d 100644 --- a/libc/src/__support/OSUtil/linux/CMakeLists.txt +++ b/libc/src/__support/OSUtil/linux/CMakeLists.txt @@ -3,6 +3,7 @@ if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_ARCHITECTURE}) endif() add_subdirectory(${LIBC_TARGET_ARCHITECTURE}) +add_subdirectory(syscall_wrappers) add_object_library( linux_util diff --git a/libc/src/__support/OSUtil/linux/fcntl.cpp b/libc/src/__support/OSUtil/linux/fcntl.cpp index 08db4859c641..a31cb4ae3f60 100644 --- a/libc/src/__support/OSUtil/linux/fcntl.cpp +++ b/libc/src/__support/OSUtil/linux/fcntl.cpp @@ -116,27 +116,5 @@ ErrorOr fcntl(int fd, int cmd, void *arg) { return ret; } -ErrorOr open(const char *path, int flags, mode_t mode_flags) { -#ifdef SYS_open - int fd = LIBC_NAMESPACE::syscall_impl(SYS_open, path, flags, mode_flags); -#else - int fd = LIBC_NAMESPACE::syscall_impl(SYS_openat, AT_FDCWD, path, flags, - mode_flags); -#endif - if (fd < 0) - return Error(-fd); - - return fd; -} - -ErrorOr close(int fd) { - int ret = LIBC_NAMESPACE::syscall_impl(SYS_close, fd); - - if (ret < 0) - return Error(-ret); - - return ret; -} - } // namespace internal } // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/__support/OSUtil/linux/syscall_wrappers/CMakeLists.txt b/libc/src/__support/OSUtil/linux/syscall_wrappers/CMakeLists.txt new file mode 100644 index 000000000000..8bc266941347 --- /dev/null +++ b/libc/src/__support/OSUtil/linux/syscall_wrappers/CMakeLists.txt @@ -0,0 +1,64 @@ +add_header_library( + getrandom + HDRS + getrandom.h + DEPENDS + libc.src.__support.OSUtil.osutil + libc.src.__support.common + libc.src.__support.error_or + libc.src.__support.macros.config + libc.hdr.types.ssize_t + libc.include.sys_syscall +) + +add_header_library( + close + HDRS + close.h + DEPENDS + libc.src.__support.OSUtil.osutil + libc.src.__support.common + libc.src.__support.error_or + libc.src.__support.macros.config + libc.include.sys_syscall +) + +add_header_library( + read + HDRS + read.h + DEPENDS + libc.src.__support.OSUtil.osutil + libc.src.__support.common + libc.src.__support.error_or + libc.src.__support.macros.config + libc.hdr.types.ssize_t + libc.include.sys_syscall +) + +add_header_library( + write + HDRS + write.h + DEPENDS + libc.src.__support.OSUtil.osutil + libc.src.__support.common + libc.src.__support.error_or + libc.src.__support.macros.config + libc.hdr.types.ssize_t + libc.include.sys_syscall +) + +add_header_library( + open + HDRS + open.h + DEPENDS + libc.src.__support.OSUtil.osutil + libc.src.__support.common + libc.src.__support.error_or + libc.src.__support.macros.config + libc.hdr.fcntl_macros + libc.hdr.types.mode_t + libc.include.sys_syscall +) diff --git a/libc/src/__support/OSUtil/linux/syscall_wrappers/close.h b/libc/src/__support/OSUtil/linux/syscall_wrappers/close.h new file mode 100644 index 000000000000..fe305af5051c --- /dev/null +++ b/libc/src/__support/OSUtil/linux/syscall_wrappers/close.h @@ -0,0 +1,31 @@ +//===-- Implementation header for close -------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_WRAPPERS_CLOSE_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_WRAPPERS_CLOSE_H + +#include "src/__support/OSUtil/linux/syscall.h" // syscall_impl +#include "src/__support/common.h" +#include "src/__support/error_or.h" +#include "src/__support/macros/config.h" +#include // For syscall numbers + +namespace LIBC_NAMESPACE_DECL { +namespace linux_syscalls { + +LIBC_INLINE ErrorOr close(int fd) { + int ret = syscall_impl(SYS_close, fd); + if (ret < 0) + return Error(-static_cast(ret)); + return ret; +} + +} // namespace linux_syscalls +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_WRAPPERS_CLOSE_H diff --git a/libc/src/__support/OSUtil/linux/syscall_wrappers/getrandom.h b/libc/src/__support/OSUtil/linux/syscall_wrappers/getrandom.h new file mode 100644 index 000000000000..b5ef6201a2dc --- /dev/null +++ b/libc/src/__support/OSUtil/linux/syscall_wrappers/getrandom.h @@ -0,0 +1,33 @@ +//===-- Implementation header for getrandom ---------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_WRAPPERS_GETRANDOM_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_WRAPPERS_GETRANDOM_H + +#include "hdr/types/ssize_t.h" +#include "src/__support/OSUtil/linux/syscall.h" // syscall_impl +#include "src/__support/common.h" +#include "src/__support/error_or.h" +#include "src/__support/macros/config.h" +#include // For syscall numbers + +namespace LIBC_NAMESPACE_DECL { +namespace linux_syscalls { + +LIBC_INLINE ErrorOr getrandom(void *buf, size_t buflen, + unsigned int flags) { + ssize_t ret = syscall_impl(SYS_getrandom, buf, buflen, flags); + if (ret < 0) + return Error(-static_cast(ret)); + return ret; +} + +} // namespace linux_syscalls +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_WRAPPERS_GETRANDOM_H diff --git a/libc/src/__support/OSUtil/linux/syscall_wrappers/open.h b/libc/src/__support/OSUtil/linux/syscall_wrappers/open.h new file mode 100644 index 000000000000..f487f2bb9163 --- /dev/null +++ b/libc/src/__support/OSUtil/linux/syscall_wrappers/open.h @@ -0,0 +1,37 @@ +//===-- Implementation header for open --------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_WRAPPERS_OPEN_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_WRAPPERS_OPEN_H + +#include "hdr/fcntl_macros.h" +#include "hdr/types/mode_t.h" +#include "src/__support/OSUtil/linux/syscall.h" // syscall_impl +#include "src/__support/common.h" +#include "src/__support/error_or.h" +#include "src/__support/macros/config.h" +#include // For syscall numbers + +namespace LIBC_NAMESPACE_DECL { +namespace linux_syscalls { + +LIBC_INLINE ErrorOr open(const char *path, int flags, mode_t mode_flags) { +#ifdef SYS_open + int fd = syscall_impl(SYS_open, path, flags, mode_flags); +#else + int fd = syscall_impl(SYS_openat, AT_FDCWD, path, flags, mode_flags); +#endif + if (fd < 0) + return Error(-fd); + return fd; +} + +} // namespace linux_syscalls +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_WRAPPERS_OPEN_H diff --git a/libc/src/__support/OSUtil/linux/getrandom.h b/libc/src/__support/OSUtil/linux/syscall_wrappers/read.h similarity index 56% rename from libc/src/__support/OSUtil/linux/getrandom.h rename to libc/src/__support/OSUtil/linux/syscall_wrappers/read.h index 793639472fee..86123904fc6b 100644 --- a/libc/src/__support/OSUtil/linux/getrandom.h +++ b/libc/src/__support/OSUtil/linux/syscall_wrappers/read.h @@ -1,4 +1,4 @@ -//===------------ Implementation of getrandom function ----------*- C++ -*-===// +//===-- Implementation header for read --------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -6,8 +6,8 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_GETRANDOM_H -#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_GETRANDOM_H +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_WRAPPERS_READ_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_WRAPPERS_READ_H #include "hdr/types/ssize_t.h" #include "src/__support/OSUtil/linux/syscall.h" // syscall_impl @@ -17,19 +17,16 @@ #include // For syscall numbers namespace LIBC_NAMESPACE_DECL { -namespace internal { +namespace linux_syscalls { -LIBC_INLINE static ErrorOr getrandom(void *buf, size_t buflen, - unsigned int flags) { - ssize_t ret = - LIBC_NAMESPACE::syscall_impl(SYS_getrandom, buf, buflen, flags); - if (ret < 0) { +LIBC_INLINE ErrorOr read(int fd, void *buf, size_t count) { + ssize_t ret = syscall_impl(SYS_read, fd, buf, count); + if (ret < 0) return Error(-static_cast(ret)); - } return ret; } -} // namespace internal +} // namespace linux_syscalls } // namespace LIBC_NAMESPACE_DECL -#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_GETRANDOM_H +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_WRAPPERS_READ_H diff --git a/libc/src/__support/OSUtil/linux/syscall_wrappers/write.h b/libc/src/__support/OSUtil/linux/syscall_wrappers/write.h new file mode 100644 index 000000000000..e57986d357a2 --- /dev/null +++ b/libc/src/__support/OSUtil/linux/syscall_wrappers/write.h @@ -0,0 +1,32 @@ +//===-- Implementation header for write -------------------------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_WRAPPERS_WRITE_H +#define LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_WRAPPERS_WRITE_H + +#include "hdr/types/ssize_t.h" +#include "src/__support/OSUtil/linux/syscall.h" // syscall_impl +#include "src/__support/common.h" +#include "src/__support/error_or.h" +#include "src/__support/macros/config.h" +#include // For syscall numbers + +namespace LIBC_NAMESPACE_DECL { +namespace linux_syscalls { + +LIBC_INLINE ErrorOr write(int fd, const void *buf, size_t count) { + ssize_t ret = syscall_impl(SYS_write, fd, buf, count); + if (ret < 0) + return Error(-static_cast(ret)); + return ret; +} + +} // namespace linux_syscalls +} // namespace LIBC_NAMESPACE_DECL + +#endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_WRAPPERS_WRITE_H diff --git a/libc/src/fcntl/linux/CMakeLists.txt b/libc/src/fcntl/linux/CMakeLists.txt index c31eb3f438c1..4c151edc0ab4 100644 --- a/libc/src/fcntl/linux/CMakeLists.txt +++ b/libc/src/fcntl/linux/CMakeLists.txt @@ -31,7 +31,7 @@ add_entrypoint_object( DEPENDS libc.hdr.types.mode_t libc.hdr.fcntl_macros - libc.src.__support.OSUtil.osutil + libc.src.__support.OSUtil.linux.syscall_wrappers.open libc.src.errno.errno ) diff --git a/libc/src/fcntl/linux/open.cpp b/libc/src/fcntl/linux/open.cpp index 3a56d1055419..83a5cf8cc434 100644 --- a/libc/src/fcntl/linux/open.cpp +++ b/libc/src/fcntl/linux/open.cpp @@ -10,7 +10,7 @@ #include "hdr/fcntl_macros.h" #include "hdr/types/mode_t.h" -#include "src/__support/OSUtil/fcntl.h" +#include "src/__support/OSUtil/linux/syscall_wrappers/open.h" #include "src/__support/common.h" #include "src/__support/libc_errno.h" #include "src/__support/macros/config.h" @@ -29,7 +29,7 @@ LLVM_LIBC_FUNCTION(int, open, (const char *path, int flags, ...)) { va_end(varargs); } - auto result = internal::open(path, flags, mode_flags); + auto result = linux_syscalls::open(path, flags, mode_flags); if (!result.has_value()) { libc_errno = result.error(); diff --git a/libc/src/sys/mman/linux/CMakeLists.txt b/libc/src/sys/mman/linux/CMakeLists.txt index 97c116f1d2e7..4c90ca0f0154 100644 --- a/libc/src/sys/mman/linux/CMakeLists.txt +++ b/libc/src/sys/mman/linux/CMakeLists.txt @@ -293,8 +293,10 @@ add_entrypoint_object( HDRS ../shm_open.h DEPENDS + libc.hdr.fcntl_macros libc.hdr.types.mode_t libc.src.errno.errno + libc.src.__support.OSUtil.linux.syscall_wrappers.open .shm_common ) diff --git a/libc/src/sys/mman/linux/shm_open.cpp b/libc/src/sys/mman/linux/shm_open.cpp index 46231ba1279a..9670e9abc4ea 100644 --- a/libc/src/sys/mman/linux/shm_open.cpp +++ b/libc/src/sys/mman/linux/shm_open.cpp @@ -10,7 +10,7 @@ #include "hdr/fcntl_macros.h" #include "hdr/types/mode_t.h" -#include "src/__support/OSUtil/fcntl.h" +#include "src/__support/OSUtil/linux/syscall_wrappers/open.h" #include "src/__support/libc_errno.h" #include "src/__support/macros/config.h" #include "src/sys/mman/linux/shm_common.h" @@ -27,7 +27,7 @@ LLVM_LIBC_FUNCTION(int, shm_open, (const char *name, int oflags, mode_t mode)) { } auto open_result = - internal::open(path_result->data(), oflags | DEFAULT_OFLAGS, mode); + linux_syscalls::open(path_result->data(), oflags | DEFAULT_OFLAGS, mode); if (!open_result.has_value()) { libc_errno = open_result.error(); return -1; diff --git a/libc/src/sys/random/linux/CMakeLists.txt b/libc/src/sys/random/linux/CMakeLists.txt index 474e275ee597..60f6e486967a 100644 --- a/libc/src/sys/random/linux/CMakeLists.txt +++ b/libc/src/sys/random/linux/CMakeLists.txt @@ -6,7 +6,6 @@ add_entrypoint_object( ../getrandom.h DEPENDS libc.include.sys_random - libc.include.sys_syscall - libc.src.__support.OSUtil.osutil + libc.src.__support.OSUtil.linux.syscall_wrappers.getrandom libc.src.errno.errno ) diff --git a/libc/src/sys/random/linux/getrandom.cpp b/libc/src/sys/random/linux/getrandom.cpp index 4a95bddfa428..48078e50c630 100644 --- a/libc/src/sys/random/linux/getrandom.cpp +++ b/libc/src/sys/random/linux/getrandom.cpp @@ -8,8 +8,7 @@ #include "src/sys/random/getrandom.h" -#include "src/__support/OSUtil/linux/getrandom.h" -#include "src/__support/OSUtil/syscall.h" // For internal syscall function. +#include "src/__support/OSUtil/linux/syscall_wrappers/getrandom.h" #include "src/__support/common.h" #include "src/__support/error_or.h" #include "src/__support/libc_errno.h" @@ -19,7 +18,7 @@ namespace LIBC_NAMESPACE_DECL { LLVM_LIBC_FUNCTION(ssize_t, getrandom, (void *buf, size_t buflen, unsigned int flags)) { - auto rand = internal::getrandom(buf, buflen, flags); + auto rand = linux_syscalls::getrandom(buf, buflen, flags); if (!rand.has_value()) { libc_errno = static_cast(rand.error()); return -1; diff --git a/libc/src/unistd/linux/CMakeLists.txt b/libc/src/unistd/linux/CMakeLists.txt index 9e530b634e56..c31fe24ac85c 100644 --- a/libc/src/unistd/linux/CMakeLists.txt +++ b/libc/src/unistd/linux/CMakeLists.txt @@ -48,8 +48,7 @@ add_entrypoint_object( ../close.h DEPENDS libc.include.unistd - libc.include.sys_syscall - libc.src.__support.OSUtil.osutil + libc.src.__support.OSUtil.linux.syscall_wrappers.close libc.src.errno.errno ) @@ -503,8 +502,7 @@ add_entrypoint_object( libc.hdr.types.ssize_t libc.hdr.fcntl_macros libc.include.unistd - libc.include.sys_syscall - libc.src.__support.OSUtil.osutil + libc.src.__support.OSUtil.linux.syscall_wrappers.read libc.src.__support.macros.sanitizer libc.src.errno.errno ) @@ -675,8 +673,7 @@ add_entrypoint_object( libc.hdr.types.ssize_t libc.hdr.fcntl_macros libc.include.unistd - libc.include.sys_syscall - libc.src.__support.OSUtil.osutil + libc.src.__support.OSUtil.linux.syscall_wrappers.write libc.src.errno.errno ) diff --git a/libc/src/unistd/linux/close.cpp b/libc/src/unistd/linux/close.cpp index 6ef3a3c6d63f..f625d417c1ff 100644 --- a/libc/src/unistd/linux/close.cpp +++ b/libc/src/unistd/linux/close.cpp @@ -8,16 +8,15 @@ #include "src/unistd/close.h" -#include "src/__support/OSUtil/fcntl.h" +#include "src/__support/OSUtil/linux/syscall_wrappers/close.h" #include "src/__support/common.h" #include "src/__support/libc_errno.h" #include "src/__support/macros/config.h" -#include // For syscall numbers. namespace LIBC_NAMESPACE_DECL { LLVM_LIBC_FUNCTION(int, close, (int fd)) { - auto result = internal::close(fd); + auto result = linux_syscalls::close(fd); if (!result.has_value()) { libc_errno = result.error(); diff --git a/libc/src/unistd/linux/read.cpp b/libc/src/unistd/linux/read.cpp index 55676f3f7010..d39627e57a48 100644 --- a/libc/src/unistd/linux/read.cpp +++ b/libc/src/unistd/linux/read.cpp @@ -8,25 +8,24 @@ #include "src/unistd/read.h" -#include "src/__support/OSUtil/syscall.h" // For internal syscall function. +#include "src/__support/OSUtil/linux/syscall_wrappers/read.h" #include "src/__support/common.h" #include "src/__support/libc_errno.h" #include "src/__support/macros/config.h" #include "src/__support/macros/sanitizer.h" // for MSAN_UNPOISON -#include // For syscall numbers. namespace LIBC_NAMESPACE_DECL { LLVM_LIBC_FUNCTION(ssize_t, read, (int fd, void *buf, size_t count)) { - ssize_t ret = LIBC_NAMESPACE::syscall_impl(SYS_read, fd, buf, count); - if (ret < 0) { - libc_errno = static_cast(-ret); + auto result = linux_syscalls::read(fd, buf, count); + if (!result.has_value()) { + libc_errno = result.error(); return -1; } // The cast is important since there is a check that dereferences the pointer // which fails on void*. MSAN_UNPOISON(reinterpret_cast(buf), count); - return ret; + return result.value(); } } // namespace LIBC_NAMESPACE_DECL diff --git a/libc/src/unistd/linux/write.cpp b/libc/src/unistd/linux/write.cpp index eecb74429182..d7e2d768d1b4 100644 --- a/libc/src/unistd/linux/write.cpp +++ b/libc/src/unistd/linux/write.cpp @@ -8,23 +8,20 @@ #include "src/unistd/write.h" -#include "src/__support/OSUtil/syscall.h" // For internal syscall function. +#include "src/__support/OSUtil/linux/syscall_wrappers/write.h" #include "src/__support/common.h" #include "src/__support/libc_errno.h" #include "src/__support/macros/config.h" -#include // For syscall numbers. - namespace LIBC_NAMESPACE_DECL { LLVM_LIBC_FUNCTION(ssize_t, write, (int fd, const void *buf, size_t count)) { - ssize_t ret = - LIBC_NAMESPACE::syscall_impl(SYS_write, fd, buf, count); - if (ret < 0) { - libc_errno = static_cast(-ret); + auto result = linux_syscalls::write(fd, buf, count); + if (!result.has_value()) { + libc_errno = result.error(); return -1; } - return ret; + return result.value(); } } // namespace LIBC_NAMESPACE_DECL