tsan_defs.h revision 9ad7c32720dfa1287f8cfd481e5d583435178cae
1//===-- tsan_defs.h ---------------------------------------------*- 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// This file is a part of ThreadSanitizer (TSan), a race detector.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef TSAN_DEFS_H
15#define TSAN_DEFS_H
16
17#include "interception/interception.h"
18#include "sanitizer_common/sanitizer_internal_defs.h"
19#include "sanitizer_common/sanitizer_libc.h"
20#include "tsan_stat.h"
21
22#ifndef TSAN_DEBUG
23#define TSAN_DEBUG 0
24#endif  // TSAN_DEBUG
25
26namespace __tsan {
27
28const int kTidBits = 13;
29const unsigned kMaxTid = 1 << kTidBits;
30const unsigned kMaxTidInClock = kMaxTid * 2;  // This includes msb 'freed' bit.
31const int kClkBits = 43;
32const int kShadowStackSize = 1024;
33
34#ifdef TSAN_SHADOW_COUNT
35# if TSAN_SHADOW_COUNT == 2 \
36  || TSAN_SHADOW_COUNT == 4 || TSAN_SHADOW_COUNT == 8
37const unsigned kShadowCnt = TSAN_SHADOW_COUNT;
38# else
39#   error "TSAN_SHADOW_COUNT must be one of 2,4,8"
40# endif
41#else
42// Count of shadow values in a shadow cell.
43const unsigned kShadowCnt = 8;
44#endif
45
46// That many user bytes are mapped onto a single shadow cell.
47const unsigned kShadowCell = 8;
48
49// Size of a single shadow value (u64).
50const unsigned kShadowSize = 8;
51
52#if defined(TSAN_COLLECT_STATS) && TSAN_COLLECT_STATS
53const bool kCollectStats = true;
54#else
55const bool kCollectStats = false;
56#endif
57
58#if TSAN_DEBUG
59#define DCHECK(a)       CHECK(a)
60#define DCHECK_EQ(a, b) CHECK_EQ(a, b)
61#define DCHECK_NE(a, b) CHECK_NE(a, b)
62#define DCHECK_LT(a, b) CHECK_LT(a, b)
63#define DCHECK_LE(a, b) CHECK_LE(a, b)
64#define DCHECK_GT(a, b) CHECK_GT(a, b)
65#define DCHECK_GE(a, b) CHECK_GE(a, b)
66#else
67#define DCHECK(a)
68#define DCHECK_EQ(a, b)
69#define DCHECK_NE(a, b)
70#define DCHECK_LT(a, b)
71#define DCHECK_LE(a, b)
72#define DCHECK_GT(a, b)
73#define DCHECK_GE(a, b)
74#endif
75
76// The following "build consistency" machinery ensures that all source files
77// are built in the same configuration. Inconsistent builds lead to
78// hard to debug crashes.
79#if TSAN_DEBUG
80void build_consistency_debug();
81#else
82void build_consistency_release();
83#endif
84
85#if TSAN_COLLECT_STATS
86void build_consistency_stats();
87#else
88void build_consistency_nostats();
89#endif
90
91#if TSAN_SHADOW_COUNT == 1
92void build_consistency_shadow1();
93#elif TSAN_SHADOW_COUNT == 2
94void build_consistency_shadow2();
95#elif TSAN_SHADOW_COUNT == 4
96void build_consistency_shadow4();
97#else
98void build_consistency_shadow8();
99#endif
100
101static inline void USED build_consistency() {
102#if TSAN_DEBUG
103  build_consistency_debug();
104#else
105  build_consistency_release();
106#endif
107#if TSAN_COLLECT_STATS
108  build_consistency_stats();
109#else
110  build_consistency_nostats();
111#endif
112#if TSAN_SHADOW_COUNT == 1
113  build_consistency_shadow1();
114#elif TSAN_SHADOW_COUNT == 2
115  build_consistency_shadow2();
116#elif TSAN_SHADOW_COUNT == 4
117  build_consistency_shadow4();
118#else
119  build_consistency_shadow8();
120#endif
121}
122
123template<typename T>
124T min(T a, T b) {
125  return a < b ? a : b;
126}
127
128template<typename T>
129T max(T a, T b) {
130  return a > b ? a : b;
131}
132
133template<typename T>
134T RoundUp(T p, int align) {
135  DCHECK_EQ(align & (align - 1), 0);
136  return (T)(((u64)p + align - 1) & ~(align - 1));
137}
138
139struct MD5Hash {
140  u64 hash[2];
141  bool operator==(const MD5Hash &other) const {
142    return hash[0] == other.hash[0] && hash[1] == other.hash[1];
143  }
144};
145
146MD5Hash md5_hash(const void *data, uptr size);
147
148struct ThreadState;
149struct ThreadContext;
150struct Context;
151struct ReportStack;
152class ReportDesc;
153class RegionAlloc;
154class StackTrace;
155
156}  // namespace __tsan
157
158DECLARE_REAL(void*, memset, void *ptr, int v, uptr size);
159DECLARE_REAL(void*, memcpy, void *dst, const void *src, uptr size);
160DECLARE_REAL(int, strncmp, const char *s1, const char *s2, uptr n);
161DECLARE_REAL(const char*, strstr, const char *s1, const char *s2);
162
163#endif  // TSAN_DEFS_H
164