From fe99de31d949187fa9759de581041bb1aff460ea Mon Sep 17 00:00:00 2001 From: "Mikhail R. Gadelha" Date: Tue, 14 Mar 2023 17:50:09 -0300 Subject: [PATCH] [libc] Enable spawn lib in riscv In this patch we add support for the spawn lib in riscv. Only small changes were required, the biggest one was to use of dup3 instead of dup2, if the latter is not available. This follows our implementation of dup2. Differential Revision: https://reviews.llvm.org/D146145 --- libc/config/linux/riscv64/entrypoints.txt | 8 ++++++++ libc/config/linux/riscv64/headers.txt | 1 + libc/src/spawn/linux/posix_spawn.cpp | 8 ++++++++ 3 files changed, 17 insertions(+) diff --git a/libc/config/linux/riscv64/entrypoints.txt b/libc/config/linux/riscv64/entrypoints.txt index 2d0df5cde26712..042671fa1833aa 100644 --- a/libc/config/linux/riscv64/entrypoints.txt +++ b/libc/config/linux/riscv64/entrypoints.txt @@ -431,6 +431,14 @@ if(LLVM_LIBC_FULL_BUILD) libc.src.signal.sigfillset libc.src.signal.signal + # spawn.h entrypoints + libc.src.spawn.posix_spawn + libc.src.spawn.posix_spawn_file_actions_addclose + libc.src.spawn.posix_spawn_file_actions_adddup2 + libc.src.spawn.posix_spawn_file_actions_addopen + libc.src.spawn.posix_spawn_file_actions_destroy + libc.src.spawn.posix_spawn_file_actions_init + # threads.h entrypoints libc.src.threads.call_once libc.src.threads.cnd_broadcast diff --git a/libc/config/linux/riscv64/headers.txt b/libc/config/linux/riscv64/headers.txt index 1b6dea68e238ad..6d7e53790ec129 100644 --- a/libc/config/linux/riscv64/headers.txt +++ b/libc/config/linux/riscv64/headers.txt @@ -9,6 +9,7 @@ set(TARGET_PUBLIC_HEADERS libc.include.pthread libc.include.sched libc.include.signal + libc.include.spawn libc.include.stdio libc.include.stdlib libc.include.string diff --git a/libc/src/spawn/linux/posix_spawn.cpp b/libc/src/spawn/linux/posix_spawn.cpp index 2f8287238ec867..504ac5d0a39385 100644 --- a/libc/src/spawn/linux/posix_spawn.cpp +++ b/libc/src/spawn/linux/posix_spawn.cpp @@ -14,6 +14,7 @@ #include "src/spawn/file_actions.h" #include +#include // For SIGCHLD #include #include // For syscall numbers. @@ -50,8 +51,15 @@ cpp::optional open(const char *path, int oflags, mode_t mode) { void close(int fd) { __llvm_libc::syscall_impl(SYS_close, fd); } +// We use dup3 if dup2 is not available, similar to our implementation of dup2 bool dup2(int fd, int newfd) { +#ifdef SYS_dup2 long ret = __llvm_libc::syscall_impl(SYS_dup2, fd, newfd); +#elif defined(SYS_dup3) + long ret = __llvm_libc::syscall_impl(SYS_dup3, fd, newfd, 0); +#else +#error "SYS_dup2 and SYS_dup3 not available for the target." +#endif return ret < 0 ? false : true; }