2017-01-22 Matthias Klose <doko@ubuntu.com>
[official-gcc.git] / libsanitizer / tsan / tsan_defs.h
blobe540526caa220339aaf93f639429561807d4a107
1 //===-- tsan_defs.h ---------------------------------------------*- C++ -*-===//
2 //
3 // This file is distributed under the University of Illinois Open Source
4 // License. See LICENSE.TXT for details.
5 //
6 //===----------------------------------------------------------------------===//
7 //
8 // This file is a part of ThreadSanitizer (TSan), a race detector.
9 //
10 //===----------------------------------------------------------------------===//
12 #ifndef TSAN_DEFS_H
13 #define TSAN_DEFS_H
15 #include "sanitizer_common/sanitizer_internal_defs.h"
16 #include "sanitizer_common/sanitizer_libc.h"
17 #include "tsan_stat.h"
18 #include "ubsan/ubsan_platform.h"
20 // Setup defaults for compile definitions.
21 #ifndef TSAN_NO_HISTORY
22 # define TSAN_NO_HISTORY 0
23 #endif
25 #ifndef TSAN_COLLECT_STATS
26 # define TSAN_COLLECT_STATS 0
27 #endif
29 #ifndef TSAN_CONTAINS_UBSAN
30 # if CAN_SANITIZE_UB && !SANITIZER_GO
31 # define TSAN_CONTAINS_UBSAN 1
32 # else
33 # define TSAN_CONTAINS_UBSAN 0
34 # endif
35 #endif
37 namespace __tsan {
39 const int kTidBits = 13;
40 const unsigned kMaxTid = 1 << kTidBits;
41 #if !SANITIZER_GO
42 const unsigned kMaxTidInClock = kMaxTid * 2; // This includes msb 'freed' bit.
43 #else
44 const unsigned kMaxTidInClock = kMaxTid; // Go does not track freed memory.
45 #endif
46 const int kClkBits = 42;
47 const unsigned kMaxTidReuse = (1 << (64 - kClkBits)) - 1;
48 const uptr kShadowStackSize = 64 * 1024;
50 // Count of shadow values in a shadow cell.
51 const uptr kShadowCnt = 4;
53 // That many user bytes are mapped onto a single shadow cell.
54 const uptr kShadowCell = 8;
56 // Size of a single shadow value (u64).
57 const uptr kShadowSize = 8;
59 // Shadow memory is kShadowMultiplier times larger than user memory.
60 const uptr kShadowMultiplier = kShadowSize * kShadowCnt / kShadowCell;
62 // That many user bytes are mapped onto a single meta shadow cell.
63 // Must be less or equal to minimal memory allocator alignment.
64 const uptr kMetaShadowCell = 8;
66 // Size of a single meta shadow value (u32).
67 const uptr kMetaShadowSize = 4;
69 #if TSAN_NO_HISTORY
70 const bool kCollectHistory = false;
71 #else
72 const bool kCollectHistory = true;
73 #endif
75 const unsigned kInvalidTid = (unsigned)-1;
77 // The following "build consistency" machinery ensures that all source files
78 // are built in the same configuration. Inconsistent builds lead to
79 // hard to debug crashes.
80 #if SANITIZER_DEBUG
81 void build_consistency_debug();
82 #else
83 void build_consistency_release();
84 #endif
86 #if TSAN_COLLECT_STATS
87 void build_consistency_stats();
88 #else
89 void build_consistency_nostats();
90 #endif
92 static inline void USED build_consistency() {
93 #if SANITIZER_DEBUG
94 build_consistency_debug();
95 #else
96 build_consistency_release();
97 #endif
98 #if TSAN_COLLECT_STATS
99 build_consistency_stats();
100 #else
101 build_consistency_nostats();
102 #endif
105 template<typename T>
106 T min(T a, T b) {
107 return a < b ? a : b;
110 template<typename T>
111 T max(T a, T b) {
112 return a > b ? a : b;
115 template<typename T>
116 T RoundUp(T p, u64 align) {
117 DCHECK_EQ(align & (align - 1), 0);
118 return (T)(((u64)p + align - 1) & ~(align - 1));
121 template<typename T>
122 T RoundDown(T p, u64 align) {
123 DCHECK_EQ(align & (align - 1), 0);
124 return (T)((u64)p & ~(align - 1));
127 // Zeroizes high part, returns 'bits' lsb bits.
128 template<typename T>
129 T GetLsb(T v, int bits) {
130 return (T)((u64)v & ((1ull << bits) - 1));
133 struct MD5Hash {
134 u64 hash[2];
135 bool operator==(const MD5Hash &other) const;
138 MD5Hash md5_hash(const void *data, uptr size);
140 struct Processor;
141 struct ThreadState;
142 class ThreadContext;
143 struct Context;
144 struct ReportStack;
145 class ReportDesc;
146 class RegionAlloc;
148 // Descriptor of user's memory block.
149 struct MBlock {
150 u64 siz;
151 u32 stk;
152 u16 tid;
155 COMPILER_CHECK(sizeof(MBlock) == 16);
157 } // namespace __tsan
159 #endif // TSAN_DEFS_H