annotate libsanitizer/tsan/tsan_report.h @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children 1830386684a0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 //===-- tsan_report.h -------------------------------------------*- C++ -*-===//
kono
parents:
diff changeset
2 //
kono
parents:
diff changeset
3 // This file is distributed under the University of Illinois Open Source
kono
parents:
diff changeset
4 // License. See LICENSE.TXT for details.
kono
parents:
diff changeset
5 //
kono
parents:
diff changeset
6 //===----------------------------------------------------------------------===//
kono
parents:
diff changeset
7 //
kono
parents:
diff changeset
8 // This file is a part of ThreadSanitizer (TSan), a race detector.
kono
parents:
diff changeset
9 //
kono
parents:
diff changeset
10 //===----------------------------------------------------------------------===//
kono
parents:
diff changeset
11 #ifndef TSAN_REPORT_H
kono
parents:
diff changeset
12 #define TSAN_REPORT_H
kono
parents:
diff changeset
13
kono
parents:
diff changeset
14 #include "sanitizer_common/sanitizer_symbolizer.h"
kono
parents:
diff changeset
15 #include "tsan_defs.h"
kono
parents:
diff changeset
16 #include "tsan_vector.h"
kono
parents:
diff changeset
17
kono
parents:
diff changeset
18 namespace __tsan {
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 enum ReportType {
kono
parents:
diff changeset
21 ReportTypeRace,
kono
parents:
diff changeset
22 ReportTypeVptrRace,
kono
parents:
diff changeset
23 ReportTypeUseAfterFree,
kono
parents:
diff changeset
24 ReportTypeVptrUseAfterFree,
kono
parents:
diff changeset
25 ReportTypeExternalRace,
kono
parents:
diff changeset
26 ReportTypeThreadLeak,
kono
parents:
diff changeset
27 ReportTypeMutexDestroyLocked,
kono
parents:
diff changeset
28 ReportTypeMutexDoubleLock,
kono
parents:
diff changeset
29 ReportTypeMutexInvalidAccess,
kono
parents:
diff changeset
30 ReportTypeMutexBadUnlock,
kono
parents:
diff changeset
31 ReportTypeMutexBadReadLock,
kono
parents:
diff changeset
32 ReportTypeMutexBadReadUnlock,
kono
parents:
diff changeset
33 ReportTypeSignalUnsafe,
kono
parents:
diff changeset
34 ReportTypeErrnoInSignal,
kono
parents:
diff changeset
35 ReportTypeDeadlock
kono
parents:
diff changeset
36 };
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 struct ReportStack {
kono
parents:
diff changeset
39 SymbolizedStack *frames;
kono
parents:
diff changeset
40 bool suppressable;
kono
parents:
diff changeset
41 static ReportStack *New();
kono
parents:
diff changeset
42
kono
parents:
diff changeset
43 private:
kono
parents:
diff changeset
44 ReportStack();
kono
parents:
diff changeset
45 };
kono
parents:
diff changeset
46
kono
parents:
diff changeset
47 struct ReportMopMutex {
kono
parents:
diff changeset
48 u64 id;
kono
parents:
diff changeset
49 bool write;
kono
parents:
diff changeset
50 };
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 struct ReportMop {
kono
parents:
diff changeset
53 int tid;
kono
parents:
diff changeset
54 uptr addr;
kono
parents:
diff changeset
55 int size;
kono
parents:
diff changeset
56 bool write;
kono
parents:
diff changeset
57 bool atomic;
kono
parents:
diff changeset
58 uptr external_tag;
kono
parents:
diff changeset
59 Vector<ReportMopMutex> mset;
kono
parents:
diff changeset
60 ReportStack *stack;
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 ReportMop();
kono
parents:
diff changeset
63 };
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 enum ReportLocationType {
kono
parents:
diff changeset
66 ReportLocationGlobal,
kono
parents:
diff changeset
67 ReportLocationHeap,
kono
parents:
diff changeset
68 ReportLocationStack,
kono
parents:
diff changeset
69 ReportLocationTLS,
kono
parents:
diff changeset
70 ReportLocationFD
kono
parents:
diff changeset
71 };
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 struct ReportLocation {
kono
parents:
diff changeset
74 ReportLocationType type;
kono
parents:
diff changeset
75 DataInfo global;
kono
parents:
diff changeset
76 uptr heap_chunk_start;
kono
parents:
diff changeset
77 uptr heap_chunk_size;
kono
parents:
diff changeset
78 uptr external_tag;
kono
parents:
diff changeset
79 int tid;
kono
parents:
diff changeset
80 int fd;
kono
parents:
diff changeset
81 bool suppressable;
kono
parents:
diff changeset
82 ReportStack *stack;
kono
parents:
diff changeset
83
kono
parents:
diff changeset
84 static ReportLocation *New(ReportLocationType type);
kono
parents:
diff changeset
85 private:
kono
parents:
diff changeset
86 explicit ReportLocation(ReportLocationType type);
kono
parents:
diff changeset
87 };
kono
parents:
diff changeset
88
kono
parents:
diff changeset
89 struct ReportThread {
kono
parents:
diff changeset
90 int id;
kono
parents:
diff changeset
91 tid_t os_id;
kono
parents:
diff changeset
92 bool running;
kono
parents:
diff changeset
93 bool workerthread;
kono
parents:
diff changeset
94 char *name;
kono
parents:
diff changeset
95 u32 parent_tid;
kono
parents:
diff changeset
96 ReportStack *stack;
kono
parents:
diff changeset
97 };
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 struct ReportMutex {
kono
parents:
diff changeset
100 u64 id;
kono
parents:
diff changeset
101 uptr addr;
kono
parents:
diff changeset
102 bool destroyed;
kono
parents:
diff changeset
103 ReportStack *stack;
kono
parents:
diff changeset
104 };
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 class ReportDesc {
kono
parents:
diff changeset
107 public:
kono
parents:
diff changeset
108 ReportType typ;
kono
parents:
diff changeset
109 uptr tag;
kono
parents:
diff changeset
110 Vector<ReportStack*> stacks;
kono
parents:
diff changeset
111 Vector<ReportMop*> mops;
kono
parents:
diff changeset
112 Vector<ReportLocation*> locs;
kono
parents:
diff changeset
113 Vector<ReportMutex*> mutexes;
kono
parents:
diff changeset
114 Vector<ReportThread*> threads;
kono
parents:
diff changeset
115 Vector<int> unique_tids;
kono
parents:
diff changeset
116 ReportStack *sleep;
kono
parents:
diff changeset
117 int count;
kono
parents:
diff changeset
118
kono
parents:
diff changeset
119 ReportDesc();
kono
parents:
diff changeset
120 ~ReportDesc();
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122 private:
kono
parents:
diff changeset
123 ReportDesc(const ReportDesc&);
kono
parents:
diff changeset
124 void operator = (const ReportDesc&);
kono
parents:
diff changeset
125 };
kono
parents:
diff changeset
126
kono
parents:
diff changeset
127 // Format and output the report to the console/log. No additional logic.
kono
parents:
diff changeset
128 void PrintReport(const ReportDesc *rep);
kono
parents:
diff changeset
129 void PrintStack(const ReportStack *stack);
kono
parents:
diff changeset
130
kono
parents:
diff changeset
131 } // namespace __tsan
kono
parents:
diff changeset
132
kono
parents:
diff changeset
133 #endif // TSAN_REPORT_H