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
20namespace __tsan {
21
22enum 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
39struct ReportStack {
40  SymbolizedStack *frames;
41  bool suppressable;
42  static ReportStack *New();
43
44 private:
45  ReportStack();
46};
47
48struct ReportMopMutex {
49  u64 id;
50  bool write;
51};
52
53struct 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
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  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
88struct ReportThread {
89  int id;
90  uptr os_id;
91  bool running;
92  char *name;
93  int parent_tid;
94  ReportStack *stack;
95};
96
97struct ReportMutex {
98  u64 id;
99  uptr addr;
100  bool destroyed;
101  ReportStack *stack;
102};
103
104class 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.
125void PrintReport(const ReportDesc *rep);
126void PrintStack(const ReportStack *stack);
127
128}  // namespace __tsan
129
130#endif  // TSAN_REPORT_H
131