-
Notifications
You must be signed in to change notification settings - Fork 18.1k
[libc] Refactor core Linux syscalls to use syscall_wrappers #185983
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,68 @@ | ||
| .. _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: | ||
|
|
||
| * **Type Safety**: Using ``ErrorOr<T>`` 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<T>``. | ||
|
|
||
| Example Wrapper (``src/__support/OSUtil/linux/syscall_wrappers/read.h``): | ||
| -------------------------------------------------------------------------- | ||
|
|
||
| .. code-block:: c++ | ||
|
|
||
| #include "src/__support/OSUtil/linux/syscall.h" // For syscall_impl | ||
| #include "src/__support/error_or.h" | ||
| #include "src/__support/common.h" | ||
| #include <sys/syscall.h> // For syscall numbers | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I hope we can avoid including system header here if possible. E.g. today the only Probably these
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Given how much this is used in the codebase already, I'd like to make this a subsequent CL to fix. |
||
|
|
||
| namespace LIBC_NAMESPACE_DECL { | ||
| namespace internal { | ||
|
kaladron marked this conversation as resolved.
Outdated
|
||
|
|
||
| LIBC_INLINE ErrorOr<ssize_t> read(int fd, void *buf, size_t count) { | ||
| ssize_t ret = syscall_impl<ssize_t>(SYS_read, fd, buf, count); | ||
| if (ret < 0) { | ||
| return Error(-static_cast<int>(ret)); | ||
| } | ||
| return ret; | ||
| } | ||
|
|
||
| } // namespace internal | ||
| } // namespace LIBC_NAMESPACE_DECL | ||
|
|
||
| How to Migrate | ||
| ============== | ||
|
|
||
| 1. **Create the Wrapper**: Add a new header file in | ||
| ``src/__support/OSUtil/linux/syscall_wrappers/``. | ||
| 2. **Update CMake**: Add a ``add_header_library`` target for the new wrapper in | ||
| ``src/__support/OSUtil/linux/syscall_wrappers/CMakeLists.txt``. | ||
| 3. **Refactor Entrypoints**: | ||
|
|
||
| * Include the new wrapper header (e.g., ``read.h``). | ||
| * Replace direct ``syscall_impl`` calls with ``internal::<function_name>``. | ||
| * Update the entrypoint's ``DEPENDS`` in ``CMakeLists.txt`` to include the | ||
| new wrapper target. | ||
|
|
||
| 4. **Cleanup OSUtil**: If the syscall was previously implemented manually in | ||
|
kaladron marked this conversation as resolved.
Outdated
|
||
| ``OSUtil/linux/fcntl.cpp`` (or similar), remove it to avoid name collisions. | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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 | ||
| ) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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 <sys/syscall.h> // For syscall numbers | ||
|
vonosmas marked this conversation as resolved.
|
||
|
|
||
| namespace LIBC_NAMESPACE_DECL { | ||
| namespace internal { | ||
|
|
||
| LIBC_INLINE ErrorOr<int> close(int fd) { | ||
| int ret = syscall_impl<int>(SYS_close, fd); | ||
| if (ret < 0) | ||
| return Error(-static_cast<int>(ret)); | ||
| return ret; | ||
| } | ||
|
|
||
| } // namespace internal | ||
| } // namespace LIBC_NAMESPACE_DECL | ||
|
|
||
| #endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_WRAPPERS_CLOSE_H | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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 <sys/syscall.h> // For syscall numbers | ||
|
|
||
| namespace LIBC_NAMESPACE_DECL { | ||
| namespace internal { | ||
|
|
||
| LIBC_INLINE ErrorOr<ssize_t> getrandom(void *buf, size_t buflen, | ||
| unsigned int flags) { | ||
| ssize_t ret = syscall_impl<ssize_t>(SYS_getrandom, buf, buflen, flags); | ||
| if (ret < 0) | ||
| return Error(-static_cast<int>(ret)); | ||
| return ret; | ||
| } | ||
|
|
||
| } // namespace internal | ||
| } // namespace LIBC_NAMESPACE_DECL | ||
|
|
||
| #endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_WRAPPERS_GETRANDOM_H |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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 <sys/syscall.h> // For syscall numbers | ||
|
|
||
| namespace LIBC_NAMESPACE_DECL { | ||
| namespace internal { | ||
|
|
||
| LIBC_INLINE ErrorOr<int> open(const char *path, int flags, mode_t mode_flags) { | ||
| #ifdef SYS_open | ||
| int fd = syscall_impl<int>(SYS_open, path, flags, mode_flags); | ||
| #else | ||
| int fd = syscall_impl<int>(SYS_openat, AT_FDCWD, path, flags, mode_flags); | ||
| #endif | ||
| if (fd < 0) | ||
| return Error(-fd); | ||
| return fd; | ||
| } | ||
|
|
||
| } // namespace internal | ||
| } // namespace LIBC_NAMESPACE_DECL | ||
|
|
||
| #endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_WRAPPERS_OPEN_H |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -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 <sys/syscall.h> // For syscall numbers | ||
|
|
||
| namespace LIBC_NAMESPACE_DECL { | ||
| namespace internal { | ||
|
|
||
| LIBC_INLINE ErrorOr<ssize_t> write(int fd, const void *buf, size_t count) { | ||
| ssize_t ret = syscall_impl<ssize_t>(SYS_write, fd, buf, count); | ||
| if (ret < 0) | ||
| return Error(-static_cast<int>(ret)); | ||
| return ret; | ||
| } | ||
|
|
||
| } // namespace internal | ||
| } // namespace LIBC_NAMESPACE_DECL | ||
|
|
||
| #endif // LLVM_LIBC_SRC___SUPPORT_OSUTIL_SYSCALL_WRAPPERS_WRITE_H |
Uh oh!
There was an error while loading. Please reload this page.