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 "sanitizer_common/sanitizer_vector.h"
16#include "tsan_defs.h"
17
18namespace __tsan {
19
20enum ReportType {
21  ReportTypeRace,
22  ReportTypeVptrRace,
23  ReportTypeUseAfterFree,
24  ReportTypeVptrUseAfterFree,
25  ReportTypeExternalRace,
26  ReportTypeThreadLeak,
27  ReportTypeMutexDestroyLocked,
28  ReportTypeMutexDoubleLock,
29  ReportTypeMutexInvalidAccess,
30  ReportTypeMutexBadUnlock,
31  ReportTypeMutexBadReadLock,
32  ReportTypeMutexBadReadUnlock,
33  ReportTypeSignalUnsafe,
34  ReportTypeErrnoInSignal,
35  ReportTypeDeadlock
36};
37
38struct ReportStack {
39  SymbolizedStack *frames;
40  bool suppressable;
41  static ReportStack *New();
42
43 private:
44  ReportStack();
45};
46
47struct ReportMopMutex {
48  u64 id;
49  bool write;
50};
51
52struct ReportMop {
53  int tid;
54  uptr addr;
55  int size;
56  bool write;
57  bool atomic;
58  uptr external_tag;
59  Vector<ReportMopMutex> mset;
60  ReportStack *stack;
61
62  ReportMop();
63};
64
65enum ReportLocationType {
66  ReportLocationGlobal,
67  ReportLocationHeap,
68  ReportLocationStack,
69  ReportLocationTLS,
70  ReportLocationFD
71};
72
73struct ReportLocation {
74  ReportLocationType type;
75  DataInfo global;
76  uptr heap_chunk_start;
77  uptr heap_chunk_size;
78  uptr external_tag;
79  int tid;
80  int fd;
81  bool suppressable;
82  ReportStack *stack;
83
84  static ReportLocation *New(ReportLocationType type);
85 private:
86  explicit ReportLocation(ReportLocationType type);
87};
88
89struct ReportThread {
90  int id;
91  tid_t os_id;
92  bool running;
93  bool workerthread;
94  char *name;
95  u32 parent_tid;
96  ReportStack *stack;
97};
98
99struct ReportMutex {
100  u64 id;
101  uptr addr;
102  bool destroyed;
103  ReportStack *stack;
104};
105
106class ReportDesc {
107 public:
108  ReportType typ;
109  uptr tag;
110  Vector<ReportStack*> stacks;
111  Vector<ReportMop*> mops;
112  Vector<ReportLocation*> locs;
113  Vector<ReportMutex*> mutexes;
114  Vector<ReportThread*> threads;
115  Vector<int> unique_tids;
116  ReportStack *sleep;
117  int count;
118
119  ReportDesc();
120  ~ReportDesc();
121
122 private:
123  ReportDesc(const ReportDesc&);
124  void operator = (const ReportDesc&);
125};
126
127// Format and output the report to the console/log. No additional logic.
128void PrintReport(const ReportDesc *rep);
129void PrintStack(const ReportStack *stack);
130
131}  // namespace __tsan
132
133#endif  // TSAN_REPORT_H
134