Index: lib/asan/CMakeLists.txt =================================================================== --- lib/asan/CMakeLists.txt +++ lib/asan/CMakeLists.txt @@ -3,6 +3,7 @@ set(ASAN_SOURCES asan_allocator.cc asan_activation.cc + asan_bsd.cc asan_debugging.cc asan_descriptions.cc asan_errors.cc Index: lib/asan/asan_bsd.cc =================================================================== --- /dev/null +++ lib/asan/asan_bsd.cc @@ -0,0 +1,78 @@ +//===-- asan_bsd.cc -----------------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file is a part of AddressSanitizer, an address sanity checker. +// +// Posix-specific details. +//===----------------------------------------------------------------------===// + +#include "sanitizer_common/sanitizer_platform.h" +#if SANITIZER_NETBSD || SANITIZER_FREEBSD + +#include "asan_internal.h" +#include "asan_interceptors.h" +#include "asan_mapping.h" +#include "asan_report.h" +#include "asan_stack.h" +#include "sanitizer_common/sanitizer_libc.h" +#include "sanitizer_common/sanitizer_posix.h" +#include "sanitizer_common/sanitizer_procmaps.h" + +#include +#include +#include +#include +#include + +namespace __asan { + +void AsanOnDeadlySignal(int signo, void *siginfo, void *context) { + StartReportDeadlySignal(); + SignalContext sig(siginfo, context); + ReportDeadlySignal(sig); +} + +// ---------------------- TSD ---------------- {{{1 + +struct Tsd { + void *data; + void (*destructor)(void *arg); + Tsd() : data(nullptr), destructor(nullptr) {} + ~Tsd() { + if (destructor) + destructor(data); + } +}; + + +static bool tsd_key_inited = false; +thread_local Tsd _tsd; +void AsanTSDInit(void (*destructor)(void *tsd)) { + CHECK(!tsd_key_inited); + CHECK(destructor == &PlatformTSDDtor); + tsd_key_inited = true; + _tsd.destructor = destructor; +} + +void *AsanTSDGet() { + CHECK(tsd_key_inited); + return _tsd.data; +} + +void AsanTSDSet(void *tsd) { + CHECK(tsd_key_inited); + _tsd.data = tsd; +} + +void PlatformTSDDtor(void *tsd) { + AsanThread::TSDDtor(tsd); +} +} // namespace __asan + +#endif // SANITIZER_NETBSD || SANITIZER_FREEBSD Index: lib/asan/asan_posix.cc =================================================================== --- lib/asan/asan_posix.cc +++ lib/asan/asan_posix.cc @@ -13,7 +13,7 @@ //===----------------------------------------------------------------------===// #include "sanitizer_common/sanitizer_platform.h" -#if SANITIZER_POSIX +#if SANITIZER_LINUX || SANITIZER_SOLARIS #include "asan_internal.h" #include "asan_interceptors.h" @@ -69,4 +69,4 @@ } } // namespace __asan -#endif // SANITIZER_POSIX +#endif // SANITIZER_LINUX || SANITIZER_SOLARIS