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