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 = 14;
24const int kTracePartSize = 1 << kTracePartSizeBits;
25const int kTraceParts = 4 * 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  StackTrace stack0;  // Start stack for the trace.
46  u64        epoch0;  // Start epoch for the trace.
47  MutexSet   mset0;
48#ifndef TSAN_GO
49  uptr       stack0buf[kTraceStackSize];
50#endif
51
52  TraceHeader()
53#ifndef TSAN_GO
54      : stack0(stack0buf, kTraceStackSize)
55#else
56      : stack0()
57#endif
58      , epoch0() {
59  }
60};
61
62struct Trace {
63  TraceHeader headers[kTraceParts];
64  Mutex mtx;
65#ifndef TSAN_GO
66  // Must be last to catch overflow as paging fault.
67  // Go shadow stack is dynamically allocated.
68  uptr shadow_stack[kShadowStackSize];
69#endif
70
71  Trace()
72    : mtx(MutexTypeTrace, StatMtxTrace) {
73  }
74};
75
76}  // namespace __tsan
77
78#endif  // TSAN_TRACE_H
79