Add the kill syscall wrapper and tests.
Reviewed By: sivachandra
Differential Revision: https://reviews.llvm.org/D135406
}
def SignalAPI : PublicAPI<"signal.h"> {
- let Types = ["sigset_t", "struct sigaction", "union sigval", "siginfo_t"];
+ let Types = [
+ "sigset_t",
+ "struct sigaction",
+ "union sigval",
+ "siginfo_t",
+ "pid_t",
+ ];
}
def ThreadsAPI : PublicAPI<"threads.h"> {
libc.src.sched.sched_getaffinity
libc.src.sched.sched_setaffinity
+ # signal.h entrypoints
+ libc.src.signal.kill
+
# string.h entrypoints
libc.src.string.bcmp
libc.src.string.bzero
.llvm-libc-types.struct_sigaction
.llvm-libc-types.__sighandler_t
.llvm-libc-types.sigset_t
+ .llvm-libc-types.pid_t
)
add_gen_header(
SigSetType,
StructSigaction,
UnionSigVal,
+ PidT,
],
[], // Enumerations
[
FunctionSpec<
+ "kill",
+ RetValSpec<IntType>,
+ [ArgSpec<PidT>,
+ ArgSpec<IntType>]
+ >,
+ FunctionSpec<
"sigaction",
RetValSpec<IntType>,
[ArgSpec<IntType>,
)
add_entrypoint_object(
+ kill
+ ALIAS
+ DEPENDS
+ .${LIBC_TARGET_OS}.kill
+)
+
+add_entrypoint_object(
sigaction
ALIAS
DEPENDS
--- /dev/null
+//===-- Implementation header for kill 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_SIGNAL_KILL_H
+#define LLVM_LIBC_SRC_SIGNAL_KILL_H
+
+#include <signal.h>
+
+namespace __llvm_libc {
+
+int kill(pid_t pid, int sig);
+
+} // namespace __llvm_libc
+
+#endif // LLVM_LIBC_SRC_SIGNAL_KILL_H
)
add_entrypoint_object(
+ kill
+ SRCS
+ kill.cpp
+ HDRS
+ ../kill.h
+ DEPENDS
+ libc.include.signal
+ libc.include.errno
+ libc.src.errno.errno
+ libc.include.sys_syscall
+ libc.src.__support.OSUtil.osutil
+)
+
+add_entrypoint_object(
raise
SRCS
raise.cpp
--- /dev/null
+//===-- Linux implementation of kill --------------------------------------===//
+//
+// 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/signal/kill.h"
+
+#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
+#include "src/signal/linux/signal_utils.h"
+
+#include "src/__support/common.h"
+
+#include <errno.h>
+#include <signal.h>
+#include <sys/syscall.h> // For syscall numbers.
+
+namespace __llvm_libc {
+
+LLVM_LIBC_FUNCTION(int, kill, (pid_t pid, int sig)) {
+ int ret = __llvm_libc::syscall_impl(SYS_kill, pid, sig);
+
+ // A negative return value indicates an error with the magnitude of the
+ // value being the error code.
+ if (ret != 0) {
+ errno = (ret > 0 ? ret : -ret);
+ return -1;
+ }
+
+ return ret; // always 0
+}
+
+} // namespace __llvm_libc
)
add_libc_unittest(
+ kill_test
+ SUITE
+ libc_signal_unittests
+ SRCS
+ kill_test.cpp
+ DEPENDS
+ libc.include.signal
+ libc.include.errno
+ libc.src.errno.errno
+ libc.src.signal.kill
+ libc.include.sys_syscall
+ libc.src.__support.OSUtil.osutil
+ libc.test.errno_setter_matcher
+)
+
+add_libc_unittest(
sigaction_test
SUITE
libc_signal_unittests
--- /dev/null
+//===-- Unittests for kill -----------------------------------------------===//
+//
+// 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/signal/kill.h"
+
+#include "include/sys/syscall.h" // For syscall numbers.
+#include "src/__support/OSUtil/syscall.h" // For internal syscall function.
+#include "test/ErrnoSetterMatcher.h"
+#include "utils/UnitTest/Test.h"
+
+#include <errno.h>
+#include <signal.h>
+
+using __llvm_libc::testing::ErrnoSetterMatcher::Succeeds;
+
+TEST(LlvmLibcKillTest, TargetSelf) {
+ pid_t parent_pid = __llvm_libc::syscall_impl(SYS_getpid);
+ ASSERT_THAT(__llvm_libc::kill(parent_pid, 0), Succeeds(0));
+
+ EXPECT_DEATH(
+ [] {
+ pid_t child_pid = __llvm_libc::syscall_impl(SYS_getpid);
+ __llvm_libc::kill(child_pid, SIGKILL);
+ },
+ WITH_SIGNAL(SIGKILL));
+}