]>
Commit | Line | Data |
---|---|---|
223e47cc LB |
1 | //===- llvm/Support/Valgrind.h - Communication with Valgrind -----*- C++ -*-===// |
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 | // Methods for communicating with a valgrind instance this program is running | |
11 | // under. These are all no-ops unless LLVM was configured on a system with the | |
12 | // valgrind headers installed and valgrind is controlling this process. | |
13 | // | |
14 | //===----------------------------------------------------------------------===// | |
15 | ||
1a4d82fc JJ |
16 | #ifndef LLVM_SUPPORT_VALGRIND_H |
17 | #define LLVM_SUPPORT_VALGRIND_H | |
223e47cc | 18 | |
223e47cc | 19 | #include "llvm/Config/llvm-config.h" |
970d7e83 | 20 | #include "llvm/Support/Compiler.h" |
223e47cc LB |
21 | #include <stddef.h> |
22 | ||
23 | #if LLVM_ENABLE_THREADS != 0 && !defined(NDEBUG) | |
24 | // tsan (Thread Sanitizer) is a valgrind-based tool that detects these exact | |
25 | // functions by name. | |
26 | extern "C" { | |
1a4d82fc JJ |
27 | void AnnotateHappensAfter(const char *file, int line, const volatile void *cv); |
28 | void AnnotateHappensBefore(const char *file, int line, const volatile void *cv); | |
29 | void AnnotateIgnoreWritesBegin(const char *file, int line); | |
30 | void AnnotateIgnoreWritesEnd(const char *file, int line); | |
223e47cc LB |
31 | } |
32 | #endif | |
33 | ||
34 | namespace llvm { | |
35 | namespace sys { | |
36 | // True if Valgrind is controlling this process. | |
37 | bool RunningOnValgrind(); | |
38 | ||
39 | // Discard valgrind's translation of code in the range [Addr .. Addr + Len). | |
40 | // Otherwise valgrind may continue to execute the old version of the code. | |
41 | void ValgrindDiscardTranslations(const void *Addr, size_t Len); | |
42 | ||
43 | #if LLVM_ENABLE_THREADS != 0 && !defined(NDEBUG) | |
44 | // Thread Sanitizer is a valgrind tool that finds races in code. | |
45 | // See http://code.google.com/p/data-race-test/wiki/DynamicAnnotations . | |
46 | ||
47 | // This marker is used to define a happens-before arc. The race detector will | |
48 | // infer an arc from the begin to the end when they share the same pointer | |
49 | // argument. | |
50 | #define TsanHappensBefore(cv) \ | |
51 | AnnotateHappensBefore(__FILE__, __LINE__, cv) | |
52 | ||
53 | // This marker defines the destination of a happens-before arc. | |
54 | #define TsanHappensAfter(cv) \ | |
55 | AnnotateHappensAfter(__FILE__, __LINE__, cv) | |
56 | ||
57 | // Ignore any races on writes between here and the next TsanIgnoreWritesEnd. | |
58 | #define TsanIgnoreWritesBegin() \ | |
59 | AnnotateIgnoreWritesBegin(__FILE__, __LINE__) | |
60 | ||
61 | // Resume checking for racy writes. | |
62 | #define TsanIgnoreWritesEnd() \ | |
63 | AnnotateIgnoreWritesEnd(__FILE__, __LINE__) | |
64 | #else | |
65 | #define TsanHappensBefore(cv) | |
66 | #define TsanHappensAfter(cv) | |
67 | #define TsanIgnoreWritesBegin() | |
68 | #define TsanIgnoreWritesEnd() | |
69 | #endif | |
70 | } | |
71 | } | |
72 | ||
73 | #endif |