[libc-commits] [libc] [llvm] [libc] add remaining epoll functions, pipe (PR #84587)
Michael Jones via libc-commits
libc-commits at lists.llvm.org
Tue Mar 12 11:25:38 PDT 2024
https://github.com/michaelrj-google updated https://github.com/llvm/llvm-project/pull/84587
>From f6e900387af6d98c6d9b7d3d27f91db97aa18063 Mon Sep 17 00:00:00 2001
From: Michael Jones <michaelrj at google.com>
Date: Tue, 5 Mar 2024 10:26:39 -0800
Subject: [PATCH 1/3] [libc] add remaining epoll functions, pipe
The epoll_wait functions need the rest of the epoll functions (create,
ctl) to be available to actually test them, as well as pipe to create a
usable file descriptor. This patch adds epoll_create, epoll_create1,
epoll_ctl, and pipe. These have tests, and the tests for epoll_wait,
epoll_pwait, and epoll_pwait2 (currently disabled) are updated to use
these newly available functions.
---
libc/config/linux/x86_64/entrypoints.txt | 4 ++
libc/include/CMakeLists.txt | 1 +
libc/include/llvm-libc-macros/CMakeLists.txt | 6 ++
.../llvm-libc-macros/linux/CMakeLists.txt | 6 ++
.../llvm-libc-macros/linux/sys-epoll-macros.h | 38 +++++++++++++
.../llvm-libc-macros/sys-epoll-macros.h | 16 ++++++
libc/include/sys/epoll.h.def | 1 +
libc/spec/posix.td | 5 ++
libc/src/sys/epoll/CMakeLists.txt | 21 +++++++
libc/src/sys/epoll/epoll_create.h | 18 ++++++
libc/src/sys/epoll/epoll_create1.h | 18 ++++++
libc/src/sys/epoll/epoll_ctl.h | 25 ++++++++
libc/src/sys/epoll/linux/CMakeLists.txt | 37 ++++++++++++
libc/src/sys/epoll/linux/epoll_create.cpp | 39 +++++++++++++
libc/src/sys/epoll/linux/epoll_create1.cpp | 31 ++++++++++
libc/src/sys/epoll/linux/epoll_ctl.cpp | 38 +++++++++++++
libc/src/sys/epoll/linux/epoll_pwait.cpp | 6 +-
libc/src/sys/epoll/linux/epoll_pwait2.cpp | 6 +-
libc/src/sys/epoll/linux/epoll_wait.cpp | 5 +-
libc/src/unistd/CMakeLists.txt | 7 +++
libc/src/unistd/linux/CMakeLists.txt | 13 +++++
libc/src/unistd/linux/pipe.cpp | 33 +++++++++++
libc/src/unistd/pipe.h | 18 ++++++
libc/test/src/sys/epoll/linux/CMakeLists.txt | 57 +++++++++++++++++++
.../sys/epoll/linux/epoll_create1_test.cpp | 32 +++++++++++
.../src/sys/epoll/linux/epoll_create_test.cpp | 22 +++++++
.../src/sys/epoll/linux/epoll_ctl_test.cpp | 44 ++++++++++++++
.../src/sys/epoll/linux/epoll_pwait2_test.cpp | 42 ++++++++++++--
.../src/sys/epoll/linux/epoll_pwait_test.cpp | 39 +++++++++++--
.../src/sys/epoll/linux/epoll_wait_test.cpp | 35 ++++++++++--
libc/test/src/unistd/CMakeLists.txt | 15 +++++
libc/test/src/unistd/pipe_test.cpp | 26 +++++++++
.../llvm-project-overlay/libc/BUILD.bazel | 44 ++++++++++++++
.../libc/test/src/sys/epoll/BUILD.bazel | 41 +++++++++++++
34 files changed, 767 insertions(+), 22 deletions(-)
create mode 100644 libc/include/llvm-libc-macros/linux/sys-epoll-macros.h
create mode 100644 libc/include/llvm-libc-macros/sys-epoll-macros.h
create mode 100644 libc/src/sys/epoll/epoll_create.h
create mode 100644 libc/src/sys/epoll/epoll_create1.h
create mode 100644 libc/src/sys/epoll/epoll_ctl.h
create mode 100644 libc/src/sys/epoll/linux/epoll_create.cpp
create mode 100644 libc/src/sys/epoll/linux/epoll_create1.cpp
create mode 100644 libc/src/sys/epoll/linux/epoll_ctl.cpp
create mode 100644 libc/src/unistd/linux/pipe.cpp
create mode 100644 libc/src/unistd/pipe.h
create mode 100644 libc/test/src/sys/epoll/linux/epoll_create1_test.cpp
create mode 100644 libc/test/src/sys/epoll/linux/epoll_create_test.cpp
create mode 100644 libc/test/src/sys/epoll/linux/epoll_ctl_test.cpp
create mode 100644 libc/test/src/unistd/pipe_test.cpp
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index 27c9a42934c240..46eeaa7f1d15ae 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -194,6 +194,9 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.stdio.fscanf
# sys/epoll.h entrypoints
+ libc.src.sys.epoll.epoll_create
+ libc.src.sys.epoll.epoll_create1
+ libc.src.sys.epoll.epoll_ctl
libc.src.sys.epoll.epoll_wait
libc.src.sys.epoll.epoll_pwait
# TODO: Need to check if pwait2 is available before providing.
@@ -280,6 +283,7 @@ set(TARGET_LIBC_ENTRYPOINTS
libc.src.unistd.link
libc.src.unistd.linkat
libc.src.unistd.lseek
+ libc.src.unistd.pipe
libc.src.unistd.pread
libc.src.unistd.pwrite
libc.src.unistd.read
diff --git a/libc/include/CMakeLists.txt b/libc/include/CMakeLists.txt
index 9090b3bca01e0d..3b6bd212b4fad3 100644
--- a/libc/include/CMakeLists.txt
+++ b/libc/include/CMakeLists.txt
@@ -369,6 +369,7 @@ add_gen_header(
.llvm-libc-types.struct_epoll_event
.llvm-libc-types.struct_epoll_data
.llvm-libc-types.sigset_t
+ .llvm-libc-macros.sys_epoll_macros
)
add_gen_header(
diff --git a/libc/include/llvm-libc-macros/CMakeLists.txt b/libc/include/llvm-libc-macros/CMakeLists.txt
index 157b786aa7e815..ea49c8662f9cd3 100644
--- a/libc/include/llvm-libc-macros/CMakeLists.txt
+++ b/libc/include/llvm-libc-macros/CMakeLists.txt
@@ -137,6 +137,12 @@ add_macro_header(
sys-auxv-macros.h
)
+add_macro_header(
+ sys_epoll_macros
+ HDR
+ sys-epoll-macros.h
+)
+
add_macro_header(
sys_ioctl_macros
HDR
diff --git a/libc/include/llvm-libc-macros/linux/CMakeLists.txt b/libc/include/llvm-libc-macros/linux/CMakeLists.txt
index d934c3a0fca6f8..4ee429d1db166a 100644
--- a/libc/include/llvm-libc-macros/linux/CMakeLists.txt
+++ b/libc/include/llvm-libc-macros/linux/CMakeLists.txt
@@ -10,6 +10,12 @@ add_header(
sched-macros.h
)
+add_header(
+ sys_epoll_macros
+ HDR
+ sys-epoll-macros.h
+)
+
add_header(
sys_ioctl_macros
HDR
diff --git a/libc/include/llvm-libc-macros/linux/sys-epoll-macros.h b/libc/include/llvm-libc-macros/linux/sys-epoll-macros.h
new file mode 100644
index 00000000000000..59fb2c23ce9426
--- /dev/null
+++ b/libc/include/llvm-libc-macros/linux/sys-epoll-macros.h
@@ -0,0 +1,38 @@
+//===-- Macros defined in sys/epoll.h header file -------------------------===//
+//
+// 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_MACROS_LINUX_SYS_EPOLL_MACROS_H
+#define LLVM_LIBC_MACROS_LINUX_SYS_EPOLL_MACROS_H
+
+#include "llvm-libc-macros/linux/fcntl-macros.h"
+
+// TODO: Do we need to define these?
+
+#define EPOLL_CLOEXEC O_CLOEXEC
+
+#define EPOLL_CTL_ADD 1
+#define EPOLL_CTL_DEL 2
+#define EPOLL_CTL_MOD 3
+
+#define EPOLLIN 0x1
+#define EPOLLPRI 0x2
+#define EPOLLOUT 0x4
+#define EPOLLERR 0x8
+#define EPOLLHUP 0x10
+#define EPOLLRDNORM 0x40
+#define EPOLLRDBAND 0x80
+#define EPOLLWRNORM 0x100
+#define EPOLLWRBAND 0x200
+#define EPOLLMSG 0x400
+#define EPOLLRDHUP 0x2000
+#define EPOLLEXCLUSIVE 0x10000000
+#define EPOLLWAKEUP 0x20000000
+#define EPOLLONESHOT 0x40000000
+#define EPOLLET 0x80000000
+
+#endif // LLVM_LIBC_MACROS_LINUX_SYS_EPOLL_MACROS_H
diff --git a/libc/include/llvm-libc-macros/sys-epoll-macros.h b/libc/include/llvm-libc-macros/sys-epoll-macros.h
new file mode 100644
index 00000000000000..8212df252b8e7e
--- /dev/null
+++ b/libc/include/llvm-libc-macros/sys-epoll-macros.h
@@ -0,0 +1,16 @@
+//===-- Macros defined in sys/epoll.h header file -------------------------===//
+//
+// 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_MACROS_SYS_EPOLL_MACROS_H
+#define LLVM_LIBC_MACROS_SYS_EPOLL_MACROS_H
+
+#ifdef __linux__
+#include "linux/sys-epoll-macros.h"
+#endif
+
+#endif // LLVM_LIBC_MACROS_SYS_EPOLL_MACROS_H
diff --git a/libc/include/sys/epoll.h.def b/libc/include/sys/epoll.h.def
index 490fad91db3c3a..9579eada248fab 100644
--- a/libc/include/sys/epoll.h.def
+++ b/libc/include/sys/epoll.h.def
@@ -10,6 +10,7 @@
#define LLVM_LIBC_SYS_EPOLL_H
#include <__llvm-libc-common.h>
+#include <llvm-libc-macros/sys-epoll-macros.h>
%%public_api()
diff --git a/libc/spec/posix.td b/libc/spec/posix.td
index 70be692e208a88..7cfa208948dd47 100644
--- a/libc/spec/posix.td
+++ b/libc/spec/posix.td
@@ -548,6 +548,11 @@ def POSIX : StandardSpec<"POSIX"> {
RetValSpec<OffTType>,
[ArgSpec<IntType>, ArgSpec<OffTType>, ArgSpec<IntType>]
>,
+ FunctionSpec<
+ "pipe",
+ RetValSpec<IntType>,
+ [ArgSpec<IntPtr>] //TODO: make this int[2]
+ >,
FunctionSpec<
"pread",
RetValSpec<SSizeTType>,
diff --git a/libc/src/sys/epoll/CMakeLists.txt b/libc/src/sys/epoll/CMakeLists.txt
index d4991a238e2a77..e785f535bf0cfb 100644
--- a/libc/src/sys/epoll/CMakeLists.txt
+++ b/libc/src/sys/epoll/CMakeLists.txt
@@ -2,6 +2,27 @@ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS})
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/${LIBC_TARGET_OS})
endif()
+add_entrypoint_object(
+ epoll_create
+ ALIAS
+ DEPENDS
+ .${LIBC_TARGET_OS}.epoll_create
+)
+
+add_entrypoint_object(
+ epoll_create1
+ ALIAS
+ DEPENDS
+ .${LIBC_TARGET_OS}.epoll_create1
+)
+
+add_entrypoint_object(
+ epoll_ctl
+ ALIAS
+ DEPENDS
+ .${LIBC_TARGET_OS}.epoll_ctl
+)
+
add_entrypoint_object(
epoll_wait
ALIAS
diff --git a/libc/src/sys/epoll/epoll_create.h b/libc/src/sys/epoll/epoll_create.h
new file mode 100644
index 00000000000000..a1eeabd567e4c8
--- /dev/null
+++ b/libc/src/sys/epoll/epoll_create.h
@@ -0,0 +1,18 @@
+//===-- Implementation header for epoll_create function ---------*- 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_SYS_EPOLL_EPOLL_CREATE_H
+#define LLVM_LIBC_SRC_SYS_EPOLL_EPOLL_CREATE_H
+
+namespace LIBC_NAMESPACE {
+
+int epoll_create(int size);
+
+} // namespace LIBC_NAMESPACE
+
+#endif // LLVM_LIBC_SRC_SYS_EPOLL_EPOLL_CREATE_H
diff --git a/libc/src/sys/epoll/epoll_create1.h b/libc/src/sys/epoll/epoll_create1.h
new file mode 100644
index 00000000000000..70f446b5926608
--- /dev/null
+++ b/libc/src/sys/epoll/epoll_create1.h
@@ -0,0 +1,18 @@
+//===-- Implementation header for epoll_create1 function --------*- 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_SYS_EPOLL_EPOLL_CREATE1_H
+#define LLVM_LIBC_SRC_SYS_EPOLL_EPOLL_CREATE1_H
+
+namespace LIBC_NAMESPACE {
+
+int epoll_create1(int flags);
+
+} // namespace LIBC_NAMESPACE
+
+#endif // LLVM_LIBC_SRC_SYS_EPOLL_EPOLL_CREATE1_H
diff --git a/libc/src/sys/epoll/epoll_ctl.h b/libc/src/sys/epoll/epoll_ctl.h
new file mode 100644
index 00000000000000..06f8f530cf39c1
--- /dev/null
+++ b/libc/src/sys/epoll/epoll_ctl.h
@@ -0,0 +1,25 @@
+//===-- Implementation header for epoll_ctl function ------------*- 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_SYS_EPOLL_EPOLL_CTL_H
+#define LLVM_LIBC_SRC_SYS_EPOLL_EPOLL_CTL_H
+
+// TODO: Use this include once the include headers are also using quotes.
+// #include "include/llvm-libc-types/sigset_t.h"
+// #include "include/llvm-libc-types/struct_epoll_event.h"
+
+#include <sys/epoll.h>
+
+namespace LIBC_NAMESPACE {
+
+// TODO: event should be nullable
+int epoll_ctl(int epfd, int op, int fd, epoll_event *event);
+
+} // namespace LIBC_NAMESPACE
+
+#endif // LLVM_LIBC_SRC_SYS_EPOLL_EPOLL_CTL_H
diff --git a/libc/src/sys/epoll/linux/CMakeLists.txt b/libc/src/sys/epoll/linux/CMakeLists.txt
index a27905d962dc57..ab3000b58992ec 100644
--- a/libc/src/sys/epoll/linux/CMakeLists.txt
+++ b/libc/src/sys/epoll/linux/CMakeLists.txt
@@ -1,3 +1,40 @@
+add_entrypoint_object(
+ epoll_create
+ SRCS
+ epoll_create.cpp
+ HDRS
+ ../epoll_create.h
+ DEPENDS
+ libc.include.sys_syscall
+ libc.src.__support.OSUtil.osutil
+ libc.src.errno.errno
+)
+
+add_entrypoint_object(
+ epoll_create1
+ SRCS
+ epoll_create1.cpp
+ HDRS
+ ../epoll_create1.h
+ DEPENDS
+ libc.include.sys_syscall
+ libc.src.__support.OSUtil.osutil
+ libc.src.errno.errno
+)
+
+add_entrypoint_object(
+ epoll_ctl
+ SRCS
+ epoll_ctl.cpp
+ HDRS
+ ../epoll_ctl.h
+ DEPENDS
+ libc.include.sys_epoll
+ libc.include.sys_syscall
+ libc.src.__support.OSUtil.osutil
+ libc.src.errno.errno
+)
+
add_entrypoint_object(
epoll_wait
SRCS
diff --git a/libc/src/sys/epoll/linux/epoll_create.cpp b/libc/src/sys/epoll/linux/epoll_create.cpp
new file mode 100644
index 00000000000000..382320edca7353
--- /dev/null
+++ b/libc/src/sys/epoll/linux/epoll_create.cpp
@@ -0,0 +1,39 @@
+//===---------- Linux implementation of the epoll_create function ---------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/sys/epoll/epoll_create.h"
+
+#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
+#include "src/__support/common.h"
+#include "src/errno/libc_errno.h"
+#include <sys/syscall.h> // For syscall numbers.
+
+namespace LIBC_NAMESPACE {
+
+LLVM_LIBC_FUNCTION(int, epoll_create, (int size)) {
+#ifdef SYS_epoll_create
+ int ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_epoll_create, size);
+#elif defined(SYS_epoll_create1)
+ // TODO: Silence warning for size being unused.
+ int ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_epoll_create1, 0);
+#else
+#error \
+ "epoll_create and epoll_create1 are unavailable. Unable to build epoll_create."
+#endif
+
+ // A negative return value indicates an error with the magnitude of the
+ // value being the error code.
+ if (ret < 0) {
+ libc_errno = -ret;
+ return -1;
+ }
+
+ return ret;
+}
+
+} // namespace LIBC_NAMESPACE
diff --git a/libc/src/sys/epoll/linux/epoll_create1.cpp b/libc/src/sys/epoll/linux/epoll_create1.cpp
new file mode 100644
index 00000000000000..30f1a9910274d0
--- /dev/null
+++ b/libc/src/sys/epoll/linux/epoll_create1.cpp
@@ -0,0 +1,31 @@
+//===---------- Linux implementation of the epoll_create1 function --------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/sys/epoll/epoll_create1.h"
+
+#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
+#include "src/__support/common.h"
+#include "src/errno/libc_errno.h"
+#include <sys/syscall.h> // For syscall numbers.
+
+namespace LIBC_NAMESPACE {
+
+LLVM_LIBC_FUNCTION(int, epoll_create1, (int flags)) {
+ int ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_epoll_create1, flags);
+
+ // A negative return value indicates an error with the magnitude of the
+ // value being the error code.
+ if (ret < 0) {
+ libc_errno = -ret;
+ return -1;
+ }
+
+ return ret;
+}
+
+} // namespace LIBC_NAMESPACE
diff --git a/libc/src/sys/epoll/linux/epoll_ctl.cpp b/libc/src/sys/epoll/linux/epoll_ctl.cpp
new file mode 100644
index 00000000000000..2835dfc6f3a244
--- /dev/null
+++ b/libc/src/sys/epoll/linux/epoll_ctl.cpp
@@ -0,0 +1,38 @@
+//===---------- Linux implementation of the epoll_ctl function ----------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/sys/epoll/epoll_ctl.h"
+
+#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
+#include "src/__support/common.h"
+#include "src/errno/libc_errno.h"
+#include <sys/syscall.h> // For syscall numbers.
+
+// TODO: Use this include once the include headers are also using quotes.
+// #include "include/llvm-libc-types/struct_epoll_event.h"
+
+#include <sys/epoll.h>
+
+namespace LIBC_NAMESPACE {
+
+LLVM_LIBC_FUNCTION(int, epoll_ctl,
+ (int epfd, int op, int fd, epoll_event *event)) {
+ int ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_epoll_ctl, epfd, op, fd,
+ reinterpret_cast<long>(event));
+
+ // A negative return value indicates an error with the magnitude of the
+ // value being the error code.
+ if (ret < 0) {
+ libc_errno = -ret;
+ return -1;
+ }
+
+ return ret;
+}
+
+} // namespace LIBC_NAMESPACE
diff --git a/libc/src/sys/epoll/linux/epoll_pwait.cpp b/libc/src/sys/epoll/linux/epoll_pwait.cpp
index ee1b4e66e98444..4c4c6425bc16f2 100644
--- a/libc/src/sys/epoll/linux/epoll_pwait.cpp
+++ b/libc/src/sys/epoll/linux/epoll_pwait.cpp
@@ -10,7 +10,6 @@
#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
#include "src/__support/common.h"
-
#include "src/errno/libc_errno.h"
#include <sys/syscall.h> // For syscall numbers.
@@ -19,6 +18,7 @@
// #include "include/llvm-libc-types/struct_epoll_event.h"
#include <sys/epoll.h>
+#include <signal.h> // for NSIG
namespace LIBC_NAMESPACE {
@@ -27,7 +27,7 @@ LLVM_LIBC_FUNCTION(int, epoll_pwait,
int timeout, const sigset_t *sigmask)) {
int ret = LIBC_NAMESPACE::syscall_impl<int>(
SYS_epoll_pwait, epfd, reinterpret_cast<long>(events), maxevents, timeout,
- reinterpret_cast<long>(sigmask), sizeof(sigset_t));
+ reinterpret_cast<long>(sigmask), NSIG / 8);
// A negative return value indicates an error with the magnitude of the
// value being the error code.
@@ -36,7 +36,7 @@ LLVM_LIBC_FUNCTION(int, epoll_pwait,
return -1;
}
- return 0;
+ return ret;
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/sys/epoll/linux/epoll_pwait2.cpp b/libc/src/sys/epoll/linux/epoll_pwait2.cpp
index 671dede2a1058d..4fea4a6bc83b1e 100644
--- a/libc/src/sys/epoll/linux/epoll_pwait2.cpp
+++ b/libc/src/sys/epoll/linux/epoll_pwait2.cpp
@@ -10,7 +10,6 @@
#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
#include "src/__support/common.h"
-
#include "src/errno/libc_errno.h"
#include <sys/syscall.h> // For syscall numbers.
@@ -20,6 +19,7 @@
// #include "include/llvm-libc-types/struct_timespec.h"
#include <sys/epoll.h>
+#include <signal.h> // for NSIG
namespace LIBC_NAMESPACE {
@@ -29,7 +29,7 @@ LLVM_LIBC_FUNCTION(int, epoll_pwait2,
int ret = LIBC_NAMESPACE::syscall_impl<int>(
SYS_epoll_pwait2, epfd, reinterpret_cast<long>(events), maxevents,
reinterpret_cast<long>(timeout), reinterpret_cast<long>(sigmask),
- sizeof(sigset_t));
+ NSIG / 8);
// A negative return value indicates an error with the magnitude of the
// value being the error code.
@@ -38,7 +38,7 @@ LLVM_LIBC_FUNCTION(int, epoll_pwait2,
return -1;
}
- return 0;
+ return ret;
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/sys/epoll/linux/epoll_wait.cpp b/libc/src/sys/epoll/linux/epoll_wait.cpp
index 0c43edf7645454..514306f0a076f4 100644
--- a/libc/src/sys/epoll/linux/epoll_wait.cpp
+++ b/libc/src/sys/epoll/linux/epoll_wait.cpp
@@ -18,6 +18,7 @@
// #include "include/llvm-libc-types/struct_epoll_event.h"
#include <sys/epoll.h>
+#include <signal.h> // for NSIG
namespace LIBC_NAMESPACE {
@@ -30,7 +31,7 @@ LLVM_LIBC_FUNCTION(int, epoll_wait,
#elif defined(SYS_epoll_pwait)
int ret = LIBC_NAMESPACE::syscall_impl<int>(
SYS_epoll_pwait, epfd, reinterpret_cast<long>(events), maxevents, timeout,
- reinterpret_cast<long>(nullptr), sizeof(sigset_t));
+ reinterpret_cast<long>(nullptr), NSIG / 8);
#else
#error "epoll_wait and epoll_pwait are unavailable. Unable to build epoll_wait."
#endif
@@ -41,7 +42,7 @@ LLVM_LIBC_FUNCTION(int, epoll_wait,
return -1;
}
- return 0;
+ return ret;
}
} // namespace LIBC_NAMESPACE
diff --git a/libc/src/unistd/CMakeLists.txt b/libc/src/unistd/CMakeLists.txt
index e22b0e1872caa1..368c4f0328eda2 100644
--- a/libc/src/unistd/CMakeLists.txt
+++ b/libc/src/unistd/CMakeLists.txt
@@ -149,6 +149,13 @@ add_entrypoint_object(
.${LIBC_TARGET_OS}.lseek
)
+add_entrypoint_object(
+ pipe
+ ALIAS
+ DEPENDS
+ .${LIBC_TARGET_OS}.pipe
+)
+
add_entrypoint_object(
pread
ALIAS
diff --git a/libc/src/unistd/linux/CMakeLists.txt b/libc/src/unistd/linux/CMakeLists.txt
index df85d44e9e9edc..7d831f9c29c74f 100644
--- a/libc/src/unistd/linux/CMakeLists.txt
+++ b/libc/src/unistd/linux/CMakeLists.txt
@@ -273,6 +273,19 @@ add_entrypoint_object(
libc.src.errno.errno
)
+add_entrypoint_object(
+ pipe
+ SRCS
+ pipe.cpp
+ HDRS
+ ../pipe.h
+ DEPENDS
+ libc.include.unistd
+ libc.include.sys_syscall
+ libc.src.__support.OSUtil.osutil
+ libc.src.errno.errno
+)
+
add_entrypoint_object(
pread
SRCS
diff --git a/libc/src/unistd/linux/pipe.cpp b/libc/src/unistd/linux/pipe.cpp
new file mode 100644
index 00000000000000..b4e8b9b7d9c85e
--- /dev/null
+++ b/libc/src/unistd/linux/pipe.cpp
@@ -0,0 +1,33 @@
+//===-- Linux implementation of pipe --------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/unistd/pipe.h"
+
+#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
+#include "src/__support/common.h"
+#include "src/errno/libc_errno.h"
+#include <sys/syscall.h> // For syscall numbers.
+
+namespace LIBC_NAMESPACE {
+
+LLVM_LIBC_FUNCTION(int, pipe, (int pipefd[2])) {
+#ifdef SYS_pipe
+ int ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_pipe,
+ reinterpret_cast<long>(pipefd));
+#elif defined(SYS_pipe2)
+ int ret = LIBC_NAMESPACE::syscall_impl<int>(
+ SYS_pipe2, reinterpret_cast<long>(pipefd), 0);
+#endif
+ if (ret < 0) {
+ libc_errno = -ret;
+ return -1;
+ }
+ return ret;
+}
+
+} // namespace LIBC_NAMESPACE
diff --git a/libc/src/unistd/pipe.h b/libc/src/unistd/pipe.h
new file mode 100644
index 00000000000000..0e20bb49c05849
--- /dev/null
+++ b/libc/src/unistd/pipe.h
@@ -0,0 +1,18 @@
+//===-- Implementation header for pipe --------------------------*- 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_UNISTD_PIPE_H
+#define LLVM_LIBC_SRC_UNISTD_PIPE_H
+
+namespace LIBC_NAMESPACE {
+
+int pipe(int pipefd[2]);
+
+} // namespace LIBC_NAMESPACE
+
+#endif // LLVM_LIBC_SRC_UNISTD_PIPE_H
diff --git a/libc/test/src/sys/epoll/linux/CMakeLists.txt b/libc/test/src/sys/epoll/linux/CMakeLists.txt
index e346af2328db21..73c2d332fade29 100644
--- a/libc/test/src/sys/epoll/linux/CMakeLists.txt
+++ b/libc/test/src/sys/epoll/linux/CMakeLists.txt
@@ -1,4 +1,49 @@
add_custom_target(libc_sys_epoll_unittests)
+
+add_libc_unittest(
+ epoll_create_test
+ SUITE
+ libc_sys_epoll_unittests
+ SRCS
+ epoll_create_test.cpp
+ DEPENDS
+ libc.include.sys_epoll
+ libc.src.errno.errno
+ libc.src.sys.epoll.epoll_create
+ libc.src.unistd.close
+ libc.test.UnitTest.ErrnoSetterMatcher
+)
+
+add_libc_unittest(
+ epoll_create1_test
+ SUITE
+ libc_sys_epoll_unittests
+ SRCS
+ epoll_create1_test.cpp
+ DEPENDS
+ libc.include.sys_epoll
+ libc.src.errno.errno
+ libc.src.sys.epoll.epoll_create1
+ libc.src.unistd.close
+ libc.test.UnitTest.ErrnoSetterMatcher
+)
+
+add_libc_unittest(
+ epoll_ctl_test
+ SUITE
+ libc_sys_epoll_unittests
+ SRCS
+ epoll_ctl_test.cpp
+ DEPENDS
+ libc.include.sys_epoll
+ libc.src.errno.errno
+ libc.src.sys.epoll.epoll_create1
+ libc.src.sys.epoll.epoll_ctl
+ libc.src.unistd.pipe
+ libc.src.unistd.close
+ libc.test.UnitTest.ErrnoSetterMatcher
+)
+
add_libc_unittest(
epoll_wait_test
SUITE
@@ -8,7 +53,11 @@ add_libc_unittest(
DEPENDS
libc.include.sys_epoll
libc.src.errno.errno
+ libc.src.sys.epoll.epoll_create1
+ libc.src.sys.epoll.epoll_ctl
libc.src.sys.epoll.epoll_wait
+ libc.src.unistd.pipe
+ libc.src.unistd.close
libc.test.UnitTest.ErrnoSetterMatcher
)
@@ -21,7 +70,11 @@ add_libc_unittest(
DEPENDS
libc.include.sys_epoll
libc.src.errno.errno
+ libc.src.sys.epoll.epoll_create1
+ libc.src.sys.epoll.epoll_ctl
libc.src.sys.epoll.epoll_pwait
+ libc.src.unistd.pipe
+ libc.src.unistd.close
libc.test.UnitTest.ErrnoSetterMatcher
)
@@ -34,6 +87,10 @@ add_libc_unittest(
DEPENDS
libc.include.sys_epoll
libc.src.errno.errno
+ libc.src.sys.epoll.epoll_create1
+ libc.src.sys.epoll.epoll_ctl
libc.src.sys.epoll.epoll_pwait2
+ libc.src.unistd.pipe
+ libc.src.unistd.close
libc.test.UnitTest.ErrnoSetterMatcher
)
diff --git a/libc/test/src/sys/epoll/linux/epoll_create1_test.cpp b/libc/test/src/sys/epoll/linux/epoll_create1_test.cpp
new file mode 100644
index 00000000000000..80bf0b0425e63b
--- /dev/null
+++ b/libc/test/src/sys/epoll/linux/epoll_create1_test.cpp
@@ -0,0 +1,32 @@
+//===-- Unittests for epoll_create1 ---------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+#include "src/errno/libc_errno.h"
+#include "src/sys/epoll/epoll_create1.h"
+#include "src/unistd/close.h"
+#include "test/UnitTest/ErrnoSetterMatcher.h"
+#include "test/UnitTest/Test.h"
+
+#include <sys/epoll.h>
+
+using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher;
+
+TEST(LlvmLibcEpollCreate1Test, Basic) {
+ int fd = LIBC_NAMESPACE::epoll_create1(0);
+ ASSERT_GT(fd, 0);
+ ASSERT_ERRNO_SUCCESS();
+
+ ASSERT_THAT(LIBC_NAMESPACE::close(fd), Succeeds());
+}
+
+TEST(LlvmLibcEpollCreate1Test, CloseOnExecute) {
+ int fd = LIBC_NAMESPACE::epoll_create1(EPOLL_CLOEXEC);
+ ASSERT_GT(fd, 0);
+ ASSERT_ERRNO_SUCCESS();
+
+ ASSERT_THAT(LIBC_NAMESPACE::close(fd), Succeeds());
+}
diff --git a/libc/test/src/sys/epoll/linux/epoll_create_test.cpp b/libc/test/src/sys/epoll/linux/epoll_create_test.cpp
new file mode 100644
index 00000000000000..131a1ec0d30277
--- /dev/null
+++ b/libc/test/src/sys/epoll/linux/epoll_create_test.cpp
@@ -0,0 +1,22 @@
+//===-- Unittests for epoll_create ----------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+#include "src/errno/libc_errno.h"
+#include "src/sys/epoll/epoll_create.h"
+#include "src/unistd/close.h"
+#include "test/UnitTest/ErrnoSetterMatcher.h"
+#include "test/UnitTest/Test.h"
+
+using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher;
+
+TEST(LlvmLibcEpollCreateTest, Basic) {
+ int fd = LIBC_NAMESPACE::epoll_create(1);
+ ASSERT_GT(fd, 0);
+ ASSERT_ERRNO_SUCCESS();
+
+ ASSERT_THAT(LIBC_NAMESPACE::close(fd), Succeeds());
+}
diff --git a/libc/test/src/sys/epoll/linux/epoll_ctl_test.cpp b/libc/test/src/sys/epoll/linux/epoll_ctl_test.cpp
new file mode 100644
index 00000000000000..c68ae1652c141c
--- /dev/null
+++ b/libc/test/src/sys/epoll/linux/epoll_ctl_test.cpp
@@ -0,0 +1,44 @@
+//===-- Unittests for epoll_ctl -------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+#include "src/errno/libc_errno.h"
+#include "src/sys/epoll/epoll_create1.h"
+#include "src/sys/epoll/epoll_ctl.h"
+#include "src/unistd/close.h"
+#include "src/unistd/pipe.h"
+#include "test/UnitTest/ErrnoSetterMatcher.h"
+#include "test/UnitTest/Test.h"
+
+#include <sys/epoll.h>
+
+using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher;
+
+TEST(LlvmLibcEpollCtlTest, Basic) {
+ int epfd = LIBC_NAMESPACE::epoll_create1(0);
+ ASSERT_GT(epfd, 0);
+ ASSERT_ERRNO_SUCCESS();
+
+ int pipefd[2];
+
+ ASSERT_THAT(LIBC_NAMESPACE::pipe(pipefd), Succeeds());
+
+ epoll_event event{.events = EPOLLOUT, .data = {.fd = pipefd[0]}};
+
+ ASSERT_THAT(LIBC_NAMESPACE::epoll_ctl(epfd, EPOLL_CTL_ADD, pipefd[0], &event),
+ Succeeds());
+
+ // adding the same file fail.
+ ASSERT_THAT(LIBC_NAMESPACE::epoll_ctl(epfd, EPOLL_CTL_ADD, pipefd[0], &event),
+ Fails(EEXIST));
+
+ ASSERT_THAT(LIBC_NAMESPACE::epoll_ctl(epfd, EPOLL_CTL_DEL, pipefd[0], &event),
+ Succeeds());
+
+ ASSERT_THAT(LIBC_NAMESPACE::close(pipefd[0]), Succeeds());
+ ASSERT_THAT(LIBC_NAMESPACE::close(pipefd[1]), Succeeds());
+ ASSERT_THAT(LIBC_NAMESPACE::close(epfd), Succeeds());
+}
diff --git a/libc/test/src/sys/epoll/linux/epoll_pwait2_test.cpp b/libc/test/src/sys/epoll/linux/epoll_pwait2_test.cpp
index 83fe12bb8eb657..5683ba90bb97cf 100644
--- a/libc/test/src/sys/epoll/linux/epoll_pwait2_test.cpp
+++ b/libc/test/src/sys/epoll/linux/epoll_pwait2_test.cpp
@@ -6,15 +6,47 @@
//
//===----------------------------------------------------------------------===//
#include "src/errno/libc_errno.h"
+#include "src/sys/epoll/epoll_create1.h"
+#include "src/sys/epoll/epoll_ctl.h"
#include "src/sys/epoll/epoll_pwait2.h"
+#include "src/unistd/close.h"
+#include "src/unistd/pipe.h"
#include "test/UnitTest/ErrnoSetterMatcher.h"
#include "test/UnitTest/Test.h"
+#include <sys/epoll.h>
+
using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher;
-TEST(LlvmLibcEpollWaitTest, Basic) {
- EXPECT_THAT(LIBC_NAMESPACE::epoll_pwait2(-1, nullptr, 0, nullptr, nullptr),
- returns(EQ(-1ul)).with_errno(EQ(EINVAL)));
-}
+TEST(LlvmLibcEpollPwaitTest, Basic) {
+ int epfd = LIBC_NAMESPACE::epoll_create1(0);
+ ASSERT_GT(epfd, 0);
+ ASSERT_ERRNO_SUCCESS();
+
+ int pipefd[2];
+
+ ASSERT_THAT(LIBC_NAMESPACE::pipe(pipefd), Succeeds());
+
+ epoll_event event{.events = EPOLLOUT, .data = {.fd = pipefd[0]}};
+
+ timespec time_spec{.tv_sec = 0, .tv_nsec = 0};
-// TODO: Complete these tests when epoll_create is implemented.
+ ASSERT_THAT(LIBC_NAMESPACE::epoll_ctl(epfd, EPOLL_CTL_ADD, pipefd[0], &event),
+ Succeeds());
+
+ // Timeout of 0 causes immediate return. We just need to check that the
+ // interface works, we're not testing the kernel behavior here.
+ ASSERT_THAT(
+ LIBC_NAMESPACE::epoll_pwait2(epfd, &event, 1, &time_spec, nullptr),
+ Succeeds());
+
+ ASSERT_THAT(LIBC_NAMESPACE::epoll_pwait2(-1, &event, 1, &time_spec, nullptr),
+ Fails(EBADF));
+
+ ASSERT_THAT(LIBC_NAMESPACE::epoll_ctl(epfd, EPOLL_CTL_DEL, pipefd[0], &event),
+ Succeeds());
+
+ ASSERT_THAT(LIBC_NAMESPACE::close(pipefd[0]), Succeeds());
+ ASSERT_THAT(LIBC_NAMESPACE::close(pipefd[1]), Succeeds());
+ ASSERT_THAT(LIBC_NAMESPACE::close(epfd), Succeeds());
+}
diff --git a/libc/test/src/sys/epoll/linux/epoll_pwait_test.cpp b/libc/test/src/sys/epoll/linux/epoll_pwait_test.cpp
index 217facbfcebb9d..582faacbdb5bb3 100644
--- a/libc/test/src/sys/epoll/linux/epoll_pwait_test.cpp
+++ b/libc/test/src/sys/epoll/linux/epoll_pwait_test.cpp
@@ -6,15 +6,44 @@
//
//===----------------------------------------------------------------------===//
#include "src/errno/libc_errno.h"
+#include "src/sys/epoll/epoll_create1.h"
+#include "src/sys/epoll/epoll_ctl.h"
#include "src/sys/epoll/epoll_pwait.h"
+#include "src/unistd/close.h"
+#include "src/unistd/pipe.h"
#include "test/UnitTest/ErrnoSetterMatcher.h"
#include "test/UnitTest/Test.h"
+#include <sys/epoll.h>
+
using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher;
-TEST(LlvmLibcEpollWaitTest, Basic) {
- EXPECT_THAT(LIBC_NAMESPACE::epoll_pwait(-1, nullptr, 0, 0, nullptr),
- returns(EQ(-1ul)).with_errno(EQ(EINVAL)));
-}
+TEST(LlvmLibcEpollPwaitTest, Basic) {
+ int epfd = LIBC_NAMESPACE::epoll_create1(0);
+ ASSERT_GT(epfd, 0);
+ ASSERT_ERRNO_SUCCESS();
+
+ int pipefd[2];
+
+ ASSERT_THAT(LIBC_NAMESPACE::pipe(pipefd), Succeeds());
+
+ epoll_event event{.events = EPOLLOUT, .data = {.fd = pipefd[0]}};
-// TODO: Complete these tests when epoll_create is implemented.
+ ASSERT_THAT(LIBC_NAMESPACE::epoll_ctl(epfd, EPOLL_CTL_ADD, pipefd[0], &event),
+ Succeeds());
+
+ // Timeout of 0 causes immediate return. We just need to check that the
+ // interface works, we're not testing the kernel behavior here.
+ ASSERT_THAT(LIBC_NAMESPACE::epoll_pwait(epfd, &event, 1, 0, nullptr),
+ Succeeds());
+
+ ASSERT_THAT(LIBC_NAMESPACE::epoll_pwait(-1, &event, 1, 0, nullptr),
+ Fails(EBADF));
+
+ ASSERT_THAT(LIBC_NAMESPACE::epoll_ctl(epfd, EPOLL_CTL_DEL, pipefd[0], &event),
+ Succeeds());
+
+ ASSERT_THAT(LIBC_NAMESPACE::close(pipefd[0]), Succeeds());
+ ASSERT_THAT(LIBC_NAMESPACE::close(pipefd[1]), Succeeds());
+ ASSERT_THAT(LIBC_NAMESPACE::close(epfd), Succeeds());
+}
diff --git a/libc/test/src/sys/epoll/linux/epoll_wait_test.cpp b/libc/test/src/sys/epoll/linux/epoll_wait_test.cpp
index 57fef3f690b624..7fdb93efd8704b 100644
--- a/libc/test/src/sys/epoll/linux/epoll_wait_test.cpp
+++ b/libc/test/src/sys/epoll/linux/epoll_wait_test.cpp
@@ -6,15 +6,42 @@
//
//===----------------------------------------------------------------------===//
#include "src/errno/libc_errno.h"
+#include "src/sys/epoll/epoll_create1.h"
+#include "src/sys/epoll/epoll_ctl.h"
#include "src/sys/epoll/epoll_wait.h"
+#include "src/unistd/close.h"
+#include "src/unistd/pipe.h"
#include "test/UnitTest/ErrnoSetterMatcher.h"
#include "test/UnitTest/Test.h"
+#include <sys/epoll.h>
+
using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher;
TEST(LlvmLibcEpollWaitTest, Basic) {
- EXPECT_THAT(LIBC_NAMESPACE::epoll_wait(-1, nullptr, 0, 0),
- returns(EQ(-1ul)).with_errno(EQ(EINVAL)));
-}
+ int epfd = LIBC_NAMESPACE::epoll_create1(0);
+ ASSERT_GT(epfd, 0);
+ ASSERT_ERRNO_SUCCESS();
+
+ int pipefd[2];
+
+ ASSERT_THAT(LIBC_NAMESPACE::pipe(pipefd), Succeeds());
+
+ epoll_event event{.events = EPOLLOUT, .data = {.fd = pipefd[0]}};
-// TODO: Complete these tests when epoll_create is implemented.
+ ASSERT_THAT(LIBC_NAMESPACE::epoll_ctl(epfd, EPOLL_CTL_ADD, pipefd[0], &event),
+ Succeeds());
+
+ // Timeout of 0 causes immediate return. We just need to check that the
+ // interface works, we're not testing the kernel behavior here.
+ ASSERT_THAT(LIBC_NAMESPACE::epoll_wait(epfd, &event, 1, 0), Succeeds());
+
+ ASSERT_THAT(LIBC_NAMESPACE::epoll_wait(-1, &event, 1, 0), Fails(EBADF));
+
+ ASSERT_THAT(LIBC_NAMESPACE::epoll_ctl(epfd, EPOLL_CTL_DEL, pipefd[0], &event),
+ Succeeds());
+
+ ASSERT_THAT(LIBC_NAMESPACE::close(pipefd[0]), Succeeds());
+ ASSERT_THAT(LIBC_NAMESPACE::close(pipefd[1]), Succeeds());
+ ASSERT_THAT(LIBC_NAMESPACE::close(epfd), Succeeds());
+}
diff --git a/libc/test/src/unistd/CMakeLists.txt b/libc/test/src/unistd/CMakeLists.txt
index 3a7fe6f45c0911..adc57b29a4dbc4 100644
--- a/libc/test/src/unistd/CMakeLists.txt
+++ b/libc/test/src/unistd/CMakeLists.txt
@@ -212,6 +212,21 @@ add_libc_unittest(
libc.test.UnitTest.ErrnoSetterMatcher
)
+add_libc_unittest(
+ pipe_test
+ SUITE
+ libc_unistd_unittests
+ SRCS
+ pipe_test.cpp
+ DEPENDS
+ libc.include.errno
+ libc.include.unistd
+ libc.src.errno.errno
+ libc.src.unistd.close
+ libc.src.unistd.pipe
+ libc.test.UnitTest.ErrnoSetterMatcher
+)
+
add_libc_unittest(
rmdir_test
SUITE
diff --git a/libc/test/src/unistd/pipe_test.cpp b/libc/test/src/unistd/pipe_test.cpp
new file mode 100644
index 00000000000000..9c633dea1dba55
--- /dev/null
+++ b/libc/test/src/unistd/pipe_test.cpp
@@ -0,0 +1,26 @@
+//===-- Unittests for pipe ------------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+#include "src/unistd/close.h"
+#include "src/unistd/pipe.h"
+
+#include "test/UnitTest/ErrnoSetterMatcher.h"
+#include "test/UnitTest/Test.h"
+
+using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher;
+
+TEST(LlvmLibcPipeTest, SmokeTest) {
+
+ int pipefd[2];
+
+ ASSERT_THAT(LIBC_NAMESPACE::pipe(pipefd), Succeeds());
+
+ ASSERT_THAT(LIBC_NAMESPACE::close(pipefd[0]), Succeeds());
+ ASSERT_THAT(LIBC_NAMESPACE::close(pipefd[1]), Succeeds());
+}
+
+// TODO: Functionality tests
diff --git a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
index a1a5b7fe9bf406..eb383db855dd07 100644
--- a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
+++ b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
@@ -2807,6 +2807,17 @@ libc_function(
],
)
+libc_function(
+ name = "pipe",
+ srcs = ["src/unistd/linux/pipe.cpp"],
+ hdrs = ["src/unistd/pipe.h"],
+ deps = [
+ ":__support_common",
+ ":__support_osutil_syscall",
+ ":errno",
+ ],
+)
+
libc_function(
name = "lseek",
srcs = ["src/unistd/linux/lseek.cpp"],
@@ -3258,6 +3269,39 @@ libc_function(
############################## sys/epoll targets ###############################
+libc_function(
+ name = "epoll_create",
+ srcs = ["src/sys/epoll/linux/epoll_create.cpp"],
+ hdrs = ["src/sys/epoll/epoll_create.h"],
+ weak = True,
+ deps = [
+ ":__support_osutil_syscall",
+ ":errno",
+ ],
+)
+
+libc_function(
+ name = "epoll_create1",
+ srcs = ["src/sys/epoll/linux/epoll_create1.cpp"],
+ hdrs = ["src/sys/epoll/epoll_create1.h"],
+ weak = True,
+ deps = [
+ ":__support_osutil_syscall",
+ ":errno",
+ ],
+)
+
+libc_function(
+ name = "epoll_ctl",
+ srcs = ["src/sys/epoll/linux/epoll_ctl.cpp"],
+ hdrs = ["src/sys/epoll/epoll_ctl.h"],
+ weak = True,
+ deps = [
+ ":__support_osutil_syscall",
+ ":errno",
+ ],
+)
+
libc_function(
name = "epoll_wait",
srcs = ["src/sys/epoll/linux/epoll_wait.cpp"],
diff --git a/utils/bazel/llvm-project-overlay/libc/test/src/sys/epoll/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/test/src/sys/epoll/BUILD.bazel
index e6b63235757e51..d9c1c1cc4274f6 100644
--- a/utils/bazel/llvm-project-overlay/libc/test/src/sys/epoll/BUILD.bazel
+++ b/utils/bazel/llvm-project-overlay/libc/test/src/sys/epoll/BUILD.bazel
@@ -10,11 +10,44 @@ package(default_visibility = ["//visibility:public"])
licenses(["notice"])
+libc_test(
+ name = "epoll_create_test",
+ srcs = ["linux/epoll_create_test.cpp"],
+ libc_function_deps = [
+ "//libc:epoll_create",
+ "//libc:close",
+ ],
+)
+
+libc_test(
+ name = "epoll_create1_test",
+ srcs = ["linux/epoll_create1_test.cpp"],
+ libc_function_deps = [
+ "//libc:epoll_create1",
+ "//libc:close",
+ ],
+)
+
+libc_test(
+ name = "epoll_ctl_test",
+ srcs = ["linux/epoll_ctl_test.cpp"],
+ libc_function_deps = [
+ "//libc:epoll_create1",
+ "//libc:epoll_ctl",
+ "//libc:pipe",
+ "//libc:close",
+ ],
+)
+
libc_test(
name = "epoll_wait_test",
srcs = ["linux/epoll_wait_test.cpp"],
libc_function_deps = [
"//libc:epoll_wait",
+ "//libc:epoll_create1",
+ "//libc:epoll_ctl",
+ "//libc:pipe",
+ "//libc:close",
],
)
@@ -23,6 +56,10 @@ libc_test(
srcs = ["linux/epoll_pwait_test.cpp"],
libc_function_deps = [
"//libc:epoll_pwait",
+ "//libc:epoll_create1",
+ "//libc:epoll_ctl",
+ "//libc:pipe",
+ "//libc:close",
],
)
@@ -33,5 +70,9 @@ libc_test(
# srcs = ["linux/epoll_pwait2_test.cpp"],
# libc_function_deps = [
# "//libc:epoll_pwait2",
+# "//libc:epoll_create1",
+# "//libc:epoll_ctl",
+# "//libc:pipe",
+# "//libc:close",
# ],
# )
>From 2195351bfcfb16e3cb31053bd81fb8488994f024 Mon Sep 17 00:00:00 2001
From: Michael Jones <michaelrj at google.com>
Date: Tue, 12 Mar 2024 11:04:21 -0700
Subject: [PATCH 2/3] address comments
---
libc/include/llvm-libc-macros/linux/sys-epoll-macros.h | 2 +-
libc/src/sys/epoll/linux/epoll_create.cpp | 3 +--
libc/src/sys/epoll/linux/epoll_ctl.cpp | 5 ++---
libc/src/sys/epoll/linux/epoll_pwait.cpp | 6 ++----
libc/src/sys/epoll/linux/epoll_pwait2.cpp | 7 ++-----
libc/src/sys/epoll/linux/epoll_wait.cpp | 6 ++----
libc/test/src/sys/epoll/linux/epoll_create1_test.cpp | 2 +-
libc/test/src/sys/epoll/linux/epoll_create_test.cpp | 4 ++++
libc/test/src/sys/epoll/linux/epoll_pwait2_test.cpp | 2 +-
libc/test/src/sys/epoll/linux/epoll_pwait_test.cpp | 2 +-
libc/test/src/sys/epoll/linux/epoll_wait_test.cpp | 2 +-
11 files changed, 18 insertions(+), 23 deletions(-)
diff --git a/libc/include/llvm-libc-macros/linux/sys-epoll-macros.h b/libc/include/llvm-libc-macros/linux/sys-epoll-macros.h
index 59fb2c23ce9426..b885c8e6b51927 100644
--- a/libc/include/llvm-libc-macros/linux/sys-epoll-macros.h
+++ b/libc/include/llvm-libc-macros/linux/sys-epoll-macros.h
@@ -9,7 +9,7 @@
#ifndef LLVM_LIBC_MACROS_LINUX_SYS_EPOLL_MACROS_H
#define LLVM_LIBC_MACROS_LINUX_SYS_EPOLL_MACROS_H
-#include "llvm-libc-macros/linux/fcntl-macros.h"
+#include "fcntl-macros.h"
// TODO: Do we need to define these?
diff --git a/libc/src/sys/epoll/linux/epoll_create.cpp b/libc/src/sys/epoll/linux/epoll_create.cpp
index 382320edca7353..d4995c476074e8 100644
--- a/libc/src/sys/epoll/linux/epoll_create.cpp
+++ b/libc/src/sys/epoll/linux/epoll_create.cpp
@@ -15,11 +15,10 @@
namespace LIBC_NAMESPACE {
-LLVM_LIBC_FUNCTION(int, epoll_create, (int size)) {
+LLVM_LIBC_FUNCTION(int, epoll_create, ([[maybe_unused]] int size)) {
#ifdef SYS_epoll_create
int ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_epoll_create, size);
#elif defined(SYS_epoll_create1)
- // TODO: Silence warning for size being unused.
int ret = LIBC_NAMESPACE::syscall_impl<int>(SYS_epoll_create1, 0);
#else
#error \
diff --git a/libc/src/sys/epoll/linux/epoll_ctl.cpp b/libc/src/sys/epoll/linux/epoll_ctl.cpp
index 2835dfc6f3a244..2c31213e5bdd58 100644
--- a/libc/src/sys/epoll/linux/epoll_ctl.cpp
+++ b/libc/src/sys/epoll/linux/epoll_ctl.cpp
@@ -13,9 +13,8 @@
#include "src/errno/libc_errno.h"
#include <sys/syscall.h> // For syscall numbers.
-// TODO: Use this include once the include headers are also using quotes.
-// #include "include/llvm-libc-types/struct_epoll_event.h"
-
+// Since this is a function available in overlay mode, it uses the public
+// header.
#include <sys/epoll.h>
namespace LIBC_NAMESPACE {
diff --git a/libc/src/sys/epoll/linux/epoll_pwait.cpp b/libc/src/sys/epoll/linux/epoll_pwait.cpp
index 4c4c6425bc16f2..41328d57725f06 100644
--- a/libc/src/sys/epoll/linux/epoll_pwait.cpp
+++ b/libc/src/sys/epoll/linux/epoll_pwait.cpp
@@ -13,10 +13,8 @@
#include "src/errno/libc_errno.h"
#include <sys/syscall.h> // For syscall numbers.
-// TODO: Use this include once the include headers are also using quotes.
-// #include "include/llvm-libc-types/sigset_t.h"
-// #include "include/llvm-libc-types/struct_epoll_event.h"
-
+// Since this is a function available in overlay mode, it uses the public
+// headers.
#include <sys/epoll.h>
#include <signal.h> // for NSIG
diff --git a/libc/src/sys/epoll/linux/epoll_pwait2.cpp b/libc/src/sys/epoll/linux/epoll_pwait2.cpp
index 4fea4a6bc83b1e..5a6083999a3ea1 100644
--- a/libc/src/sys/epoll/linux/epoll_pwait2.cpp
+++ b/libc/src/sys/epoll/linux/epoll_pwait2.cpp
@@ -13,11 +13,8 @@
#include "src/errno/libc_errno.h"
#include <sys/syscall.h> // For syscall numbers.
-// TODO: Use this include once the include headers are also using quotes.
-// #include "include/llvm-libc-types/sigset_t.h"
-// #include "include/llvm-libc-types/struct_epoll_event.h"
-// #include "include/llvm-libc-types/struct_timespec.h"
-
+// Since this is a function available in overlay mode, it uses the public
+// headers.
#include <sys/epoll.h>
#include <signal.h> // for NSIG
diff --git a/libc/src/sys/epoll/linux/epoll_wait.cpp b/libc/src/sys/epoll/linux/epoll_wait.cpp
index 514306f0a076f4..b15f5d3a2dc347 100644
--- a/libc/src/sys/epoll/linux/epoll_wait.cpp
+++ b/libc/src/sys/epoll/linux/epoll_wait.cpp
@@ -13,10 +13,8 @@
#include "src/errno/libc_errno.h"
#include <sys/syscall.h> // For syscall numbers.
-// TODO: Use this include once the include headers are also using quotes.
-// #include "include/llvm-libc-types/sigset_t.h"
-// #include "include/llvm-libc-types/struct_epoll_event.h"
-
+// Since this is a function available in overlay mode, it uses the public
+// headers.
#include <sys/epoll.h>
#include <signal.h> // for NSIG
diff --git a/libc/test/src/sys/epoll/linux/epoll_create1_test.cpp b/libc/test/src/sys/epoll/linux/epoll_create1_test.cpp
index 80bf0b0425e63b..349ad1b37607bb 100644
--- a/libc/test/src/sys/epoll/linux/epoll_create1_test.cpp
+++ b/libc/test/src/sys/epoll/linux/epoll_create1_test.cpp
@@ -11,7 +11,7 @@
#include "test/UnitTest/ErrnoSetterMatcher.h"
#include "test/UnitTest/Test.h"
-#include <sys/epoll.h>
+#include <sys/epoll.h> // For EPOLL_CLOEXEC
using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher;
diff --git a/libc/test/src/sys/epoll/linux/epoll_create_test.cpp b/libc/test/src/sys/epoll/linux/epoll_create_test.cpp
index 131a1ec0d30277..fdcdcf8eb42716 100644
--- a/libc/test/src/sys/epoll/linux/epoll_create_test.cpp
+++ b/libc/test/src/sys/epoll/linux/epoll_create_test.cpp
@@ -20,3 +20,7 @@ TEST(LlvmLibcEpollCreateTest, Basic) {
ASSERT_THAT(LIBC_NAMESPACE::close(fd), Succeeds());
}
+
+TEST(LlvmLibcEpollCreateTest, Fails) {
+ ASSERT_THAT(LIBC_NAMESPACE::epoll_create(0), Fails(EINVAL));
+}
diff --git a/libc/test/src/sys/epoll/linux/epoll_pwait2_test.cpp b/libc/test/src/sys/epoll/linux/epoll_pwait2_test.cpp
index 5683ba90bb97cf..6e762c1e86e97d 100644
--- a/libc/test/src/sys/epoll/linux/epoll_pwait2_test.cpp
+++ b/libc/test/src/sys/epoll/linux/epoll_pwait2_test.cpp
@@ -14,7 +14,7 @@
#include "test/UnitTest/ErrnoSetterMatcher.h"
#include "test/UnitTest/Test.h"
-#include <sys/epoll.h>
+#include <sys/epoll.h> // For epoll_event and timespec
using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher;
diff --git a/libc/test/src/sys/epoll/linux/epoll_pwait_test.cpp b/libc/test/src/sys/epoll/linux/epoll_pwait_test.cpp
index 582faacbdb5bb3..7f4c570b630520 100644
--- a/libc/test/src/sys/epoll/linux/epoll_pwait_test.cpp
+++ b/libc/test/src/sys/epoll/linux/epoll_pwait_test.cpp
@@ -14,7 +14,7 @@
#include "test/UnitTest/ErrnoSetterMatcher.h"
#include "test/UnitTest/Test.h"
-#include <sys/epoll.h>
+#include <sys/epoll.h> // For epoll_event
using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher;
diff --git a/libc/test/src/sys/epoll/linux/epoll_wait_test.cpp b/libc/test/src/sys/epoll/linux/epoll_wait_test.cpp
index 7fdb93efd8704b..b407e50c92adec 100644
--- a/libc/test/src/sys/epoll/linux/epoll_wait_test.cpp
+++ b/libc/test/src/sys/epoll/linux/epoll_wait_test.cpp
@@ -14,7 +14,7 @@
#include "test/UnitTest/ErrnoSetterMatcher.h"
#include "test/UnitTest/Test.h"
-#include <sys/epoll.h>
+#include <sys/epoll.h> // For epoll_event
using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher;
>From 473a08cc7770f12624ae62b6e5ade62f90cf6f67 Mon Sep 17 00:00:00 2001
From: Michael Jones <michaelrj at google.com>
Date: Tue, 12 Mar 2024 11:25:21 -0700
Subject: [PATCH 3/3] fix formatting
---
libc/src/sys/epoll/linux/epoll_pwait.cpp | 2 +-
libc/src/sys/epoll/linux/epoll_pwait2.cpp | 2 +-
libc/src/sys/epoll/linux/epoll_wait.cpp | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/libc/src/sys/epoll/linux/epoll_pwait.cpp b/libc/src/sys/epoll/linux/epoll_pwait.cpp
index 41328d57725f06..e3bbdb99d732c6 100644
--- a/libc/src/sys/epoll/linux/epoll_pwait.cpp
+++ b/libc/src/sys/epoll/linux/epoll_pwait.cpp
@@ -15,8 +15,8 @@
// Since this is a function available in overlay mode, it uses the public
// headers.
-#include <sys/epoll.h>
#include <signal.h> // for NSIG
+#include <sys/epoll.h>
namespace LIBC_NAMESPACE {
diff --git a/libc/src/sys/epoll/linux/epoll_pwait2.cpp b/libc/src/sys/epoll/linux/epoll_pwait2.cpp
index 5a6083999a3ea1..6a0417aa044308 100644
--- a/libc/src/sys/epoll/linux/epoll_pwait2.cpp
+++ b/libc/src/sys/epoll/linux/epoll_pwait2.cpp
@@ -15,8 +15,8 @@
// Since this is a function available in overlay mode, it uses the public
// headers.
-#include <sys/epoll.h>
#include <signal.h> // for NSIG
+#include <sys/epoll.h>
namespace LIBC_NAMESPACE {
diff --git a/libc/src/sys/epoll/linux/epoll_wait.cpp b/libc/src/sys/epoll/linux/epoll_wait.cpp
index b15f5d3a2dc347..7101d90fdae2cd 100644
--- a/libc/src/sys/epoll/linux/epoll_wait.cpp
+++ b/libc/src/sys/epoll/linux/epoll_wait.cpp
@@ -15,8 +15,8 @@
// Since this is a function available in overlay mode, it uses the public
// headers.
-#include <sys/epoll.h>
#include <signal.h> // for NSIG
+#include <sys/epoll.h>
namespace LIBC_NAMESPACE {
More information about the libc-commits
mailing list