diff options
Diffstat (limited to 'src/__support/OSUtil/linux/quick_exit.cpp')
-rw-r--r-- | src/__support/OSUtil/linux/quick_exit.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/__support/OSUtil/linux/quick_exit.cpp b/src/__support/OSUtil/linux/quick_exit.cpp new file mode 100644 index 000000000000..51b3231d389f --- /dev/null +++ b/src/__support/OSUtil/linux/quick_exit.cpp @@ -0,0 +1,28 @@ +//===---------- Linux implementation of a quick exit 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 +// +//===----------------------------------------------------------------------===// + +#include "src/__support/common.h" +#include "syscall.h" // For internal syscall function. +#include <sys/syscall.h> // For syscall numbers. + +namespace LIBC_NAMESPACE { + +// mark as no_stack_protector for x86 since TLS can be torn down before calling +// quick_exit so that the stack protector canary cannot be loaded. +#ifdef LIBC_TARGET_ARCH_IS_X86 +__attribute__((no_stack_protector)) +#endif +__attribute__((noreturn)) void +quick_exit(int status) { + for (;;) { + LIBC_NAMESPACE::syscall_impl<long>(SYS_exit_group, status); + LIBC_NAMESPACE::syscall_impl<long>(SYS_exit, status); + } +} + +} // namespace LIBC_NAMESPACE |