1*7c3d14c8STreehugger Robot //===-- tsan_stat.cc ------------------------------------------------------===// 2*7c3d14c8STreehugger Robot // 3*7c3d14c8STreehugger Robot // The LLVM Compiler Infrastructure 4*7c3d14c8STreehugger Robot // 5*7c3d14c8STreehugger Robot // This file is distributed under the University of Illinois Open Source 6*7c3d14c8STreehugger Robot // License. See LICENSE.TXT for details. 7*7c3d14c8STreehugger Robot // 8*7c3d14c8STreehugger Robot //===----------------------------------------------------------------------===// 9*7c3d14c8STreehugger Robot // 10*7c3d14c8STreehugger Robot // This file is a part of ThreadSanitizer (TSan), a race detector. 11*7c3d14c8STreehugger Robot // 12*7c3d14c8STreehugger Robot //===----------------------------------------------------------------------===// 13*7c3d14c8STreehugger Robot #include "tsan_stat.h" 14*7c3d14c8STreehugger Robot #include "tsan_rtl.h" 15*7c3d14c8STreehugger Robot 16*7c3d14c8STreehugger Robot namespace __tsan { 17*7c3d14c8STreehugger Robot 18*7c3d14c8STreehugger Robot #if TSAN_COLLECT_STATS 19*7c3d14c8STreehugger Robot StatAggregate(u64 * dst,u64 * src)20*7c3d14c8STreehugger Robotvoid StatAggregate(u64 *dst, u64 *src) { 21*7c3d14c8STreehugger Robot for (int i = 0; i < StatCnt; i++) 22*7c3d14c8STreehugger Robot dst[i] += src[i]; 23*7c3d14c8STreehugger Robot } 24*7c3d14c8STreehugger Robot StatOutput(u64 * stat)25*7c3d14c8STreehugger Robotvoid StatOutput(u64 *stat) { 26*7c3d14c8STreehugger Robot stat[StatShadowNonZero] = stat[StatShadowProcessed] - stat[StatShadowZero]; 27*7c3d14c8STreehugger Robot 28*7c3d14c8STreehugger Robot static const char *name[StatCnt] = {}; 29*7c3d14c8STreehugger Robot name[StatMop] = "Memory accesses "; 30*7c3d14c8STreehugger Robot name[StatMopRead] = " Including reads "; 31*7c3d14c8STreehugger Robot name[StatMopWrite] = " writes "; 32*7c3d14c8STreehugger Robot name[StatMop1] = " Including size 1 "; 33*7c3d14c8STreehugger Robot name[StatMop2] = " size 2 "; 34*7c3d14c8STreehugger Robot name[StatMop4] = " size 4 "; 35*7c3d14c8STreehugger Robot name[StatMop8] = " size 8 "; 36*7c3d14c8STreehugger Robot name[StatMopSame] = " Including same "; 37*7c3d14c8STreehugger Robot name[StatMopIgnored] = " Including ignored "; 38*7c3d14c8STreehugger Robot name[StatMopRange] = " Including range "; 39*7c3d14c8STreehugger Robot name[StatMopRodata] = " Including .rodata "; 40*7c3d14c8STreehugger Robot name[StatMopRangeRodata] = " Including .rodata range "; 41*7c3d14c8STreehugger Robot name[StatShadowProcessed] = "Shadow processed "; 42*7c3d14c8STreehugger Robot name[StatShadowZero] = " Including empty "; 43*7c3d14c8STreehugger Robot name[StatShadowNonZero] = " Including non empty "; 44*7c3d14c8STreehugger Robot name[StatShadowSameSize] = " Including same size "; 45*7c3d14c8STreehugger Robot name[StatShadowIntersect] = " intersect "; 46*7c3d14c8STreehugger Robot name[StatShadowNotIntersect] = " not intersect "; 47*7c3d14c8STreehugger Robot name[StatShadowSameThread] = " Including same thread "; 48*7c3d14c8STreehugger Robot name[StatShadowAnotherThread] = " another thread "; 49*7c3d14c8STreehugger Robot name[StatShadowReplace] = " Including evicted "; 50*7c3d14c8STreehugger Robot 51*7c3d14c8STreehugger Robot name[StatFuncEnter] = "Function entries "; 52*7c3d14c8STreehugger Robot name[StatFuncExit] = "Function exits "; 53*7c3d14c8STreehugger Robot name[StatEvents] = "Events collected "; 54*7c3d14c8STreehugger Robot 55*7c3d14c8STreehugger Robot name[StatThreadCreate] = "Total threads created "; 56*7c3d14c8STreehugger Robot name[StatThreadFinish] = " threads finished "; 57*7c3d14c8STreehugger Robot name[StatThreadReuse] = " threads reused "; 58*7c3d14c8STreehugger Robot name[StatThreadMaxTid] = " max tid "; 59*7c3d14c8STreehugger Robot name[StatThreadMaxAlive] = " max alive threads "; 60*7c3d14c8STreehugger Robot 61*7c3d14c8STreehugger Robot name[StatMutexCreate] = "Mutexes created "; 62*7c3d14c8STreehugger Robot name[StatMutexDestroy] = " destroyed "; 63*7c3d14c8STreehugger Robot name[StatMutexLock] = " lock "; 64*7c3d14c8STreehugger Robot name[StatMutexUnlock] = " unlock "; 65*7c3d14c8STreehugger Robot name[StatMutexRecLock] = " recursive lock "; 66*7c3d14c8STreehugger Robot name[StatMutexRecUnlock] = " recursive unlock "; 67*7c3d14c8STreehugger Robot name[StatMutexReadLock] = " read lock "; 68*7c3d14c8STreehugger Robot name[StatMutexReadUnlock] = " read unlock "; 69*7c3d14c8STreehugger Robot 70*7c3d14c8STreehugger Robot name[StatSyncCreated] = "Sync objects created "; 71*7c3d14c8STreehugger Robot name[StatSyncDestroyed] = " destroyed "; 72*7c3d14c8STreehugger Robot name[StatSyncAcquire] = " acquired "; 73*7c3d14c8STreehugger Robot name[StatSyncRelease] = " released "; 74*7c3d14c8STreehugger Robot 75*7c3d14c8STreehugger Robot name[StatClockAcquire] = "Clock acquire "; 76*7c3d14c8STreehugger Robot name[StatClockAcquireEmpty] = " empty clock "; 77*7c3d14c8STreehugger Robot name[StatClockAcquireFastRelease] = " fast from release-store "; 78*7c3d14c8STreehugger Robot name[StatClockAcquireLarge] = " contains my tid "; 79*7c3d14c8STreehugger Robot name[StatClockAcquireRepeat] = " repeated (fast) "; 80*7c3d14c8STreehugger Robot name[StatClockAcquireFull] = " full (slow) "; 81*7c3d14c8STreehugger Robot name[StatClockAcquiredSomething] = " acquired something "; 82*7c3d14c8STreehugger Robot name[StatClockRelease] = "Clock release "; 83*7c3d14c8STreehugger Robot name[StatClockReleaseResize] = " resize "; 84*7c3d14c8STreehugger Robot name[StatClockReleaseFast1] = " fast1 "; 85*7c3d14c8STreehugger Robot name[StatClockReleaseFast2] = " fast2 "; 86*7c3d14c8STreehugger Robot name[StatClockReleaseSlow] = " dirty overflow (slow) "; 87*7c3d14c8STreehugger Robot name[StatClockReleaseFull] = " full (slow) "; 88*7c3d14c8STreehugger Robot name[StatClockReleaseAcquired] = " was acquired "; 89*7c3d14c8STreehugger Robot name[StatClockReleaseClearTail] = " clear tail "; 90*7c3d14c8STreehugger Robot name[StatClockStore] = "Clock release store "; 91*7c3d14c8STreehugger Robot name[StatClockStoreResize] = " resize "; 92*7c3d14c8STreehugger Robot name[StatClockStoreFast] = " fast "; 93*7c3d14c8STreehugger Robot name[StatClockStoreFull] = " slow "; 94*7c3d14c8STreehugger Robot name[StatClockStoreTail] = " clear tail "; 95*7c3d14c8STreehugger Robot name[StatClockAcquireRelease] = "Clock acquire-release "; 96*7c3d14c8STreehugger Robot 97*7c3d14c8STreehugger Robot name[StatAtomic] = "Atomic operations "; 98*7c3d14c8STreehugger Robot name[StatAtomicLoad] = " Including load "; 99*7c3d14c8STreehugger Robot name[StatAtomicStore] = " store "; 100*7c3d14c8STreehugger Robot name[StatAtomicExchange] = " exchange "; 101*7c3d14c8STreehugger Robot name[StatAtomicFetchAdd] = " fetch_add "; 102*7c3d14c8STreehugger Robot name[StatAtomicFetchSub] = " fetch_sub "; 103*7c3d14c8STreehugger Robot name[StatAtomicFetchAnd] = " fetch_and "; 104*7c3d14c8STreehugger Robot name[StatAtomicFetchOr] = " fetch_or "; 105*7c3d14c8STreehugger Robot name[StatAtomicFetchXor] = " fetch_xor "; 106*7c3d14c8STreehugger Robot name[StatAtomicFetchNand] = " fetch_nand "; 107*7c3d14c8STreehugger Robot name[StatAtomicCAS] = " compare_exchange "; 108*7c3d14c8STreehugger Robot name[StatAtomicFence] = " fence "; 109*7c3d14c8STreehugger Robot name[StatAtomicRelaxed] = " Including relaxed "; 110*7c3d14c8STreehugger Robot name[StatAtomicConsume] = " consume "; 111*7c3d14c8STreehugger Robot name[StatAtomicAcquire] = " acquire "; 112*7c3d14c8STreehugger Robot name[StatAtomicRelease] = " release "; 113*7c3d14c8STreehugger Robot name[StatAtomicAcq_Rel] = " acq_rel "; 114*7c3d14c8STreehugger Robot name[StatAtomicSeq_Cst] = " seq_cst "; 115*7c3d14c8STreehugger Robot name[StatAtomic1] = " Including size 1 "; 116*7c3d14c8STreehugger Robot name[StatAtomic2] = " size 2 "; 117*7c3d14c8STreehugger Robot name[StatAtomic4] = " size 4 "; 118*7c3d14c8STreehugger Robot name[StatAtomic8] = " size 8 "; 119*7c3d14c8STreehugger Robot name[StatAtomic16] = " size 16 "; 120*7c3d14c8STreehugger Robot 121*7c3d14c8STreehugger Robot name[StatAnnotation] = "Dynamic annotations "; 122*7c3d14c8STreehugger Robot name[StatAnnotateHappensBefore] = " HappensBefore "; 123*7c3d14c8STreehugger Robot name[StatAnnotateHappensAfter] = " HappensAfter "; 124*7c3d14c8STreehugger Robot name[StatAnnotateCondVarSignal] = " CondVarSignal "; 125*7c3d14c8STreehugger Robot name[StatAnnotateCondVarSignalAll] = " CondVarSignalAll "; 126*7c3d14c8STreehugger Robot name[StatAnnotateMutexIsNotPHB] = " MutexIsNotPHB "; 127*7c3d14c8STreehugger Robot name[StatAnnotateCondVarWait] = " CondVarWait "; 128*7c3d14c8STreehugger Robot name[StatAnnotateRWLockCreate] = " RWLockCreate "; 129*7c3d14c8STreehugger Robot name[StatAnnotateRWLockCreateStatic] = " StatAnnotateRWLockCreateStatic "; 130*7c3d14c8STreehugger Robot name[StatAnnotateRWLockDestroy] = " RWLockDestroy "; 131*7c3d14c8STreehugger Robot name[StatAnnotateRWLockAcquired] = " RWLockAcquired "; 132*7c3d14c8STreehugger Robot name[StatAnnotateRWLockReleased] = " RWLockReleased "; 133*7c3d14c8STreehugger Robot name[StatAnnotateTraceMemory] = " TraceMemory "; 134*7c3d14c8STreehugger Robot name[StatAnnotateFlushState] = " FlushState "; 135*7c3d14c8STreehugger Robot name[StatAnnotateNewMemory] = " NewMemory "; 136*7c3d14c8STreehugger Robot name[StatAnnotateNoOp] = " NoOp "; 137*7c3d14c8STreehugger Robot name[StatAnnotateFlushExpectedRaces] = " FlushExpectedRaces "; 138*7c3d14c8STreehugger Robot name[StatAnnotateEnableRaceDetection] = " EnableRaceDetection "; 139*7c3d14c8STreehugger Robot name[StatAnnotateMutexIsUsedAsCondVar] = " MutexIsUsedAsCondVar "; 140*7c3d14c8STreehugger Robot name[StatAnnotatePCQGet] = " PCQGet "; 141*7c3d14c8STreehugger Robot name[StatAnnotatePCQPut] = " PCQPut "; 142*7c3d14c8STreehugger Robot name[StatAnnotatePCQDestroy] = " PCQDestroy "; 143*7c3d14c8STreehugger Robot name[StatAnnotatePCQCreate] = " PCQCreate "; 144*7c3d14c8STreehugger Robot name[StatAnnotateExpectRace] = " ExpectRace "; 145*7c3d14c8STreehugger Robot name[StatAnnotateBenignRaceSized] = " BenignRaceSized "; 146*7c3d14c8STreehugger Robot name[StatAnnotateBenignRace] = " BenignRace "; 147*7c3d14c8STreehugger Robot name[StatAnnotateIgnoreReadsBegin] = " IgnoreReadsBegin "; 148*7c3d14c8STreehugger Robot name[StatAnnotateIgnoreReadsEnd] = " IgnoreReadsEnd "; 149*7c3d14c8STreehugger Robot name[StatAnnotateIgnoreWritesBegin] = " IgnoreWritesBegin "; 150*7c3d14c8STreehugger Robot name[StatAnnotateIgnoreWritesEnd] = " IgnoreWritesEnd "; 151*7c3d14c8STreehugger Robot name[StatAnnotateIgnoreSyncBegin] = " IgnoreSyncBegin "; 152*7c3d14c8STreehugger Robot name[StatAnnotateIgnoreSyncEnd] = " IgnoreSyncEnd "; 153*7c3d14c8STreehugger Robot name[StatAnnotatePublishMemoryRange] = " PublishMemoryRange "; 154*7c3d14c8STreehugger Robot name[StatAnnotateUnpublishMemoryRange] = " UnpublishMemoryRange "; 155*7c3d14c8STreehugger Robot name[StatAnnotateThreadName] = " ThreadName "; 156*7c3d14c8STreehugger Robot 157*7c3d14c8STreehugger Robot name[StatMtxTotal] = "Contentionz "; 158*7c3d14c8STreehugger Robot name[StatMtxTrace] = " Trace "; 159*7c3d14c8STreehugger Robot name[StatMtxThreads] = " Threads "; 160*7c3d14c8STreehugger Robot name[StatMtxReport] = " Report "; 161*7c3d14c8STreehugger Robot name[StatMtxSyncVar] = " SyncVar "; 162*7c3d14c8STreehugger Robot name[StatMtxSyncTab] = " SyncTab "; 163*7c3d14c8STreehugger Robot name[StatMtxSlab] = " Slab "; 164*7c3d14c8STreehugger Robot name[StatMtxAtExit] = " Atexit "; 165*7c3d14c8STreehugger Robot name[StatMtxAnnotations] = " Annotations "; 166*7c3d14c8STreehugger Robot name[StatMtxMBlock] = " MBlock "; 167*7c3d14c8STreehugger Robot name[StatMtxDeadlockDetector] = " DeadlockDetector "; 168*7c3d14c8STreehugger Robot name[StatMtxFired] = " FiredSuppressions "; 169*7c3d14c8STreehugger Robot name[StatMtxRacy] = " RacyStacks "; 170*7c3d14c8STreehugger Robot name[StatMtxFD] = " FD "; 171*7c3d14c8STreehugger Robot name[StatMtxGlobalProc] = " GlobalProc "; 172*7c3d14c8STreehugger Robot 173*7c3d14c8STreehugger Robot Printf("Statistics:\n"); 174*7c3d14c8STreehugger Robot for (int i = 0; i < StatCnt; i++) 175*7c3d14c8STreehugger Robot Printf("%s: %16zu\n", name[i], (uptr)stat[i]); 176*7c3d14c8STreehugger Robot } 177*7c3d14c8STreehugger Robot 178*7c3d14c8STreehugger Robot #endif 179*7c3d14c8STreehugger Robot 180*7c3d14c8STreehugger Robot } // namespace __tsan 181