[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
This commit is contained in:
Louis Dionne 2019-04-17 18:20:19 +00:00
parent 05a358cdcd
commit 81875a67b0
2 changed files with 8 additions and 2 deletions

View File

@ -1120,6 +1120,12 @@ template <unsigned> 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 *);

View File

@ -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<mutex_type> RLock;
mutex_type&
mut()
{
static mutex_type m;
static _LIBCPP_NO_DESTROY mutex_type m;
return m;
}
#endif // !_LIBCPP_HAS_NO_THREADS