1 //===-- tsan_report.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 #ifndef TSAN_REPORT_H 14 #define TSAN_REPORT_H 15 16 #include "sanitizer_common/sanitizer_symbolizer.h" 17 #include "tsan_defs.h" 18 #include "tsan_vector.h" 19 20 namespace __tsan { 21 22 enum ReportType { 23 ReportTypeRace, 24 ReportTypeVptrRace, 25 ReportTypeUseAfterFree, 26 ReportTypeVptrUseAfterFree, 27 ReportTypeThreadLeak, 28 ReportTypeMutexDestroyLocked, 29 ReportTypeMutexDoubleLock, 30 ReportTypeMutexBadUnlock, 31 ReportTypeMutexBadReadLock, 32 ReportTypeMutexBadReadUnlock, 33 ReportTypeSignalUnsafe, 34 ReportTypeErrnoInSignal, 35 ReportTypeDeadlock 36 }; 37 38 struct ReportStack { 39 SymbolizedStack *frames; 40 bool suppressable; 41 static ReportStack *New(); 42 43 private: 44 ReportStack(); 45 }; 46 47 struct ReportMopMutex { 48 u64 id; 49 bool write; 50 }; 51 52 struct ReportMop { 53 int tid; 54 uptr addr; 55 int size; 56 bool write; 57 bool atomic; 58 Vector<ReportMopMutex> mset; 59 ReportStack *stack; 60 61 ReportMop(); 62 }; 63 64 enum ReportLocationType { 65 ReportLocationGlobal, 66 ReportLocationHeap, 67 ReportLocationStack, 68 ReportLocationTLS, 69 ReportLocationFD 70 }; 71 72 struct ReportLocation { 73 ReportLocationType type; 74 DataInfo global; 75 uptr heap_chunk_start; 76 uptr heap_chunk_size; 77 int tid; 78 int fd; 79 bool suppressable; 80 ReportStack *stack; 81 82 static ReportLocation *New(ReportLocationType type); 83 private: 84 explicit ReportLocation(ReportLocationType type); 85 }; 86 87 struct ReportThread { 88 int id; 89 uptr pid; 90 bool running; 91 char *name; 92 int parent_tid; 93 ReportStack *stack; 94 }; 95 96 struct ReportMutex { 97 u64 id; 98 uptr addr; 99 bool destroyed; 100 ReportStack *stack; 101 }; 102 103 class ReportDesc { 104 public: 105 ReportType typ; 106 Vector<ReportStack*> stacks; 107 Vector<ReportMop*> mops; 108 Vector<ReportLocation*> locs; 109 Vector<ReportMutex*> mutexes; 110 Vector<ReportThread*> threads; 111 Vector<int> unique_tids; 112 ReportStack *sleep; 113 int count; 114 115 ReportDesc(); 116 ~ReportDesc(); 117 118 private: 119 ReportDesc(const ReportDesc&); 120 void operator = (const ReportDesc&); 121 }; 122 123 // Format and output the report to the console/log. No additional logic. 124 void PrintReport(const ReportDesc *rep); 125 void PrintStack(const ReportStack *stack); 126 127 } // namespace __tsan 128 129 #endif // TSAN_REPORT_H 130