76 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===-- tsan_trace.h --------------------------------------------*- C++ -*-===//
 | |
| //
 | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 | |
| // See https://llvm.org/LICENSE.txt for license information.
 | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| // This file is a part of ThreadSanitizer (TSan), a race detector.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| #ifndef TSAN_TRACE_H
 | |
| #define TSAN_TRACE_H
 | |
| 
 | |
| #include "tsan_defs.h"
 | |
| #include "tsan_mutex.h"
 | |
| #include "tsan_stack_trace.h"
 | |
| #include "tsan_mutexset.h"
 | |
| 
 | |
| namespace __tsan {
 | |
| 
 | |
| const int kTracePartSizeBits = 13;
 | |
| const int kTracePartSize = 1 << kTracePartSizeBits;
 | |
| const int kTraceParts = 2 * 1024 * 1024 / kTracePartSize;
 | |
| const int kTraceSize = kTracePartSize * kTraceParts;
 | |
| 
 | |
| // Must fit into 3 bits.
 | |
| enum EventType {
 | |
|   EventTypeMop,
 | |
|   EventTypeFuncEnter,
 | |
|   EventTypeFuncExit,
 | |
|   EventTypeLock,
 | |
|   EventTypeUnlock,
 | |
|   EventTypeRLock,
 | |
|   EventTypeRUnlock
 | |
| };
 | |
| 
 | |
| // Represents a thread event (from most significant bit):
 | |
| // u64 typ  : 3;   // EventType.
 | |
| // u64 addr : 61;  // Associated pc.
 | |
| typedef u64 Event;
 | |
| 
 | |
| const uptr kEventPCBits = 61;
 | |
| 
 | |
| struct TraceHeader {
 | |
| #if !SANITIZER_GO
 | |
|   BufferedStackTrace stack0;  // Start stack for the trace.
 | |
| #else
 | |
|   VarSizeStackTrace stack0;
 | |
| #endif
 | |
|   u64        epoch0;  // Start epoch for the trace.
 | |
|   MutexSet   mset0;
 | |
| 
 | |
|   TraceHeader() : stack0(), epoch0() {}
 | |
| };
 | |
| 
 | |
| struct Trace {
 | |
|   Mutex mtx;
 | |
| #if !SANITIZER_GO
 | |
|   // Must be last to catch overflow as paging fault.
 | |
|   // Go shadow stack is dynamically allocated.
 | |
|   uptr shadow_stack[kShadowStackSize];
 | |
| #endif
 | |
|   // Must be the last field, because we unmap the unused part in
 | |
|   // CreateThreadContext.
 | |
|   TraceHeader headers[kTraceParts];
 | |
| 
 | |
|   Trace()
 | |
|     : mtx(MutexTypeTrace, StatMtxTrace) {
 | |
|   }
 | |
| };
 | |
| 
 | |
| }  // namespace __tsan
 | |
| 
 | |
| #endif  // TSAN_TRACE_H
 |