blob: 257afcf8fa353a1483cf44513d86a515db525a9e [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"
Kostya Serebryany7ac41482012-05-10 13:48:04 +000016#include "tsan_interface_ann.h"
17#include "tsan_mutex.h"
Kostya Serebryany7ac41482012-05-10 13:48:04 +000018#include "tsan_report.h"
19#include "tsan_rtl.h"
20#include "tsan_mman.h"
21#include "tsan_flags.h"
Dmitry Vyukov3fb44412012-06-14 21:40:35 +000022#include "tsan_platform.h"
Dmitry Vyukov0fd908c2013-03-28 16:21:19 +000023#include "tsan_vector.h"
Kostya Serebryany7ac41482012-05-10 13:48:04 +000024
25#define CALLERPC ((uptr)__builtin_return_address(0))
26
27using namespace __tsan; // NOLINT
28
29namespace __tsan {
30
31class ScopedAnnotation {
32 public:
33 ScopedAnnotation(ThreadState *thr, const char *aname, const char *f, int l,
34 uptr pc)
35 : thr_(thr)
36 , in_rtl_(thr->in_rtl) {
37 CHECK_EQ(thr_->in_rtl, 0);
38 FuncEntry(thr_, pc);
39 thr_->in_rtl++;
40 DPrintf("#%d: annotation %s() %s:%d\n", thr_->tid, aname, f, l);
41 }
42
43 ~ScopedAnnotation() {
44 thr_->in_rtl--;
45 CHECK_EQ(in_rtl_, thr_->in_rtl);
46 FuncExit(thr_);
47 }
48 private:
49 ThreadState *const thr_;
50 const int in_rtl_;
51};
52
53#define SCOPED_ANNOTATION(typ) \
54 if (!flags()->enable_annotations) \
55 return; \
56 ThreadState *thr = cur_thread(); \
Dmitry Vyukovc20e9ba2012-08-16 13:29:41 +000057 const uptr pc = (uptr)__builtin_return_address(0); \
Kostya Serebryany7ac41482012-05-10 13:48:04 +000058 StatInc(thr, StatAnnotation); \
59 StatInc(thr, Stat##typ); \
60 ScopedAnnotation sa(thr, __FUNCTION__, f, l, \
61 (uptr)__builtin_return_address(0)); \
Kostya Serebryany7ac41482012-05-10 13:48:04 +000062 (void)pc; \
63/**/
64
65static const int kMaxDescLen = 128;
66
67struct ExpectRace {
68 ExpectRace *next;
69 ExpectRace *prev;
70 int hitcount;
Dmitry Vyukov0fd908c2013-03-28 16:21:19 +000071 int addcount;
Kostya Serebryany7ac41482012-05-10 13:48:04 +000072 uptr addr;
73 uptr size;
74 char *file;
75 int line;
76 char desc[kMaxDescLen];
77};
78
79struct DynamicAnnContext {
80 Mutex mtx;
81 ExpectRace expect;
82 ExpectRace benign;
83
84 DynamicAnnContext()
85 : mtx(MutexTypeAnnotations, StatMtxAnnotations) {
86 }
87};
88
89static DynamicAnnContext *dyn_ann_ctx;
Alexey Samsonov0a4c9062012-06-05 13:50:57 +000090static char dyn_ann_ctx_placeholder[sizeof(DynamicAnnContext)] ALIGNED(64);
Kostya Serebryany7ac41482012-05-10 13:48:04 +000091
92static void AddExpectRace(ExpectRace *list,
93 char *f, int l, uptr addr, uptr size, char *desc) {
94 ExpectRace *race = list->next;
95 for (; race != list; race = race->next) {
Dmitry Vyukov0fd908c2013-03-28 16:21:19 +000096 if (race->addr == addr && race->size == size) {
97 race->addcount++;
Kostya Serebryany7ac41482012-05-10 13:48:04 +000098 return;
Dmitry Vyukov0fd908c2013-03-28 16:21:19 +000099 }
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000100 }
101 race = (ExpectRace*)internal_alloc(MBlockExpectRace, sizeof(ExpectRace));
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000102 race->addr = addr;
103 race->size = size;
104 race->file = f;
105 race->line = l;
106 race->desc[0] = 0;
Dmitry Vyukov0fd908c2013-03-28 16:21:19 +0000107 race->hitcount = 0;
108 race->addcount = 1;
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000109 if (desc) {
110 int i = 0;
111 for (; i < kMaxDescLen - 1 && desc[i]; i++)
112 race->desc[i] = desc[i];
113 race->desc[i] = 0;
114 }
115 race->prev = list;
116 race->next = list->next;
117 race->next->prev = race;
118 list->next = race;
119}
120
121static ExpectRace *FindRace(ExpectRace *list, uptr addr, uptr size) {
122 for (ExpectRace *race = list->next; race != list; race = race->next) {
123 uptr maxbegin = max(race->addr, addr);
124 uptr minend = min(race->addr + race->size, addr + size);
125 if (maxbegin < minend)
126 return race;
127 }
128 return 0;
129}
130
131static bool CheckContains(ExpectRace *list, uptr addr, uptr size) {
132 ExpectRace *race = FindRace(list, addr, size);
Dmitry Vyukov3fb44412012-06-14 21:40:35 +0000133 if (race == 0 && AlternativeAddress(addr))
134 race = FindRace(list, AlternativeAddress(addr), size);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000135 if (race == 0)
136 return false;
Alexey Samsonove9541012012-06-06 13:11:29 +0000137 DPrintf("Hit expected/benign race: %s addr=%zx:%d %s:%d\n",
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000138 race->desc, race->addr, (int)race->size, race->file, race->line);
139 race->hitcount++;
140 return true;
141}
142
143static void InitList(ExpectRace *list) {
144 list->next = list;
145 list->prev = list;
146}
147
148void InitializeDynamicAnnotations() {
149 dyn_ann_ctx = new(dyn_ann_ctx_placeholder) DynamicAnnContext;
150 InitList(&dyn_ann_ctx->expect);
151 InitList(&dyn_ann_ctx->benign);
152}
153
154bool IsExpectedReport(uptr addr, uptr size) {
155 Lock lock(&dyn_ann_ctx->mtx);
156 if (CheckContains(&dyn_ann_ctx->expect, addr, size))
157 return true;
158 if (CheckContains(&dyn_ann_ctx->benign, addr, size))
159 return true;
160 return false;
161}
162
Dmitry Vyukov0fd908c2013-03-28 16:21:19 +0000163static void CollectMatchedBenignRaces(Vector<ExpectRace> *matched,
164 int *unique_count, int *hit_count, int ExpectRace::*counter) {
165 ExpectRace *list = &dyn_ann_ctx->benign;
166 for (ExpectRace *race = list->next; race != list; race = race->next) {
167 (*unique_count)++;
168 if (race->*counter == 0)
169 continue;
170 (*hit_count) += race->*counter;
171 uptr i = 0;
172 for (; i < matched->Size(); i++) {
173 ExpectRace *race0 = &(*matched)[i];
174 if (race->line == race0->line
175 && internal_strcmp(race->file, race0->file) == 0
176 && internal_strcmp(race->desc, race0->desc) == 0) {
177 race0->*counter += race->*counter;
178 break;
179 }
180 }
181 if (i == matched->Size())
182 matched->PushBack(*race);
183 }
184}
185
186void PrintMatchedBenignRaces() {
187 Lock lock(&dyn_ann_ctx->mtx);
188 int unique_count = 0;
189 int hit_count = 0;
190 int add_count = 0;
191 Vector<ExpectRace> hit_matched(MBlockScopedBuf);
192 CollectMatchedBenignRaces(&hit_matched, &unique_count, &hit_count,
193 &ExpectRace::hitcount);
194 Vector<ExpectRace> add_matched(MBlockScopedBuf);
195 CollectMatchedBenignRaces(&add_matched, &unique_count, &add_count,
196 &ExpectRace::addcount);
197 if (hit_matched.Size()) {
198 Printf("ThreadSanitizer: Matched %d \"benign\" races (pid=%d):\n",
199 hit_count, GetPid());
200 for (uptr i = 0; i < hit_matched.Size(); i++) {
201 Printf("%d %s:%d %s\n",
202 hit_matched[i].hitcount, hit_matched[i].file,
203 hit_matched[i].line, hit_matched[i].desc);
204 }
205 }
206 if (hit_matched.Size()) {
207 Printf("ThreadSanitizer: Annotated %d \"benign\" races, %d unique"
208 " (pid=%d):\n",
209 add_count, unique_count, GetPid());
210 for (uptr i = 0; i < add_matched.Size(); i++) {
211 Printf("%d %s:%d %s\n",
212 add_matched[i].addcount, add_matched[i].file,
213 add_matched[i].line, add_matched[i].desc);
214 }
215 }
216}
217
218static void ReportMissedExpectedRace(ExpectRace *race) {
219 Printf("==================\n");
220 Printf("WARNING: ThreadSanitizer: missed expected data race\n");
221 Printf(" %s addr=%zx %s:%d\n",
222 race->desc, race->addr, race->file, race->line);
223 Printf("==================\n");
224}
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000225} // namespace __tsan
226
227using namespace __tsan; // NOLINT
228
229extern "C" {
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000230void INTERFACE_ATTRIBUTE AnnotateHappensBefore(char *f, int l, uptr addr) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000231 SCOPED_ANNOTATION(AnnotateHappensBefore);
232 Release(cur_thread(), CALLERPC, addr);
233}
234
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000235void INTERFACE_ATTRIBUTE AnnotateHappensAfter(char *f, int l, uptr addr) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000236 SCOPED_ANNOTATION(AnnotateHappensAfter);
237 Acquire(cur_thread(), CALLERPC, addr);
238}
239
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000240void INTERFACE_ATTRIBUTE AnnotateCondVarSignal(char *f, int l, uptr cv) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000241 SCOPED_ANNOTATION(AnnotateCondVarSignal);
242}
243
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000244void INTERFACE_ATTRIBUTE AnnotateCondVarSignalAll(char *f, int l, uptr cv) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000245 SCOPED_ANNOTATION(AnnotateCondVarSignalAll);
246}
247
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000248void INTERFACE_ATTRIBUTE AnnotateMutexIsNotPHB(char *f, int l, uptr mu) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000249 SCOPED_ANNOTATION(AnnotateMutexIsNotPHB);
250}
251
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000252void INTERFACE_ATTRIBUTE AnnotateCondVarWait(char *f, int l, uptr cv,
253 uptr lock) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000254 SCOPED_ANNOTATION(AnnotateCondVarWait);
255}
256
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000257void INTERFACE_ATTRIBUTE AnnotateRWLockCreate(char *f, int l, uptr m) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000258 SCOPED_ANNOTATION(AnnotateRWLockCreate);
Dmitry Vyukovc20e9ba2012-08-16 13:29:41 +0000259 MutexCreate(thr, pc, m, true, true, false);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000260}
261
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000262void INTERFACE_ATTRIBUTE AnnotateRWLockCreateStatic(char *f, int l, uptr m) {
Dmitry Vyukovc20e9ba2012-08-16 13:29:41 +0000263 SCOPED_ANNOTATION(AnnotateRWLockCreateStatic);
264 MutexCreate(thr, pc, m, true, true, true);
265}
266
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000267void INTERFACE_ATTRIBUTE AnnotateRWLockDestroy(char *f, int l, uptr m) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000268 SCOPED_ANNOTATION(AnnotateRWLockDestroy);
Dmitry Vyukovc20e9ba2012-08-16 13:29:41 +0000269 MutexDestroy(thr, pc, m);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000270}
271
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000272void INTERFACE_ATTRIBUTE AnnotateRWLockAcquired(char *f, int l, uptr m,
273 uptr is_w) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000274 SCOPED_ANNOTATION(AnnotateRWLockAcquired);
Dmitry Vyukovc20e9ba2012-08-16 13:29:41 +0000275 if (is_w)
276 MutexLock(thr, pc, m);
277 else
278 MutexReadLock(thr, pc, m);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000279}
280
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000281void INTERFACE_ATTRIBUTE AnnotateRWLockReleased(char *f, int l, uptr m,
282 uptr is_w) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000283 SCOPED_ANNOTATION(AnnotateRWLockReleased);
Dmitry Vyukovc20e9ba2012-08-16 13:29:41 +0000284 if (is_w)
285 MutexUnlock(thr, pc, m);
286 else
287 MutexReadUnlock(thr, pc, m);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000288}
289
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000290void INTERFACE_ATTRIBUTE AnnotateTraceMemory(char *f, int l, uptr mem) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000291 SCOPED_ANNOTATION(AnnotateTraceMemory);
292}
293
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000294void INTERFACE_ATTRIBUTE AnnotateFlushState(char *f, int l) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000295 SCOPED_ANNOTATION(AnnotateFlushState);
296}
297
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000298void INTERFACE_ATTRIBUTE AnnotateNewMemory(char *f, int l, uptr mem,
299 uptr size) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000300 SCOPED_ANNOTATION(AnnotateNewMemory);
301}
302
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000303void INTERFACE_ATTRIBUTE AnnotateNoOp(char *f, int l, uptr mem) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000304 SCOPED_ANNOTATION(AnnotateNoOp);
305}
306
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000307void INTERFACE_ATTRIBUTE AnnotateFlushExpectedRaces(char *f, int l) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000308 SCOPED_ANNOTATION(AnnotateFlushExpectedRaces);
309 Lock lock(&dyn_ann_ctx->mtx);
310 while (dyn_ann_ctx->expect.next != &dyn_ann_ctx->expect) {
311 ExpectRace *race = dyn_ann_ctx->expect.next;
312 if (race->hitcount == 0) {
313 CTX()->nmissed_expected++;
314 ReportMissedExpectedRace(race);
315 }
316 race->prev->next = race->next;
317 race->next->prev = race->prev;
318 internal_free(race);
319 }
320}
321
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000322void INTERFACE_ATTRIBUTE AnnotateEnableRaceDetection(
323 char *f, int l, int enable) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000324 SCOPED_ANNOTATION(AnnotateEnableRaceDetection);
325 // FIXME: Reconsider this functionality later. It may be irrelevant.
326}
327
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000328void INTERFACE_ATTRIBUTE AnnotateMutexIsUsedAsCondVar(
329 char *f, int l, uptr mu) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000330 SCOPED_ANNOTATION(AnnotateMutexIsUsedAsCondVar);
331}
332
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000333void INTERFACE_ATTRIBUTE AnnotatePCQGet(
334 char *f, int l, uptr pcq) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000335 SCOPED_ANNOTATION(AnnotatePCQGet);
336}
337
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000338void INTERFACE_ATTRIBUTE AnnotatePCQPut(
339 char *f, int l, uptr pcq) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000340 SCOPED_ANNOTATION(AnnotatePCQPut);
341}
342
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000343void INTERFACE_ATTRIBUTE AnnotatePCQDestroy(
344 char *f, int l, uptr pcq) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000345 SCOPED_ANNOTATION(AnnotatePCQDestroy);
346}
347
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000348void INTERFACE_ATTRIBUTE AnnotatePCQCreate(
349 char *f, int l, uptr pcq) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000350 SCOPED_ANNOTATION(AnnotatePCQCreate);
351}
352
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000353void INTERFACE_ATTRIBUTE AnnotateExpectRace(
354 char *f, int l, uptr mem, char *desc) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000355 SCOPED_ANNOTATION(AnnotateExpectRace);
356 Lock lock(&dyn_ann_ctx->mtx);
357 AddExpectRace(&dyn_ann_ctx->expect,
358 f, l, mem, 1, desc);
Alexey Samsonove9541012012-06-06 13:11:29 +0000359 DPrintf("Add expected race: %s addr=%zx %s:%d\n", desc, mem, f, l);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000360}
361
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000362static void BenignRaceImpl(
363 char *f, int l, uptr mem, uptr size, char *desc) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000364 Lock lock(&dyn_ann_ctx->mtx);
365 AddExpectRace(&dyn_ann_ctx->benign,
366 f, l, mem, size, desc);
Alexey Samsonove9541012012-06-06 13:11:29 +0000367 DPrintf("Add benign race: %s addr=%zx %s:%d\n", desc, mem, f, l);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000368}
369
370// FIXME: Turn it off later. WTF is benign race?1?? Go talk to Hans Boehm.
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000371void INTERFACE_ATTRIBUTE AnnotateBenignRaceSized(
372 char *f, int l, uptr mem, uptr size, char *desc) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000373 SCOPED_ANNOTATION(AnnotateBenignRaceSized);
374 BenignRaceImpl(f, l, mem, size, desc);
375}
376
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000377void INTERFACE_ATTRIBUTE AnnotateBenignRace(
378 char *f, int l, uptr mem, char *desc) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000379 SCOPED_ANNOTATION(AnnotateBenignRace);
380 BenignRaceImpl(f, l, mem, 1, desc);
381}
382
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000383void INTERFACE_ATTRIBUTE AnnotateIgnoreReadsBegin(char *f, int l) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000384 SCOPED_ANNOTATION(AnnotateIgnoreReadsBegin);
385 IgnoreCtl(cur_thread(), false, true);
386}
387
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000388void INTERFACE_ATTRIBUTE AnnotateIgnoreReadsEnd(char *f, int l) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000389 SCOPED_ANNOTATION(AnnotateIgnoreReadsEnd);
390 IgnoreCtl(cur_thread(), false, false);
391}
392
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000393void INTERFACE_ATTRIBUTE AnnotateIgnoreWritesBegin(char *f, int l) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000394 SCOPED_ANNOTATION(AnnotateIgnoreWritesBegin);
395 IgnoreCtl(cur_thread(), true, true);
396}
397
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000398void INTERFACE_ATTRIBUTE AnnotateIgnoreWritesEnd(char *f, int l) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000399 SCOPED_ANNOTATION(AnnotateIgnoreWritesEnd);
Dmitry Vyukovaecf2e52012-12-04 15:46:05 +0000400 IgnoreCtl(thr, true, false);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000401}
402
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000403void INTERFACE_ATTRIBUTE AnnotatePublishMemoryRange(
404 char *f, int l, uptr addr, uptr size) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000405 SCOPED_ANNOTATION(AnnotatePublishMemoryRange);
406}
407
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000408void INTERFACE_ATTRIBUTE AnnotateUnpublishMemoryRange(
409 char *f, int l, uptr addr, uptr size) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000410 SCOPED_ANNOTATION(AnnotateUnpublishMemoryRange);
411}
412
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000413void INTERFACE_ATTRIBUTE AnnotateThreadName(
414 char *f, int l, char *name) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000415 SCOPED_ANNOTATION(AnnotateThreadName);
Dmitry Vyukovaecf2e52012-12-04 15:46:05 +0000416 ThreadSetName(thr, name);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000417}
418
Alexander Potapenko743d89d2013-04-02 11:21:53 +0000419// We deliberately omit the implementation of WTFAnnotateHappensBefore() and
420// WTFAnnotateHappensAfter(). Those are being used by Webkit to annotate
421// atomic operations, which should be handled by ThreadSanitizer correctly.
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000422void INTERFACE_ATTRIBUTE WTFAnnotateHappensBefore(char *f, int l, uptr addr) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000423 SCOPED_ANNOTATION(AnnotateHappensBefore);
424}
425
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000426void INTERFACE_ATTRIBUTE WTFAnnotateHappensAfter(char *f, int l, uptr addr) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000427 SCOPED_ANNOTATION(AnnotateHappensAfter);
428}
429
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000430void INTERFACE_ATTRIBUTE WTFAnnotateBenignRaceSized(
431 char *f, int l, uptr mem, uptr sz, char *desc) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000432 SCOPED_ANNOTATION(AnnotateBenignRaceSized);
Alexander Potapenko743d89d2013-04-02 11:21:53 +0000433 BenignRaceImpl(f, l, mem, 1, desc);
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000434}
435
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000436int INTERFACE_ATTRIBUTE RunningOnValgrind() {
Dmitry Vyukov24567d42012-05-24 09:24:45 +0000437 return flags()->running_on_valgrind;
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000438}
439
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000440double __attribute__((weak)) INTERFACE_ATTRIBUTE ValgrindSlowdown(void) {
Dmitry Vyukovdc2f0322012-05-17 08:04:41 +0000441 return 10.0;
442}
443
Dmitry Vyukov258c24b2012-12-04 14:01:21 +0000444const char INTERFACE_ATTRIBUTE* ThreadSanitizerQuery(const char *query) {
Kostya Serebryany7ac41482012-05-10 13:48:04 +0000445 if (internal_strcmp(query, "pure_happens_before") == 0)
446 return "1";
447 else
448 return "0";
449}
450} // extern "C"