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   ReportTypeMutexInvalidAccess,
31   ReportTypeMutexBadUnlock,
32   ReportTypeMutexBadReadLock,
33   ReportTypeMutexBadReadUnlock,
34   ReportTypeSignalUnsafe,
35   ReportTypeErrnoInSignal,
36   ReportTypeDeadlock
37 };
38 
39 struct ReportStack {
40   SymbolizedStack *frames;
41   bool suppressable;
42   static ReportStack *New();
43 
44  private:
45   ReportStack();
46 };
47 
48 struct ReportMopMutex {
49   u64 id;
50   bool write;
51 };
52 
53 struct 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 
65 enum ReportLocationType {
66   ReportLocationGlobal,
67   ReportLocationHeap,
68   ReportLocationStack,
69   ReportLocationTLS,
70   ReportLocationFD
71 };
72 
73 struct 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 
88 struct ReportThread {
89   int id;
90   uptr os_id;
91   bool running;
92   char *name;
93   int parent_tid;
94   ReportStack *stack;
95 };
96 
97 struct ReportMutex {
98   u64 id;
99   uptr addr;
100   bool destroyed;
101   ReportStack *stack;
102 };
103 
104 class 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.
125 void PrintReport(const ReportDesc *rep);
126 void PrintStack(const ReportStack *stack);
127 
128 }  // namespace __tsan
129 
130 #endif  // TSAN_REPORT_H
131