summaryrefslogtreecommitdiff
path: root/libc/src/stdlib/exit.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libc/src/stdlib/exit.cpp')
-rw-r--r--libc/src/stdlib/exit.cpp14
1 files changed, 14 insertions, 0 deletions
diff --git a/libc/src/stdlib/exit.cpp b/libc/src/stdlib/exit.cpp
index 28a6f8a63c0c..f26d48ac00d7 100644
--- a/libc/src/stdlib/exit.cpp
+++ b/libc/src/stdlib/exit.cpp
@@ -15,7 +15,21 @@ 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);
}