[libc] add kill

Add the kill syscall wrapper and tests.

Reviewed By: sivachandra

Differential Revision: https://reviews.llvm.org/D135406
This commit is contained in:
Michael Jones
2022-10-06 14:59:30 -07:00
parent cebf1348df
commit 9015810648
10 changed files with 141 additions and 1 deletions

View File

@@ -205,7 +205,13 @@ def SysMManAPI : PublicAPI<"sys/mman.h"> {
}
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"> {

View File

@@ -26,6 +26,9 @@ set(TARGET_LIBC_ENTRYPOINTS
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

View File

@@ -137,6 +137,7 @@ add_gen_header(
.llvm-libc-types.struct_sigaction
.llvm-libc-types.__sighandler_t
.llvm-libc-types.sigset_t
.llvm-libc-types.pid_t
)
add_gen_header(

View File

@@ -258,9 +258,16 @@ def POSIX : StandardSpec<"POSIX"> {
SigSetType,
StructSigaction,
UnionSigVal,
PidT,
],
[], // Enumerations
[
FunctionSpec<
"kill",
RetValSpec<IntType>,
[ArgSpec<PidT>,
ArgSpec<IntType>]
>,
FunctionSpec<
"sigaction",
RetValSpec<IntType>,

View File

@@ -9,6 +9,13 @@ add_entrypoint_object(
.${LIBC_TARGET_OS}.raise
)
add_entrypoint_object(
kill
ALIAS
DEPENDS
.${LIBC_TARGET_OS}.kill
)
add_entrypoint_object(
sigaction
ALIAS

20
libc/src/signal/kill.h Normal file
View File

@@ -0,0 +1,20 @@
//===-- 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

View File

@@ -7,6 +7,20 @@ add_header_library(
libc.src.__support.OSUtil.osutil
)
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

View File

@@ -0,0 +1,35 @@
//===-- 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

View File

@@ -11,6 +11,22 @@ add_libc_unittest(
libc.src.signal.raise
)
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

View File

@@ -0,0 +1,31 @@
//===-- 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));
}