]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/compiler-rt/lib/asan/asan_posix.cc
MFV r323911:
[FreeBSD/FreeBSD.git] / contrib / compiler-rt / lib / asan / asan_posix.cc
1 //===-- asan_posix.cc -----------------------------------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file is a part of AddressSanitizer, an address sanity checker.
11 //
12 // Posix-specific details.
13 //===----------------------------------------------------------------------===//
14
15 #include "sanitizer_common/sanitizer_platform.h"
16 #if SANITIZER_POSIX
17
18 #include "asan_internal.h"
19 #include "asan_interceptors.h"
20 #include "asan_mapping.h"
21 #include "asan_report.h"
22 #include "asan_stack.h"
23 #include "sanitizer_common/sanitizer_libc.h"
24 #include "sanitizer_common/sanitizer_posix.h"
25 #include "sanitizer_common/sanitizer_procmaps.h"
26
27 #include <pthread.h>
28 #include <stdlib.h>
29 #include <sys/time.h>
30 #include <sys/resource.h>
31 #include <unistd.h>
32
33 namespace __asan {
34
35 void AsanOnDeadlySignal(int signo, void *siginfo, void *context) {
36   StartReportDeadlySignal();
37   SignalContext sig(siginfo, context);
38   ReportDeadlySignal(sig);
39 }
40
41 // ---------------------- TSD ---------------- {{{1
42
43 static pthread_key_t tsd_key;
44 static bool tsd_key_inited = false;
45 void AsanTSDInit(void (*destructor)(void *tsd)) {
46   CHECK(!tsd_key_inited);
47   tsd_key_inited = true;
48   CHECK_EQ(0, pthread_key_create(&tsd_key, destructor));
49 }
50
51 void *AsanTSDGet() {
52   CHECK(tsd_key_inited);
53   return pthread_getspecific(tsd_key);
54 }
55
56 void AsanTSDSet(void *tsd) {
57   CHECK(tsd_key_inited);
58   pthread_setspecific(tsd_key, tsd);
59 }
60
61 void PlatformTSDDtor(void *tsd) {
62   AsanThreadContext *context = (AsanThreadContext*)tsd;
63   if (context->destructor_iterations > 1) {
64     context->destructor_iterations--;
65     CHECK_EQ(0, pthread_setspecific(tsd_key, tsd));
66     return;
67   }
68   AsanThread::TSDDtor(tsd);
69 }
70 }  // namespace __asan
71
72 #endif  // SANITIZER_POSIX