mirror of
https://github.com/intel/llvm.git
synced 2026-02-02 02:00:03 +08:00
[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:
@@ -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"> {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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>,
|
||||
|
||||
@@ -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
20
libc/src/signal/kill.h
Normal 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
|
||||
@@ -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
|
||||
|
||||
35
libc/src/signal/linux/kill.cpp
Normal file
35
libc/src/signal/linux/kill.cpp
Normal 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
|
||||
@@ -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
|
||||
|
||||
31
libc/test/src/signal/kill_test.cpp
Normal file
31
libc/test/src/signal/kill_test.cpp
Normal 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));
|
||||
}
|
||||
Reference in New Issue
Block a user