xref: /aosp_15_r20/external/compiler-rt/lib/tsan/rtl/tsan_stat.cc (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
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 Robot void 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 Robot void 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