Index: lib/asan/asan_posix.cc =================================================================== --- lib/asan/asan_posix.cc +++ lib/asan/asan_posix.cc @@ -40,6 +40,44 @@ // ---------------------- TSD ---------------- {{{1 +#if SANITIZER_NETBSD +// Thread Static Data cannot be used in early init on NetBSD +// Reuse the Asan TSD API for compatibility with existing code +// with an alternative implementation. + +static bool tsd_key_inited = false; +static void (*tsd_destructor)(void *tsd) = nullptr; +static THREADLOCAL void *tsd_key = nullptr; + +void tsd_at_exit(void *unused) { + (*tsd_destructor)(tsd_key); +} + +void AsanTSDInit(void (*destructor)(void *tsd)) { + CHECK(!tsd_key_inited); + tsd_key_inited = true; + tsd_destructor = destructor; + if (REAL(__cxa_atexit)(tsd_at_exit, 0, 0)) { + Printf("AddressSanitizer: failed to setup atexit callback"); + Die(); + } +} + +void *AsanTSDGet() { + CHECK(tsd_key_inited); + return tsd_key; +} + +void AsanTSDSet(void *tsd) { + CHECK(tsd_key_inited); + tsd_key = tsd; +} + +void PlatformTSDDtor(void *tsd) { + CHECK(tsd_key_inited); + AsanThread::TSDDtor(tsd); +} +#else static pthread_key_t tsd_key; static bool tsd_key_inited = false; void AsanTSDInit(void (*destructor)(void *tsd)) { @@ -67,6 +105,7 @@ } AsanThread::TSDDtor(tsd); } +#endif } // namespace __asan #endif // SANITIZER_POSIX