xref: /qemu/include/qemu/tsan.h (revision 12b35405)
1 #ifndef QEMU_TSAN_H
2 #define QEMU_TSAN_H
3 /*
4  * tsan.h
5  *
6  * This file defines macros used to give ThreadSanitizer
7  * additional information to help suppress warnings.
8  * This is necessary since TSan does not provide a header file
9  * for these annotations.  The standard way to include these
10  * is via the below macros.
11  *
12  * Annotation examples can be found here:
13  *  https://github.com/llvm/llvm-project/tree/master/compiler-rt/test/tsan
14  * annotate_happens_before.cpp or ignore_race.cpp are good places to start.
15  *
16  * The full set of annotations can be found here in tsan_interface_ann.cpp.
17  *  https://github.com/llvm/llvm-project/blob/master/compiler-rt/lib/tsan/rtl/
18  *
19  * This work is licensed under the terms of the GNU GPL, version 2 or later.
20  * See the COPYING file in the top-level directory.
21  */
22 
23 #ifdef CONFIG_TSAN
24 /*
25  * Informs TSan of a happens before/after relationship.
26  */
27 #define QEMU_TSAN_ANNOTATE_HAPPENS_BEFORE(addr) \
28     AnnotateHappensBefore(__FILE__, __LINE__, (void *)(addr))
29 #define QEMU_TSAN_ANNOTATE_HAPPENS_AFTER(addr) \
30     AnnotateHappensAfter(__FILE__, __LINE__, (void *)(addr))
31 /*
32  * Gives TSan more information about thread names it can report the
33  * name of the thread in the warning report.
34  */
35 #define QEMU_TSAN_ANNOTATE_THREAD_NAME(name) \
36     AnnotateThreadName(__FILE__, __LINE__, (void *)(name))
37 /*
38  * Allows defining a region of code on which TSan will not record memory READS.
39  * This has the effect of disabling race detection for this section of code.
40  */
41 #define QEMU_TSAN_ANNOTATE_IGNORE_READS_BEGIN() \
42     AnnotateIgnoreReadsBegin(__FILE__, __LINE__)
43 #define QEMU_TSAN_ANNOTATE_IGNORE_READS_END() \
44     AnnotateIgnoreReadsEnd(__FILE__, __LINE__)
45 /*
46  * Allows defining a region of code on which TSan will not record memory
47  * WRITES.  This has the effect of disabling race detection for this
48  * section of code.
49  */
50 #define QEMU_TSAN_ANNOTATE_IGNORE_WRITES_BEGIN() \
51     AnnotateIgnoreWritesBegin(__FILE__, __LINE__)
52 #define QEMU_TSAN_ANNOTATE_IGNORE_WRITES_END() \
53     AnnotateIgnoreWritesEnd(__FILE__, __LINE__)
54 #else
55 #define QEMU_TSAN_ANNOTATE_HAPPENS_BEFORE(addr)
56 #define QEMU_TSAN_ANNOTATE_HAPPENS_AFTER(addr)
57 #define QEMU_TSAN_ANNOTATE_THREAD_NAME(name)
58 #define QEMU_TSAN_ANNOTATE_IGNORE_READS_BEGIN()
59 #define QEMU_TSAN_ANNOTATE_IGNORE_READS_END()
60 #define QEMU_TSAN_ANNOTATE_IGNORE_WRITES_BEGIN()
61 #define QEMU_TSAN_ANNOTATE_IGNORE_WRITES_END()
62 #endif
63 
64 void AnnotateHappensBefore(const char *f, int l, void *addr);
65 void AnnotateHappensAfter(const char *f, int l, void *addr);
66 void AnnotateThreadName(const char *f, int l, char *name);
67 void AnnotateIgnoreReadsBegin(const char *f, int l);
68 void AnnotateIgnoreReadsEnd(const char *f, int l);
69 void AnnotateIgnoreWritesBegin(const char *f, int l);
70 void AnnotateIgnoreWritesEnd(const char *f, int l);
71 #endif
72