Home | History | Annotate | Line # | Download | only in tsan
tsan_defs.h revision 1.1
      1  1.1  mrg //===-- tsan_defs.h ---------------------------------------------*- C++ -*-===//
      2  1.1  mrg //
      3  1.1  mrg // This file is distributed under the University of Illinois Open Source
      4  1.1  mrg // License. See LICENSE.TXT for details.
      5  1.1  mrg //
      6  1.1  mrg //===----------------------------------------------------------------------===//
      7  1.1  mrg //
      8  1.1  mrg // This file is a part of ThreadSanitizer (TSan), a race detector.
      9  1.1  mrg //
     10  1.1  mrg //===----------------------------------------------------------------------===//
     11  1.1  mrg 
     12  1.1  mrg #ifndef TSAN_DEFS_H
     13  1.1  mrg #define TSAN_DEFS_H
     14  1.1  mrg 
     15  1.1  mrg #include "sanitizer_common/sanitizer_internal_defs.h"
     16  1.1  mrg #include "sanitizer_common/sanitizer_libc.h"
     17  1.1  mrg #include "tsan_stat.h"
     18  1.1  mrg 
     19  1.1  mrg #ifndef TSAN_DEBUG
     20  1.1  mrg #define TSAN_DEBUG 0
     21  1.1  mrg #endif  // TSAN_DEBUG
     22  1.1  mrg 
     23  1.1  mrg namespace __tsan {
     24  1.1  mrg 
     25  1.1  mrg #ifdef TSAN_GO
     26  1.1  mrg const bool kGoMode = true;
     27  1.1  mrg const bool kCppMode = false;
     28  1.1  mrg const char *const kTsanOptionsEnv = "GORACE";
     29  1.1  mrg // Go linker does not support weak symbols.
     30  1.1  mrg #define CPP_WEAK
     31  1.1  mrg #else
     32  1.1  mrg const bool kGoMode = false;
     33  1.1  mrg const bool kCppMode = true;
     34  1.1  mrg const char *const kTsanOptionsEnv = "TSAN_OPTIONS";
     35  1.1  mrg #define CPP_WEAK WEAK
     36  1.1  mrg #endif
     37  1.1  mrg 
     38  1.1  mrg const int kTidBits = 13;
     39  1.1  mrg const unsigned kMaxTid = 1 << kTidBits;
     40  1.1  mrg const unsigned kMaxTidInClock = kMaxTid * 2;  // This includes msb 'freed' bit.
     41  1.1  mrg const int kClkBits = 42;
     42  1.1  mrg #ifndef TSAN_GO
     43  1.1  mrg const int kShadowStackSize = 4 * 1024;
     44  1.1  mrg const int kTraceStackSize = 256;
     45  1.1  mrg #endif
     46  1.1  mrg 
     47  1.1  mrg #ifdef TSAN_SHADOW_COUNT
     48  1.1  mrg # if TSAN_SHADOW_COUNT == 2 \
     49  1.1  mrg   || TSAN_SHADOW_COUNT == 4 || TSAN_SHADOW_COUNT == 8
     50  1.1  mrg const uptr kShadowCnt = TSAN_SHADOW_COUNT;
     51  1.1  mrg # else
     52  1.1  mrg #   error "TSAN_SHADOW_COUNT must be one of 2,4,8"
     53  1.1  mrg # endif
     54  1.1  mrg #else
     55  1.1  mrg // Count of shadow values in a shadow cell.
     56  1.1  mrg const uptr kShadowCnt = 4;
     57  1.1  mrg #endif
     58  1.1  mrg 
     59  1.1  mrg // That many user bytes are mapped onto a single shadow cell.
     60  1.1  mrg const uptr kShadowCell = 8;
     61  1.1  mrg 
     62  1.1  mrg // Size of a single shadow value (u64).
     63  1.1  mrg const uptr kShadowSize = 8;
     64  1.1  mrg 
     65  1.1  mrg // Shadow memory is kShadowMultiplier times larger than user memory.
     66  1.1  mrg const uptr kShadowMultiplier = kShadowSize * kShadowCnt / kShadowCell;
     67  1.1  mrg 
     68  1.1  mrg #if defined(TSAN_COLLECT_STATS) && TSAN_COLLECT_STATS
     69  1.1  mrg const bool kCollectStats = true;
     70  1.1  mrg #else
     71  1.1  mrg const bool kCollectStats = false;
     72  1.1  mrg #endif
     73  1.1  mrg 
     74  1.1  mrg // The following "build consistency" machinery ensures that all source files
     75  1.1  mrg // are built in the same configuration. Inconsistent builds lead to
     76  1.1  mrg // hard to debug crashes.
     77  1.1  mrg #if TSAN_DEBUG
     78  1.1  mrg void build_consistency_debug();
     79  1.1  mrg #else
     80  1.1  mrg void build_consistency_release();
     81  1.1  mrg #endif
     82  1.1  mrg 
     83  1.1  mrg #if TSAN_COLLECT_STATS
     84  1.1  mrg void build_consistency_stats();
     85  1.1  mrg #else
     86  1.1  mrg void build_consistency_nostats();
     87  1.1  mrg #endif
     88  1.1  mrg 
     89  1.1  mrg #if TSAN_SHADOW_COUNT == 1
     90  1.1  mrg void build_consistency_shadow1();
     91  1.1  mrg #elif TSAN_SHADOW_COUNT == 2
     92  1.1  mrg void build_consistency_shadow2();
     93  1.1  mrg #elif TSAN_SHADOW_COUNT == 4
     94  1.1  mrg void build_consistency_shadow4();
     95  1.1  mrg #else
     96  1.1  mrg void build_consistency_shadow8();
     97  1.1  mrg #endif
     98  1.1  mrg 
     99  1.1  mrg static inline void USED build_consistency() {
    100  1.1  mrg #if TSAN_DEBUG
    101  1.1  mrg   build_consistency_debug();
    102  1.1  mrg #else
    103  1.1  mrg   build_consistency_release();
    104  1.1  mrg #endif
    105  1.1  mrg #if TSAN_COLLECT_STATS
    106  1.1  mrg   build_consistency_stats();
    107  1.1  mrg #else
    108  1.1  mrg   build_consistency_nostats();
    109  1.1  mrg #endif
    110  1.1  mrg #if TSAN_SHADOW_COUNT == 1
    111  1.1  mrg   build_consistency_shadow1();
    112  1.1  mrg #elif TSAN_SHADOW_COUNT == 2
    113  1.1  mrg   build_consistency_shadow2();
    114  1.1  mrg #elif TSAN_SHADOW_COUNT == 4
    115  1.1  mrg   build_consistency_shadow4();
    116  1.1  mrg #else
    117  1.1  mrg   build_consistency_shadow8();
    118  1.1  mrg #endif
    119  1.1  mrg }
    120  1.1  mrg 
    121  1.1  mrg template<typename T>
    122  1.1  mrg T min(T a, T b) {
    123  1.1  mrg   return a < b ? a : b;
    124  1.1  mrg }
    125  1.1  mrg 
    126  1.1  mrg template<typename T>
    127  1.1  mrg T max(T a, T b) {
    128  1.1  mrg   return a > b ? a : b;
    129  1.1  mrg }
    130  1.1  mrg 
    131  1.1  mrg template<typename T>
    132  1.1  mrg T RoundUp(T p, u64 align) {
    133  1.1  mrg   DCHECK_EQ(align & (align - 1), 0);
    134  1.1  mrg   return (T)(((u64)p + align - 1) & ~(align - 1));
    135  1.1  mrg }
    136  1.1  mrg 
    137  1.1  mrg template<typename T>
    138  1.1  mrg T RoundDown(T p, u64 align) {
    139  1.1  mrg   DCHECK_EQ(align & (align - 1), 0);
    140  1.1  mrg   return (T)((u64)p & ~(align - 1));
    141  1.1  mrg }
    142  1.1  mrg 
    143  1.1  mrg // Zeroizes high part, returns 'bits' lsb bits.
    144  1.1  mrg template<typename T>
    145  1.1  mrg T GetLsb(T v, int bits) {
    146  1.1  mrg   return (T)((u64)v & ((1ull << bits) - 1));
    147  1.1  mrg }
    148  1.1  mrg 
    149  1.1  mrg struct MD5Hash {
    150  1.1  mrg   u64 hash[2];
    151  1.1  mrg   bool operator==(const MD5Hash &other) const;
    152  1.1  mrg };
    153  1.1  mrg 
    154  1.1  mrg MD5Hash md5_hash(const void *data, uptr size);
    155  1.1  mrg 
    156  1.1  mrg struct ThreadState;
    157  1.1  mrg struct ThreadContext;
    158  1.1  mrg struct Context;
    159  1.1  mrg struct ReportStack;
    160  1.1  mrg class ReportDesc;
    161  1.1  mrg class RegionAlloc;
    162  1.1  mrg class StackTrace;
    163  1.1  mrg struct MBlock;
    164  1.1  mrg 
    165  1.1  mrg }  // namespace __tsan
    166  1.1  mrg 
    167  1.1  mrg #endif  // TSAN_DEFS_H
    168