• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
21 namespace __tsan {
22 
23 const int kTracePartSizeBits = 14;
24 const int kTracePartSize = 1 << kTracePartSizeBits;
25 const int kTraceParts = 4 * 1024 * 1024 / kTracePartSize;
26 const int kTraceSize = kTracePartSize * kTraceParts;
27 
28 // Must fit into 3 bits.
29 enum 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.
42 typedef u64 Event;
43 
44 struct 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 
TraceHeaderTraceHeader52   TraceHeader()
53 #ifndef TSAN_GO
54       : stack0(stack0buf, kTraceStackSize)
55 #else
56       : stack0()
57 #endif
58       , epoch0() {
59   }
60 };
61 
62 struct 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 
TraceTrace71   Trace()
72     : mtx(MutexTypeTrace, StatMtxTrace) {
73   }
74 };
75 
76 }  // namespace __tsan
77 
78 #endif  // TSAN_TRACE_H
79