summaryrefslogtreecommitdiff
path: root/src/__support/OSUtil/linux/quick_exit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/__support/OSUtil/linux/quick_exit.cpp')
-rw-r--r--src/__support/OSUtil/linux/quick_exit.cpp28
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