LLVM  12.0.0git
Macros | Functions | Variables
ThreadSanitizer.cpp File Reference
#include "llvm/Transforms/Instrumentation/ThreadSanitizer.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Analysis/CaptureTracking.h"
#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/Analysis/ValueTracking.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Metadata.h"
#include "llvm/IR/Module.h"
#include "llvm/IR/Type.h"
#include "llvm/InitializePasses.h"
#include "llvm/ProfileData/InstrProf.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/MathExtras.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Transforms/Instrumentation.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Transforms/Utils/EscapeEnumerator.h"
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/Transforms/Utils/ModuleUtils.h"
Include dependency graph for ThreadSanitizer.cpp:

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "tsan"
 

Functions

 STATISTIC (NumInstrumentedReads, "Number of instrumented reads")
 
 STATISTIC (NumInstrumentedWrites, "Number of instrumented writes")
 
 STATISTIC (NumOmittedReadsBeforeWrite, "Number of reads ignored due to following writes")
 
 STATISTIC (NumAccessesWithBadSize, "Number of accesses with bad size")
 
 STATISTIC (NumInstrumentedVtableWrites, "Number of vtable ptr writes")
 
 STATISTIC (NumInstrumentedVtableReads, "Number of vtable ptr reads")
 
 STATISTIC (NumOmittedReadsFromConstantGlobals, "Number of reads from constant globals")
 
 STATISTIC (NumOmittedReadsFromVtable, "Number of vtable reads")
 
 STATISTIC (NumOmittedNonCaptured, "Number of accesses ignored due to capturing")
 
 INITIALIZE_PASS_BEGIN (ThreadSanitizerLegacyPass, "tsan", "ThreadSanitizer: detects data races.", false, false) INITIALIZE_PASS_END(ThreadSanitizerLegacyPass
 
static bool isVtableAccess (Instruction *I)
 
static bool shouldInstrumentReadWriteFromAddress (const Module *M, Value *Addr)
 
static bool isAtomic (Instruction *I)
 
static ConstantIntcreateOrdering (IRBuilder<> *IRB, AtomicOrdering ord)
 

Variables

static cl::opt< boolClInstrumentMemoryAccesses ("tsan-instrument-memory-accesses", cl::init(true), cl::desc("Instrument memory accesses"), cl::Hidden)
 
static cl::opt< boolClInstrumentFuncEntryExit ("tsan-instrument-func-entry-exit", cl::init(true), cl::desc("Instrument function entry and exit"), cl::Hidden)
 
static cl::opt< boolClHandleCxxExceptions ("tsan-handle-cxx-exceptions", cl::init(true), cl::desc("Handle C++ exceptions (insert cleanup blocks for unwinding)"), cl::Hidden)
 
static cl::opt< boolClInstrumentAtomics ("tsan-instrument-atomics", cl::init(true), cl::desc("Instrument atomics"), cl::Hidden)
 
static cl::opt< boolClInstrumentMemIntrinsics ("tsan-instrument-memintrinsics", cl::init(true), cl::desc("Instrument memintrinsics (memset/memcpy/memmove)"), cl::Hidden)
 
static cl::opt< boolClDistinguishVolatile ("tsan-distinguish-volatile", cl::init(false), cl::desc("Emit special instrumentation for accesses to volatiles"), cl::Hidden)
 
static cl::opt< boolClInstrumentReadBeforeWrite ("tsan-instrument-read-before-write", cl::init(false), cl::desc("Do not eliminate read instrumentation for read-before-writes"), cl::Hidden)
 
static const char *const kTsanModuleCtorName = "tsan.module_ctor"
 
static const char *const kTsanInitName = "__tsan_init"
 
 tsan
 
ThreadSanitizer __pad0__
 
ThreadSanitizer false
 

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "tsan"

Definition at line 53 of file ThreadSanitizer.cpp.

Function Documentation

◆ createOrdering()

static ConstantInt* createOrdering ( IRBuilder<> *  IRB,
AtomicOrdering  ord 
)
static

◆ INITIALIZE_PASS_BEGIN()

INITIALIZE_PASS_BEGIN ( ThreadSanitizerLegacyPass  ,
"tsan"  ,
"ThreadSanitizer: detects data races."  ,
false  ,
false   
)

◆ isAtomic()

static bool isAtomic ( Instruction I)
static

◆ isVtableAccess()

static bool isVtableAccess ( Instruction I)
static

◆ shouldInstrumentReadWriteFromAddress()

static bool shouldInstrumentReadWriteFromAddress ( const Module M,
Value Addr 
)
static

◆ STATISTIC() [1/9]

STATISTIC ( NumInstrumentedReads  ,
"Number of instrumented reads"   
)

◆ STATISTIC() [2/9]

STATISTIC ( NumInstrumentedWrites  ,
"Number of instrumented writes"   
)

◆ STATISTIC() [3/9]

STATISTIC ( NumOmittedReadsBeforeWrite  ,
"Number of reads ignored due to following writes"   
)

◆ STATISTIC() [4/9]

STATISTIC ( NumAccessesWithBadSize  ,
"Number of accesses with bad size"   
)

◆ STATISTIC() [5/9]

STATISTIC ( NumInstrumentedVtableWrites  ,
"Number of vtable ptr writes"   
)

◆ STATISTIC() [6/9]

STATISTIC ( NumInstrumentedVtableReads  ,
"Number of vtable ptr reads"   
)

◆ STATISTIC() [7/9]

STATISTIC ( NumOmittedReadsFromConstantGlobals  ,
"Number of reads from constant globals  
)

◆ STATISTIC() [8/9]

STATISTIC ( NumOmittedReadsFromVtable  ,
"Number of vtable reads"   
)

◆ STATISTIC() [9/9]

STATISTIC ( NumOmittedNonCaptured  ,
"Number of accesses ignored due to capturing"   
)

Variable Documentation

◆ __pad0__

ThreadSanitizer __pad0__

Definition at line 187 of file ThreadSanitizer.cpp.

◆ ClDistinguishVolatile

cl::opt<bool> ClDistinguishVolatile("tsan-distinguish-volatile", cl::init(false), cl::desc("Emit special instrumentation for accesses to volatiles"), cl::Hidden)
static

Referenced by isAtomic().

◆ ClHandleCxxExceptions

cl::opt<bool> ClHandleCxxExceptions("tsan-handle-cxx-exceptions", cl::init(true), cl::desc("Handle C++ exceptions (insert cleanup blocks for unwinding)"), cl::Hidden)
static

Referenced by isAtomic().

◆ ClInstrumentAtomics

cl::opt<bool> ClInstrumentAtomics("tsan-instrument-atomics", cl::init(true), cl::desc("Instrument atomics"), cl::Hidden)
static

Referenced by isAtomic().

◆ ClInstrumentFuncEntryExit

cl::opt<bool> ClInstrumentFuncEntryExit("tsan-instrument-func-entry-exit", cl::init(true), cl::desc("Instrument function entry and exit"), cl::Hidden)
static

Referenced by isAtomic().

◆ ClInstrumentMemIntrinsics

cl::opt<bool> ClInstrumentMemIntrinsics("tsan-instrument-memintrinsics", cl::init(true), cl::desc("Instrument memintrinsics (memset/memcpy/memmove)"), cl::Hidden)
static

Referenced by isAtomic().

◆ ClInstrumentMemoryAccesses

cl::opt<bool> ClInstrumentMemoryAccesses("tsan-instrument-memory-accesses", cl::init(true), cl::desc("Instrument memory accesses"), cl::Hidden)
static

Referenced by isAtomic().

◆ ClInstrumentReadBeforeWrite

cl::opt<bool> ClInstrumentReadBeforeWrite("tsan-instrument-read-before-write", cl::init(false), cl::desc("Do not eliminate read instrumentation for read-before-writes"), cl::Hidden)
static

◆ false

ThreadSanitizer false

Definition at line 187 of file ThreadSanitizer.cpp.

◆ kTsanInitName

const char* const kTsanInitName = "__tsan_init"
static

Definition at line 93 of file ThreadSanitizer.cpp.

◆ kTsanModuleCtorName

const char* const kTsanModuleCtorName = "tsan.module_ctor"
static

Definition at line 92 of file ThreadSanitizer.cpp.

Referenced by isAtomic().

◆ tsan

tsan

Definition at line 187 of file ThreadSanitizer.cpp.