]> git.proxmox.com Git - rustc.git/blob - src/compiler-rt/lib/tsan/rtl/tsan_report.h
Imported Upstream version 1.11.0+dfsg1
[rustc.git] / src / compiler-rt / lib / tsan / rtl / tsan_report.h
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