From 81875a67b0d1bd43cca96b5e321a4af06b9299cd Mon Sep 17 00:00:00 2001 From: Louis Dionne Date: Wed, 17 Apr 2019 18:20:19 +0000 Subject: [PATCH] [libc++] Use the no_destroy attribute to avoid destroying debug DB statics Summary: Otherwise, we can run into problems when the program has static variables that need to use the debug database during their deinitialization, if the debug DB has already been deinitialized. Reviewers: EricWF Subscribers: christof, jkorous, dexonsmith, libcxx-commits Tags: #libc Differential Revision: https://reviews.llvm.org/D60830 llvm-svn: 358602 --- libcxx/include/__config | 6 ++++++ libcxx/src/debug.cpp | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/libcxx/include/__config b/libcxx/include/__config index a7d0b14..ead5225 100644 --- a/libcxx/include/__config +++ b/libcxx/include/__config @@ -1120,6 +1120,12 @@ template struct __static_assert_check {}; #endif #endif +#if __has_attribute(no_destroy) +# define _LIBCPP_NO_DESTROY __attribute__((__no_destroy__)) +#else +# define _LIBCPP_NO_DESTROY +#endif + #ifndef _LIBCPP_HAS_NO_ASAN _LIBCPP_FUNC_VIS extern "C" void __sanitizer_annotate_contiguous_container( const void *, const void *, const void *, const void *); diff --git a/libcxx/src/debug.cpp b/libcxx/src/debug.cpp index 93fa1a8..7fdf90c 100644 --- a/libcxx/src/debug.cpp +++ b/libcxx/src/debug.cpp @@ -42,7 +42,7 @@ _LIBCPP_FUNC_VIS __libcpp_db* __get_db() { - static __libcpp_db db; + static _LIBCPP_NO_DESTROY __libcpp_db db; return &db; } @@ -64,7 +64,7 @@ typedef lock_guard RLock; mutex_type& mut() { - static mutex_type m; + static _LIBCPP_NO_DESTROY mutex_type m; return m; } #endif // !_LIBCPP_HAS_NO_THREADS -- 2.7.4