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