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