blob: 62db796616258a742e162ec4e20f8bab586a9073 [file] [log] [blame]
Alexey Samsonov603c4be2012-06-04 13:55:19 +00001//===-- tsan_interface_ann.cc ---------------------------------------------===//
Kostya Serebryany7ac41482012-05-10 13:48:04 +00002//
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 ThreadSanitizer (TSan), a race detector.
11//
12//===----------------------------------------------------------------------===//
Alexey Samsonovc0d78c12012-06-04 13:27:49 +000013#include "sanitizer_common/sanitizer_libc.h"
Dmitry Vyukov258c24b2012-12-04 14:01:21 +000014#include "sanitizer_common/sanitizer_internal_defs.h"
Alexey Samsonov47b16342012-06-07 09:50:16 +000015#include "sanitizer_common/sanitizer_placement_new.h"
Dmitry Vyukove7718bc2013-06-17 19:57:03 +000016#include "sanitizer_common/sanitizer_stacktrace.h"
Kostya Serebryany7ac41482012-05-10 13:48:04 +000017#include "tsan_interface_ann.h"
18#include "tsan_mutex.h"
Kostya Serebryany7ac41482012-05-10 13:48:04 +000019#include "tsan_report.h"
20#include "tsan_rtl.h"
21#include "tsan_mman.h"
22#include "tsan_flags.h"
Dmitry Vyukov3fb44412012-06-14 21:40:35 +000023#include "tsan_platform.h"
Dmitry Vyukov0fd908c2013-03-28 16:21:19 +000024#include "tsan_vector.h"
Kostya Serebryany7ac41482012-05-10 13:48:04 +000025
26#define CALLERPC ((uptr)__builtin_return_address(0))
27
28using namespace __tsan; // NOLINT
29
30namespace __tsan {
31
32class ScopedAnnotation {
33 public:
34 ScopedAnnotation(ThreadState *thr, const char *aname, const char *f, int l,
35 uptr pc)
Stephen Hines2d1fdb22014-05-28 23:58:16 -070036 : thr_(thr) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +000037 FuncEntry(thr_, pc);
Kostya Serebryany7ac41482012-05-10 13:48:04 +000038 DPrintf("#%d: annotation %s() %s:%d\n", thr_->tid, aname, f, l);
39 }
40
41 ~ScopedAnnotation() {
Kostya Serebryany7ac41482012-05-10 13:48:04 +000042 FuncExit(thr_);
Stephen Hines6a211c52014-07-21 00:49:56 -070043 CheckNoLocks(thr_);
Kostya Serebryany7ac41482012-05-10 13:48:04 +000044 }
45 private:
46 ThreadState *const thr_;
Kostya Serebryany7ac41482012-05-10 13:48:04 +000047};
48
49#define SCOPED_ANNOTATION(typ) \
50 if (!flags()->enable_annotations) \
51 return; \
52 ThreadState *thr = cur_thread(); \
Stephen Hines2d1fdb22014-05-28 23:58:16 -070053 const uptr caller_pc = (uptr)__builtin_return_address(0); \
Kostya Serebryany7ac41482012-05-10 13:48:04 +000054 StatInc(thr, StatAnnotation); \
55 StatInc(thr, Stat##typ); \
Stephen Hines2d1fdb22014-05-28 23:58:16 -070056 ScopedAnnotation sa(thr, __func__, f, l, caller_pc); \
Stephen Hines6d186232014-11-26 17:56:19 -080057 const uptr pc = StackTrace::GetCurrentPc(); \
Kostya Serebryany7ac41482012-05-10 13:48:04 +000058 (void)pc; \
59/**/
60
61static const int kMaxDescLen = 128;
62
63struct ExpectRace {
64 ExpectRace *next;
65 ExpectRace *prev;
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -080066 atomic_uintptr_t hitcount;
67 atomic_uintptr_t addcount;
Kostya Serebryany7ac41482012-05-10 13:48:04 +000068 uptr addr;
69 uptr size;
70 char *file;
71 int line;
72 char desc[kMaxDescLen];
73};
74
75struct DynamicAnnContext {
76 Mutex mtx;
77 ExpectRace expect;
78 ExpectRace benign;
79
80 DynamicAnnContext()
81 : mtx(MutexTypeAnnotations, StatMtxAnnotations) {
82 }
83};
84
85static DynamicAnnContext *dyn_ann_ctx;
Alexey Samsonov0a4c9062012-06-05 13:50:57 +000086static char dyn_ann_ctx_placeholder[sizeof(DynamicAnnContext)] ALIGNED(64);
Kostya Serebryany7ac41482012-05-10 13:48:04 +000087
88static void AddExpectRace(ExpectRace *list,
89 char *f, int l, uptr addr, uptr size, char *desc) {
90 ExpectRace *race = list->next;
91 for (; race != list; race = race->next) {
Dmitry Vyukov0fd908c2013-03-28 16:21:19 +000092 if (race->addr == addr && race->size == size) {
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -080093 atomic_store_relaxed(&race->addcount,
94 atomic_load_relaxed(&race->addcount) + 1);
Kostya Serebryany7ac41482012-05-10 13:48:04 +000095 return;
Dmitry Vyukov0fd908c2013-03-28 16:21:19 +000096 }
Kostya Serebryany7ac41482012-05-10 13:48:04 +000097 }
98 race = (ExpectRace*)internal_alloc(MBlockExpectRace, sizeof(ExpectRace));
Kostya Serebryany7ac41482012-05-10 13:48:04 +000099 race->addr = addr;
100 race->size = size;
101 race->file = f;
102 race->line = l;
103 race->desc[0] = 0;
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800104 atomic_store_relaxed(&race->hitcount, 0);
105 atomic_store_relaxed(&race->addcount, 1);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000106 if (desc) {
107 int i = 0;
108 for (; i < kMaxDescLen - 1 && desc[i]; i++)
109 race->desc[i] = desc[i];
110 race->desc[i] = 0;
111 }
112 race->prev = list;
113 race->next = list->next;
114 race->next->prev = race;
115 list->next = race;
116}
117
118static ExpectRace *FindRace(ExpectRace *list, uptr addr, uptr size) {
119 for (ExpectRace *race = list->next; race != list; race = race->next) {
120 uptr maxbegin = max(race->addr, addr);
121 uptr minend = min(race->addr + race->size, addr + size);
122 if (maxbegin < minend)
123 return race;
124 }
125 return 0;
126}
127
128static bool CheckContains(ExpectRace *list, uptr addr, uptr size) {
129 ExpectRace *race = FindRace(list, addr, size);
130 if (race == 0)
131 return false;
Alexey Samsonove9541012012-06-06 13:11:29 +0000132 DPrintf("Hit expected/benign race: %s addr=%zx:%d %s:%d\n",
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000133 race->desc, race->addr, (int)race->size, race->file, race->line);
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800134 atomic_fetch_add(&race->hitcount, 1, memory_order_relaxed);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000135 return true;
136}
137
138static void InitList(ExpectRace *list) {
139 list->next = list;
140 list->prev = list;
141}
142
143void InitializeDynamicAnnotations() {
144 dyn_ann_ctx = new(dyn_ann_ctx_placeholder) DynamicAnnContext;
145 InitList(&dyn_ann_ctx->expect);
146 InitList(&dyn_ann_ctx->benign);
147}
148
149bool IsExpectedReport(uptr addr, uptr size) {
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800150 ReadLock lock(&dyn_ann_ctx->mtx);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000151 if (CheckContains(&dyn_ann_ctx->expect, addr, size))
152 return true;
153 if (CheckContains(&dyn_ann_ctx->benign, addr, size))
154 return true;
155 return false;
156}
157
Dmitry Vyukov0fd908c2013-03-28 16:21:19 +0000158static void CollectMatchedBenignRaces(Vector<ExpectRace> *matched,
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800159 int *unique_count, int *hit_count, atomic_uintptr_t ExpectRace::*counter) {
Dmitry Vyukov0fd908c2013-03-28 16:21:19 +0000160 ExpectRace *list = &dyn_ann_ctx->benign;
161 for (ExpectRace *race = list->next; race != list; race = race->next) {
162 (*unique_count)++;
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800163 const uptr cnt = atomic_load_relaxed(&(race->*counter));
164 if (cnt == 0)
Dmitry Vyukov0fd908c2013-03-28 16:21:19 +0000165 continue;
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800166 *hit_count += cnt;
Dmitry Vyukov0fd908c2013-03-28 16:21:19 +0000167 uptr i = 0;
168 for (; i < matched->Size(); i++) {
169 ExpectRace *race0 = &(*matched)[i];
170 if (race->line == race0->line
171 && internal_strcmp(race->file, race0->file) == 0
172 && internal_strcmp(race->desc, race0->desc) == 0) {
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800173 atomic_fetch_add(&(race0->*counter), cnt, memory_order_relaxed);
Dmitry Vyukov0fd908c2013-03-28 16:21:19 +0000174 break;
175 }
176 }
177 if (i == matched->Size())
178 matched->PushBack(*race);
179 }
180}
181
182void PrintMatchedBenignRaces() {
183 Lock lock(&dyn_ann_ctx->mtx);
184 int unique_count = 0;
185 int hit_count = 0;
186 int add_count = 0;
187 Vector<ExpectRace> hit_matched(MBlockScopedBuf);
188 CollectMatchedBenignRaces(&hit_matched, &unique_count, &hit_count,
189 &ExpectRace::hitcount);
190 Vector<ExpectRace> add_matched(MBlockScopedBuf);
191 CollectMatchedBenignRaces(&add_matched, &unique_count, &add_count,
192 &ExpectRace::addcount);
193 if (hit_matched.Size()) {
194 Printf("ThreadSanitizer: Matched %d \"benign\" races (pid=%d):\n",
Peter Collingbourne0b694fc2013-05-17 16:56:53 +0000195 hit_count, (int)internal_getpid());
Dmitry Vyukov0fd908c2013-03-28 16:21:19 +0000196 for (uptr i = 0; i < hit_matched.Size(); i++) {
197 Printf("%d %s:%d %s\n",
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800198 atomic_load_relaxed(&hit_matched[i].hitcount),
199 hit_matched[i].file, hit_matched[i].line, hit_matched[i].desc);
Dmitry Vyukov0fd908c2013-03-28 16:21:19 +0000200 }
201 }
202 if (hit_matched.Size()) {
203 Printf("ThreadSanitizer: Annotated %d \"benign\" races, %d unique"
204 " (pid=%d):\n",
Peter Collingbourne0b694fc2013-05-17 16:56:53 +0000205 add_count, unique_count, (int)internal_getpid());
Dmitry Vyukov0fd908c2013-03-28 16:21:19 +0000206 for (uptr i = 0; i < add_matched.Size(); i++) {
207 Printf("%d %s:%d %s\n",
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800208 atomic_load_relaxed(&add_matched[i].addcount),
209 add_matched[i].file, add_matched[i].line, add_matched[i].desc);
Dmitry Vyukov0fd908c2013-03-28 16:21:19 +0000210 }
211 }
212}
213
214static void ReportMissedExpectedRace(ExpectRace *race) {
215 Printf("==================\n");
216 Printf("WARNING: ThreadSanitizer: missed expected data race\n");
217 Printf(" %s addr=%zx %s:%d\n",
218 race->desc, race->addr, race->file, race->line);
219 Printf("==================\n");
220}
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000221} // namespace __tsan
222
223using namespace __tsan; // NOLINT
224
225extern "C" {
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000226void INTERFACE_ATTRIBUTE AnnotateHappensBefore(char *f, int l, uptr addr) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000227 SCOPED_ANNOTATION(AnnotateHappensBefore);
Dmitry Vyukov9c1e4f42013-09-19 04:42:25 +0000228 Release(thr, pc, addr);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000229}
230
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000231void INTERFACE_ATTRIBUTE AnnotateHappensAfter(char *f, int l, uptr addr) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000232 SCOPED_ANNOTATION(AnnotateHappensAfter);
Dmitry Vyukov9c1e4f42013-09-19 04:42:25 +0000233 Acquire(thr, pc, addr);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000234}
235
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000236void INTERFACE_ATTRIBUTE AnnotateCondVarSignal(char *f, int l, uptr cv) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000237 SCOPED_ANNOTATION(AnnotateCondVarSignal);
238}
239
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000240void INTERFACE_ATTRIBUTE AnnotateCondVarSignalAll(char *f, int l, uptr cv) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000241 SCOPED_ANNOTATION(AnnotateCondVarSignalAll);
242}
243
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000244void INTERFACE_ATTRIBUTE AnnotateMutexIsNotPHB(char *f, int l, uptr mu) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000245 SCOPED_ANNOTATION(AnnotateMutexIsNotPHB);
246}
247
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000248void INTERFACE_ATTRIBUTE AnnotateCondVarWait(char *f, int l, uptr cv,
249 uptr lock) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000250 SCOPED_ANNOTATION(AnnotateCondVarWait);
251}
252
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000253void INTERFACE_ATTRIBUTE AnnotateRWLockCreate(char *f, int l, uptr m) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000254 SCOPED_ANNOTATION(AnnotateRWLockCreate);
Dmitry Vyukovc20e9ba2012-08-16 13:29:41 +0000255 MutexCreate(thr, pc, m, true, true, false);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000256}
257
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000258void INTERFACE_ATTRIBUTE AnnotateRWLockCreateStatic(char *f, int l, uptr m) {
Dmitry Vyukovc20e9ba2012-08-16 13:29:41 +0000259 SCOPED_ANNOTATION(AnnotateRWLockCreateStatic);
260 MutexCreate(thr, pc, m, true, true, true);
261}
262
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000263void INTERFACE_ATTRIBUTE AnnotateRWLockDestroy(char *f, int l, uptr m) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000264 SCOPED_ANNOTATION(AnnotateRWLockDestroy);
Dmitry Vyukovc20e9ba2012-08-16 13:29:41 +0000265 MutexDestroy(thr, pc, m);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000266}
267
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000268void INTERFACE_ATTRIBUTE AnnotateRWLockAcquired(char *f, int l, uptr m,
269 uptr is_w) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000270 SCOPED_ANNOTATION(AnnotateRWLockAcquired);
Dmitry Vyukovc20e9ba2012-08-16 13:29:41 +0000271 if (is_w)
272 MutexLock(thr, pc, m);
273 else
274 MutexReadLock(thr, pc, m);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000275}
276
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000277void INTERFACE_ATTRIBUTE AnnotateRWLockReleased(char *f, int l, uptr m,
278 uptr is_w) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000279 SCOPED_ANNOTATION(AnnotateRWLockReleased);
Dmitry Vyukovc20e9ba2012-08-16 13:29:41 +0000280 if (is_w)
281 MutexUnlock(thr, pc, m);
282 else
283 MutexReadUnlock(thr, pc, m);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000284}
285
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000286void INTERFACE_ATTRIBUTE AnnotateTraceMemory(char *f, int l, uptr mem) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000287 SCOPED_ANNOTATION(AnnotateTraceMemory);
288}
289
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000290void INTERFACE_ATTRIBUTE AnnotateFlushState(char *f, int l) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000291 SCOPED_ANNOTATION(AnnotateFlushState);
292}
293
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000294void INTERFACE_ATTRIBUTE AnnotateNewMemory(char *f, int l, uptr mem,
295 uptr size) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000296 SCOPED_ANNOTATION(AnnotateNewMemory);
297}
298
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000299void INTERFACE_ATTRIBUTE AnnotateNoOp(char *f, int l, uptr mem) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000300 SCOPED_ANNOTATION(AnnotateNoOp);
301}
302
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000303void INTERFACE_ATTRIBUTE AnnotateFlushExpectedRaces(char *f, int l) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000304 SCOPED_ANNOTATION(AnnotateFlushExpectedRaces);
305 Lock lock(&dyn_ann_ctx->mtx);
306 while (dyn_ann_ctx->expect.next != &dyn_ann_ctx->expect) {
307 ExpectRace *race = dyn_ann_ctx->expect.next;
Pirama Arumuga Nainar799172d2016-03-03 15:50:30 -0800308 if (atomic_load_relaxed(&race->hitcount) == 0) {
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700309 ctx->nmissed_expected++;
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000310 ReportMissedExpectedRace(race);
311 }
312 race->prev->next = race->next;
313 race->next->prev = race->prev;
314 internal_free(race);
315 }
316}
317
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000318void INTERFACE_ATTRIBUTE AnnotateEnableRaceDetection(
319 char *f, int l, int enable) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000320 SCOPED_ANNOTATION(AnnotateEnableRaceDetection);
321 // FIXME: Reconsider this functionality later. It may be irrelevant.
322}
323
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000324void INTERFACE_ATTRIBUTE AnnotateMutexIsUsedAsCondVar(
325 char *f, int l, uptr mu) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000326 SCOPED_ANNOTATION(AnnotateMutexIsUsedAsCondVar);
327}
328
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000329void INTERFACE_ATTRIBUTE AnnotatePCQGet(
330 char *f, int l, uptr pcq) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000331 SCOPED_ANNOTATION(AnnotatePCQGet);
332}
333
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000334void INTERFACE_ATTRIBUTE AnnotatePCQPut(
335 char *f, int l, uptr pcq) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000336 SCOPED_ANNOTATION(AnnotatePCQPut);
337}
338
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000339void INTERFACE_ATTRIBUTE AnnotatePCQDestroy(
340 char *f, int l, uptr pcq) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000341 SCOPED_ANNOTATION(AnnotatePCQDestroy);
342}
343
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000344void INTERFACE_ATTRIBUTE AnnotatePCQCreate(
345 char *f, int l, uptr pcq) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000346 SCOPED_ANNOTATION(AnnotatePCQCreate);
347}
348
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000349void INTERFACE_ATTRIBUTE AnnotateExpectRace(
350 char *f, int l, uptr mem, char *desc) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000351 SCOPED_ANNOTATION(AnnotateExpectRace);
352 Lock lock(&dyn_ann_ctx->mtx);
353 AddExpectRace(&dyn_ann_ctx->expect,
354 f, l, mem, 1, desc);
Alexey Samsonove9541012012-06-06 13:11:29 +0000355 DPrintf("Add expected race: %s addr=%zx %s:%d\n", desc, mem, f, l);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000356}
357
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000358static void BenignRaceImpl(
359 char *f, int l, uptr mem, uptr size, char *desc) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000360 Lock lock(&dyn_ann_ctx->mtx);
361 AddExpectRace(&dyn_ann_ctx->benign,
362 f, l, mem, size, desc);
Alexey Samsonove9541012012-06-06 13:11:29 +0000363 DPrintf("Add benign race: %s addr=%zx %s:%d\n", desc, mem, f, l);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000364}
365
366// FIXME: Turn it off later. WTF is benign race?1?? Go talk to Hans Boehm.
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000367void INTERFACE_ATTRIBUTE AnnotateBenignRaceSized(
368 char *f, int l, uptr mem, uptr size, char *desc) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000369 SCOPED_ANNOTATION(AnnotateBenignRaceSized);
370 BenignRaceImpl(f, l, mem, size, desc);
371}
372
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000373void INTERFACE_ATTRIBUTE AnnotateBenignRace(
374 char *f, int l, uptr mem, char *desc) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000375 SCOPED_ANNOTATION(AnnotateBenignRace);
376 BenignRaceImpl(f, l, mem, 1, desc);
377}
378
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000379void INTERFACE_ATTRIBUTE AnnotateIgnoreReadsBegin(char *f, int l) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000380 SCOPED_ANNOTATION(AnnotateIgnoreReadsBegin);
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700381 ThreadIgnoreBegin(thr, pc);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000382}
383
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000384void INTERFACE_ATTRIBUTE AnnotateIgnoreReadsEnd(char *f, int l) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000385 SCOPED_ANNOTATION(AnnotateIgnoreReadsEnd);
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700386 ThreadIgnoreEnd(thr, pc);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000387}
388
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000389void INTERFACE_ATTRIBUTE AnnotateIgnoreWritesBegin(char *f, int l) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000390 SCOPED_ANNOTATION(AnnotateIgnoreWritesBegin);
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700391 ThreadIgnoreBegin(thr, pc);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000392}
393
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000394void INTERFACE_ATTRIBUTE AnnotateIgnoreWritesEnd(char *f, int l) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000395 SCOPED_ANNOTATION(AnnotateIgnoreWritesEnd);
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700396 ThreadIgnoreEnd(thr, pc);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000397}
398
Dmitry Vyukove1ddbf92013-10-10 15:58:12 +0000399void INTERFACE_ATTRIBUTE AnnotateIgnoreSyncBegin(char *f, int l) {
400 SCOPED_ANNOTATION(AnnotateIgnoreSyncBegin);
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700401 ThreadIgnoreSyncBegin(thr, pc);
Dmitry Vyukove1ddbf92013-10-10 15:58:12 +0000402}
403
404void INTERFACE_ATTRIBUTE AnnotateIgnoreSyncEnd(char *f, int l) {
405 SCOPED_ANNOTATION(AnnotateIgnoreSyncEnd);
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700406 ThreadIgnoreSyncEnd(thr, pc);
Dmitry Vyukove1ddbf92013-10-10 15:58:12 +0000407}
408
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000409void INTERFACE_ATTRIBUTE AnnotatePublishMemoryRange(
410 char *f, int l, uptr addr, uptr size) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000411 SCOPED_ANNOTATION(AnnotatePublishMemoryRange);
412}
413
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000414void INTERFACE_ATTRIBUTE AnnotateUnpublishMemoryRange(
415 char *f, int l, uptr addr, uptr size) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000416 SCOPED_ANNOTATION(AnnotateUnpublishMemoryRange);
417}
418
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000419void INTERFACE_ATTRIBUTE AnnotateThreadName(
420 char *f, int l, char *name) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000421 SCOPED_ANNOTATION(AnnotateThreadName);
Dmitry Vyukovaecf2e52012-12-04 15:46:05 +0000422 ThreadSetName(thr, name);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000423}
424
Alexander Potapenko743d89d2013-04-02 11:21:53 +0000425// We deliberately omit the implementation of WTFAnnotateHappensBefore() and
426// WTFAnnotateHappensAfter(). Those are being used by Webkit to annotate
427// atomic operations, which should be handled by ThreadSanitizer correctly.
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000428void INTERFACE_ATTRIBUTE WTFAnnotateHappensBefore(char *f, int l, uptr addr) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000429 SCOPED_ANNOTATION(AnnotateHappensBefore);
430}
431
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000432void INTERFACE_ATTRIBUTE WTFAnnotateHappensAfter(char *f, int l, uptr addr) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000433 SCOPED_ANNOTATION(AnnotateHappensAfter);
434}
435
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000436void INTERFACE_ATTRIBUTE WTFAnnotateBenignRaceSized(
437 char *f, int l, uptr mem, uptr sz, char *desc) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000438 SCOPED_ANNOTATION(AnnotateBenignRaceSized);
Stephen Hines2d1fdb22014-05-28 23:58:16 -0700439 BenignRaceImpl(f, l, mem, sz, desc);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000440}
441
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000442int INTERFACE_ATTRIBUTE RunningOnValgrind() {
Dmitry Vyukov24567d42012-05-24 09:24:45 +0000443 return flags()->running_on_valgrind;
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000444}
445
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000446double __attribute__((weak)) INTERFACE_ATTRIBUTE ValgrindSlowdown(void) {
Dmitry Vyukovdc2f0322012-05-17 08:04:41 +0000447 return 10.0;
448}
449
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000450const char INTERFACE_ATTRIBUTE* ThreadSanitizerQuery(const char *query) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000451 if (internal_strcmp(query, "pure_happens_before") == 0)
452 return "1";
453 else
454 return "0";
455}
Evgeniy Stepanov2ec73182013-09-18 11:20:31 +0000456
457void INTERFACE_ATTRIBUTE
458AnnotateMemoryIsInitialized(char *f, int l, uptr mem, uptr sz) {}
Stephen Hines6d186232014-11-26 17:56:19 -0800459void INTERFACE_ATTRIBUTE
460AnnotateMemoryIsUninitialized(char *f, int l, uptr mem, uptr sz) {}
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000461} // extern "C"