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