1//===-- tsan_trace.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_TRACE_H
14#define TSAN_TRACE_H
15
16#include "tsan_defs.h"
17#include "tsan_mutex.h"
18#include "tsan_stack_trace.h"
19#include "tsan_mutexset.h"
20
21namespace __tsan {
22
23const int kTracePartSizeBits = 13;
24const int kTracePartSize = 1 << kTracePartSizeBits;
25const int kTraceParts = 2 * 1024 * 1024 / kTracePartSize;
26const int kTraceSize = kTracePartSize * kTraceParts;
27
28// Must fit into 3 bits.
29enum EventType {
30  EventTypeMop,
31  EventTypeFuncEnter,
32  EventTypeFuncExit,
33  EventTypeLock,
34  EventTypeUnlock,
35  EventTypeRLock,
36  EventTypeRUnlock
37};
38
39// Represents a thread event (from most significant bit):
40// u64 typ  : 3;   // EventType.
41// u64 addr : 61;  // Associated pc.
42typedef u64 Event;
43
44struct TraceHeader {
45#ifndef SANITIZER_GO
46  BufferedStackTrace stack0;  // Start stack for the trace.
47#else
48  VarSizeStackTrace stack0;
49#endif
50  u64        epoch0;  // Start epoch for the trace.
51  MutexSet   mset0;
52
53  TraceHeader() : stack0(), epoch0() {}
54};
55
56struct Trace {
57  Mutex mtx;
58#ifndef SANITIZER_GO
59  // Must be last to catch overflow as paging fault.
60  // Go shadow stack is dynamically allocated.
61  uptr shadow_stack[kShadowStackSize];
62#endif
63  // Must be the last field, because we unmap the unused part in
64  // CreateThreadContext.
65  TraceHeader headers[kTraceParts];
66
67  Trace()
68    : mtx(MutexTypeTrace, StatMtxTrace) {
69  }
70};
71
72}  // namespace __tsan
73
74#endif  // TSAN_TRACE_H
75