forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			120 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
//===-- tsan_report.h -------------------------------------------*- C++ -*-===//
 | 
						|
//
 | 
						|
//                     The LLVM Compiler Infrastructure
 | 
						|
//
 | 
						|
// This file is distributed under the University of Illinois Open Source
 | 
						|
// License. See LICENSE.TXT for details.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
//
 | 
						|
// This file is a part of ThreadSanitizer (TSan), a race detector.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
#ifndef TSAN_REPORT_H
 | 
						|
#define TSAN_REPORT_H
 | 
						|
 | 
						|
#include "tsan_defs.h"
 | 
						|
#include "tsan_vector.h"
 | 
						|
 | 
						|
namespace __tsan {
 | 
						|
 | 
						|
enum ReportType {
 | 
						|
  ReportTypeRace,
 | 
						|
  ReportTypeUseAfterFree,
 | 
						|
  ReportTypeThreadLeak,
 | 
						|
  ReportTypeMutexDestroyLocked,
 | 
						|
  ReportTypeSignalUnsafe,
 | 
						|
  ReportTypeErrnoInSignal
 | 
						|
};
 | 
						|
 | 
						|
struct ReportStack {
 | 
						|
  ReportStack *next;
 | 
						|
  char *module;
 | 
						|
  uptr offset;
 | 
						|
  uptr pc;
 | 
						|
  char *func;
 | 
						|
  char *file;
 | 
						|
  int line;
 | 
						|
  int col;
 | 
						|
};
 | 
						|
 | 
						|
struct ReportMopMutex {
 | 
						|
  u64 id;
 | 
						|
  bool write;
 | 
						|
};
 | 
						|
 | 
						|
struct ReportMop {
 | 
						|
  int tid;
 | 
						|
  uptr addr;
 | 
						|
  int size;
 | 
						|
  bool write;
 | 
						|
  bool atomic;
 | 
						|
  Vector<ReportMopMutex> mset;
 | 
						|
  ReportStack *stack;
 | 
						|
 | 
						|
  ReportMop();
 | 
						|
};
 | 
						|
 | 
						|
enum ReportLocationType {
 | 
						|
  ReportLocationGlobal,
 | 
						|
  ReportLocationHeap,
 | 
						|
  ReportLocationStack,
 | 
						|
  ReportLocationTLS,
 | 
						|
  ReportLocationFD
 | 
						|
};
 | 
						|
 | 
						|
struct ReportLocation {
 | 
						|
  ReportLocationType type;
 | 
						|
  uptr addr;
 | 
						|
  uptr size;
 | 
						|
  char *module;
 | 
						|
  uptr offset;
 | 
						|
  int tid;
 | 
						|
  int fd;
 | 
						|
  char *name;
 | 
						|
  char *file;
 | 
						|
  int line;
 | 
						|
  ReportStack *stack;
 | 
						|
};
 | 
						|
 | 
						|
struct ReportThread {
 | 
						|
  int id;
 | 
						|
  uptr pid;
 | 
						|
  bool running;
 | 
						|
  char *name;
 | 
						|
  int parent_tid;
 | 
						|
  ReportStack *stack;
 | 
						|
};
 | 
						|
 | 
						|
struct ReportMutex {
 | 
						|
  u64 id;
 | 
						|
  bool destroyed;
 | 
						|
  ReportStack *stack;
 | 
						|
};
 | 
						|
 | 
						|
class ReportDesc {
 | 
						|
 public:
 | 
						|
  ReportType typ;
 | 
						|
  Vector<ReportStack*> stacks;
 | 
						|
  Vector<ReportMop*> mops;
 | 
						|
  Vector<ReportLocation*> locs;
 | 
						|
  Vector<ReportMutex*> mutexes;
 | 
						|
  Vector<ReportThread*> threads;
 | 
						|
  ReportStack *sleep;
 | 
						|
 | 
						|
  ReportDesc();
 | 
						|
  ~ReportDesc();
 | 
						|
 | 
						|
 private:
 | 
						|
  ReportDesc(const ReportDesc&);
 | 
						|
  void operator = (const ReportDesc&);
 | 
						|
};
 | 
						|
 | 
						|
// Format and output the report to the console/log. No additional logic.
 | 
						|
void PrintReport(const ReportDesc *rep);
 | 
						|
void PrintStack(const ReportStack *stack);
 | 
						|
 | 
						|
}  // namespace __tsan
 | 
						|
 | 
						|
#endif  // TSAN_REPORT_H
 |