//===-- Implementation of exit --------------------------------------------===// // // 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/stdlib/exit.h" #include "src/__support/OSUtil/exit.h" #include "src/__support/common.h" #include "src/__support/macros/config.h" namespace LIBC_NAMESPACE_DECL { extern "C" void __cxa_finalize(void *); // exit needs to clean up TLS and call associated destructors. // TODO: Strictly speaking, it is not valid to call exit in overlay mode // as we have no way to ensure system libc will call the TLS destructors. // We should run exit related tests in hermetic mode but this is currently // blocked by https://github.com/llvm/llvm-project/issues/133925. extern "C" [[gnu::weak]] void __cxa_thread_finalize(); // TODO: use recursive mutex to protect this routine. [[noreturn]] LLVM_LIBC_FUNCTION(void, exit, (int status)) { // FIXME: The NVPTX target does not support external weak symbols correctly // despite being an ELF platform. Disable pending a future split. #if !defined(LIBC_TARGET_ARCH_IS_NVPTX) if (__cxa_thread_finalize) __cxa_thread_finalize(); #endif __cxa_finalize(nullptr); internal::exit(status); } } // namespace LIBC_NAMESPACE_DECL