1 //===-- tsan_stat.cc ------------------------------------------------------===//
3 // This file is distributed under the University of Illinois Open Source
4 // License. See LICENSE.TXT for details.
6 //===----------------------------------------------------------------------===//
8 // This file is a part of ThreadSanitizer (TSan), a race detector.
10 //===----------------------------------------------------------------------===//
11 #include "tsan_stat.h"
16 void StatAggregate(u64
*dst
, u64
*src
) {
19 for (int i
= 0; i
< StatCnt
; i
++)
23 void StatOutput(u64
*stat
) {
27 stat
[StatShadowNonZero
] = stat
[StatShadowProcessed
] - stat
[StatShadowZero
];
29 static const char *name
[StatCnt
] = {};
30 name
[StatMop
] = "Memory accesses ";
31 name
[StatMopRead
] = " Including reads ";
32 name
[StatMopWrite
] = " writes ";
33 name
[StatMop1
] = " Including size 1 ";
34 name
[StatMop2
] = " size 2 ";
35 name
[StatMop4
] = " size 4 ";
36 name
[StatMop8
] = " size 8 ";
37 name
[StatMopSame
] = " Including same ";
38 name
[StatMopRange
] = " Including range ";
39 name
[StatShadowProcessed
] = "Shadow processed ";
40 name
[StatShadowZero
] = " Including empty ";
41 name
[StatShadowNonZero
] = " Including non empty ";
42 name
[StatShadowSameSize
] = " Including same size ";
43 name
[StatShadowIntersect
] = " intersect ";
44 name
[StatShadowNotIntersect
] = " not intersect ";
45 name
[StatShadowSameThread
] = " Including same thread ";
46 name
[StatShadowAnotherThread
] = " another thread ";
47 name
[StatShadowReplace
] = " Including evicted ";
49 name
[StatFuncEnter
] = "Function entries ";
50 name
[StatFuncExit
] = "Function exits ";
51 name
[StatEvents
] = "Events collected ";
53 name
[StatThreadCreate
] = "Total threads created ";
54 name
[StatThreadFinish
] = " threads finished ";
55 name
[StatThreadReuse
] = " threads reused ";
56 name
[StatThreadMaxTid
] = " max tid ";
57 name
[StatThreadMaxAlive
] = " max alive threads ";
59 name
[StatMutexCreate
] = "Mutexes created ";
60 name
[StatMutexDestroy
] = " destroyed ";
61 name
[StatMutexLock
] = " lock ";
62 name
[StatMutexUnlock
] = " unlock ";
63 name
[StatMutexRecLock
] = " recursive lock ";
64 name
[StatMutexRecUnlock
] = " recursive unlock ";
65 name
[StatMutexReadLock
] = " read lock ";
66 name
[StatMutexReadUnlock
] = " read unlock ";
68 name
[StatSyncCreated
] = "Sync objects created ";
69 name
[StatSyncDestroyed
] = " destroyed ";
70 name
[StatSyncAcquire
] = " acquired ";
71 name
[StatSyncRelease
] = " released ";
73 name
[StatAtomic
] = "Atomic operations ";
74 name
[StatAtomicLoad
] = " Including load ";
75 name
[StatAtomicStore
] = " store ";
76 name
[StatAtomicExchange
] = " exchange ";
77 name
[StatAtomicFetchAdd
] = " fetch_add ";
78 name
[StatAtomicFetchSub
] = " fetch_sub ";
79 name
[StatAtomicFetchAnd
] = " fetch_and ";
80 name
[StatAtomicFetchOr
] = " fetch_or ";
81 name
[StatAtomicFetchXor
] = " fetch_xor ";
82 name
[StatAtomicFetchNand
] = " fetch_nand ";
83 name
[StatAtomicCAS
] = " compare_exchange ";
84 name
[StatAtomicFence
] = " fence ";
85 name
[StatAtomicRelaxed
] = " Including relaxed ";
86 name
[StatAtomicConsume
] = " consume ";
87 name
[StatAtomicAcquire
] = " acquire ";
88 name
[StatAtomicRelease
] = " release ";
89 name
[StatAtomicAcq_Rel
] = " acq_rel ";
90 name
[StatAtomicSeq_Cst
] = " seq_cst ";
91 name
[StatAtomic1
] = " Including size 1 ";
92 name
[StatAtomic2
] = " size 2 ";
93 name
[StatAtomic4
] = " size 4 ";
94 name
[StatAtomic8
] = " size 8 ";
95 name
[StatAtomic16
] = " size 16 ";
97 name
[StatInterceptor
] = "Interceptors ";
98 name
[StatInt_longjmp
] = " longjmp ";
99 name
[StatInt_siglongjmp
] = " siglongjmp ";
100 name
[StatInt_malloc
] = " malloc ";
101 name
[StatInt___libc_memalign
] = " __libc_memalign ";
102 name
[StatInt_calloc
] = " calloc ";
103 name
[StatInt_realloc
] = " realloc ";
104 name
[StatInt_free
] = " free ";
105 name
[StatInt_cfree
] = " cfree ";
106 name
[StatInt_mmap
] = " mmap ";
107 name
[StatInt_mmap64
] = " mmap64 ";
108 name
[StatInt_munmap
] = " munmap ";
109 name
[StatInt_memalign
] = " memalign ";
110 name
[StatInt_valloc
] = " valloc ";
111 name
[StatInt_pvalloc
] = " pvalloc ";
112 name
[StatInt_posix_memalign
] = " posix_memalign ";
113 name
[StatInt__Znwm
] = " _Znwm ";
114 name
[StatInt__ZnwmRKSt9nothrow_t
] = " _ZnwmRKSt9nothrow_t ";
115 name
[StatInt__Znam
] = " _Znam ";
116 name
[StatInt__ZnamRKSt9nothrow_t
] = " _ZnamRKSt9nothrow_t ";
117 name
[StatInt__ZdlPv
] = " _ZdlPv ";
118 name
[StatInt__ZdlPvRKSt9nothrow_t
] = " _ZdlPvRKSt9nothrow_t ";
119 name
[StatInt__ZdaPv
] = " _ZdaPv ";
120 name
[StatInt__ZdaPvRKSt9nothrow_t
] = " _ZdaPvRKSt9nothrow_t ";
121 name
[StatInt_strlen
] = " strlen ";
122 name
[StatInt_memset
] = " memset ";
123 name
[StatInt_memcpy
] = " memcpy ";
124 name
[StatInt_strcmp
] = " strcmp ";
125 name
[StatInt_memchr
] = " memchr ";
126 name
[StatInt_memrchr
] = " memrchr ";
127 name
[StatInt_memmove
] = " memmove ";
128 name
[StatInt_memcmp
] = " memcmp ";
129 name
[StatInt_strchr
] = " strchr ";
130 name
[StatInt_strchrnul
] = " strchrnul ";
131 name
[StatInt_strrchr
] = " strrchr ";
132 name
[StatInt_strncmp
] = " strncmp ";
133 name
[StatInt_strcpy
] = " strcpy ";
134 name
[StatInt_strncpy
] = " strncpy ";
135 name
[StatInt_strstr
] = " strstr ";
136 name
[StatInt_atexit
] = " atexit ";
137 name
[StatInt___cxa_guard_acquire
] = " __cxa_guard_acquire ";
138 name
[StatInt___cxa_guard_release
] = " __cxa_guard_release ";
139 name
[StatInt___cxa_guard_abort
] = " __cxa_guard_abort ";
140 name
[StatInt_pthread_create
] = " pthread_create ";
141 name
[StatInt_pthread_join
] = " pthread_join ";
142 name
[StatInt_pthread_detach
] = " pthread_detach ";
143 name
[StatInt_pthread_mutex_init
] = " pthread_mutex_init ";
144 name
[StatInt_pthread_mutex_destroy
] = " pthread_mutex_destroy ";
145 name
[StatInt_pthread_mutex_lock
] = " pthread_mutex_lock ";
146 name
[StatInt_pthread_mutex_trylock
] = " pthread_mutex_trylock ";
147 name
[StatInt_pthread_mutex_timedlock
] = " pthread_mutex_timedlock ";
148 name
[StatInt_pthread_mutex_unlock
] = " pthread_mutex_unlock ";
149 name
[StatInt_pthread_spin_init
] = " pthread_spin_init ";
150 name
[StatInt_pthread_spin_destroy
] = " pthread_spin_destroy ";
151 name
[StatInt_pthread_spin_lock
] = " pthread_spin_lock ";
152 name
[StatInt_pthread_spin_trylock
] = " pthread_spin_trylock ";
153 name
[StatInt_pthread_spin_unlock
] = " pthread_spin_unlock ";
154 name
[StatInt_pthread_rwlock_init
] = " pthread_rwlock_init ";
155 name
[StatInt_pthread_rwlock_destroy
] = " pthread_rwlock_destroy ";
156 name
[StatInt_pthread_rwlock_rdlock
] = " pthread_rwlock_rdlock ";
157 name
[StatInt_pthread_rwlock_tryrdlock
] = " pthread_rwlock_tryrdlock ";
158 name
[StatInt_pthread_rwlock_timedrdlock
]
159 = " pthread_rwlock_timedrdlock ";
160 name
[StatInt_pthread_rwlock_wrlock
] = " pthread_rwlock_wrlock ";
161 name
[StatInt_pthread_rwlock_trywrlock
] = " pthread_rwlock_trywrlock ";
162 name
[StatInt_pthread_rwlock_timedwrlock
]
163 = " pthread_rwlock_timedwrlock ";
164 name
[StatInt_pthread_rwlock_unlock
] = " pthread_rwlock_unlock ";
165 name
[StatInt_pthread_cond_init
] = " pthread_cond_init ";
166 name
[StatInt_pthread_cond_destroy
] = " pthread_cond_destroy ";
167 name
[StatInt_pthread_cond_signal
] = " pthread_cond_signal ";
168 name
[StatInt_pthread_cond_broadcast
] = " pthread_cond_broadcast ";
169 name
[StatInt_pthread_cond_wait
] = " pthread_cond_wait ";
170 name
[StatInt_pthread_cond_timedwait
] = " pthread_cond_timedwait ";
171 name
[StatInt_pthread_barrier_init
] = " pthread_barrier_init ";
172 name
[StatInt_pthread_barrier_destroy
] = " pthread_barrier_destroy ";
173 name
[StatInt_pthread_barrier_wait
] = " pthread_barrier_wait ";
174 name
[StatInt_pthread_once
] = " pthread_once ";
175 name
[StatInt_sem_init
] = " sem_init ";
176 name
[StatInt_sem_destroy
] = " sem_destroy ";
177 name
[StatInt_sem_wait
] = " sem_wait ";
178 name
[StatInt_sem_trywait
] = " sem_trywait ";
179 name
[StatInt_sem_timedwait
] = " sem_timedwait ";
180 name
[StatInt_sem_post
] = " sem_post ";
181 name
[StatInt_sem_getvalue
] = " sem_getvalue ";
182 name
[StatInt_read
] = " read ";
183 name
[StatInt_pread
] = " pread ";
184 name
[StatInt_pread64
] = " pread64 ";
185 name
[StatInt_readv
] = " readv ";
186 name
[StatInt_preadv64
] = " preadv64 ";
187 name
[StatInt_write
] = " write ";
188 name
[StatInt_pwrite
] = " pwrite ";
189 name
[StatInt_pwrite64
] = " pwrite64 ";
190 name
[StatInt_writev
] = " writev ";
191 name
[StatInt_pwritev64
] = " pwritev64 ";
192 name
[StatInt_send
] = " send ";
193 name
[StatInt_sendmsg
] = " sendmsg ";
194 name
[StatInt_recv
] = " recv ";
195 name
[StatInt_recvmsg
] = " recvmsg ";
196 name
[StatInt_unlink
] = " unlink ";
197 name
[StatInt_fopen
] = " fopen ";
198 name
[StatInt_fread
] = " fread ";
199 name
[StatInt_fwrite
] = " fwrite ";
200 name
[StatInt_puts
] = " puts ";
201 name
[StatInt_rmdir
] = " rmdir ";
202 name
[StatInt_opendir
] = " opendir ";
203 name
[StatInt_epoll_ctl
] = " epoll_ctl ";
204 name
[StatInt_epoll_wait
] = " epoll_wait ";
205 name
[StatInt_poll
] = " poll ";
206 name
[StatInt_sigaction
] = " sigaction ";
207 name
[StatInt_sleep
] = " sleep ";
208 name
[StatInt_usleep
] = " usleep ";
209 name
[StatInt_nanosleep
] = " nanosleep ";
210 name
[StatInt_gettimeofday
] = " gettimeofday ";
212 name
[StatAnnotation
] = "Dynamic annotations ";
213 name
[StatAnnotateHappensBefore
] = " HappensBefore ";
214 name
[StatAnnotateHappensAfter
] = " HappensAfter ";
215 name
[StatAnnotateCondVarSignal
] = " CondVarSignal ";
216 name
[StatAnnotateCondVarSignalAll
] = " CondVarSignalAll ";
217 name
[StatAnnotateMutexIsNotPHB
] = " MutexIsNotPHB ";
218 name
[StatAnnotateCondVarWait
] = " CondVarWait ";
219 name
[StatAnnotateRWLockCreate
] = " RWLockCreate ";
220 name
[StatAnnotateRWLockDestroy
] = " RWLockDestroy ";
221 name
[StatAnnotateRWLockAcquired
] = " RWLockAcquired ";
222 name
[StatAnnotateRWLockReleased
] = " RWLockReleased ";
223 name
[StatAnnotateTraceMemory
] = " TraceMemory ";
224 name
[StatAnnotateFlushState
] = " FlushState ";
225 name
[StatAnnotateNewMemory
] = " NewMemory ";
226 name
[StatAnnotateNoOp
] = " NoOp ";
227 name
[StatAnnotateFlushExpectedRaces
] = " FlushExpectedRaces ";
228 name
[StatAnnotateEnableRaceDetection
] = " EnableRaceDetection ";
229 name
[StatAnnotateMutexIsUsedAsCondVar
] = " MutexIsUsedAsCondVar ";
230 name
[StatAnnotatePCQGet
] = " PCQGet ";
231 name
[StatAnnotatePCQPut
] = " PCQPut ";
232 name
[StatAnnotatePCQDestroy
] = " PCQDestroy ";
233 name
[StatAnnotatePCQCreate
] = " PCQCreate ";
234 name
[StatAnnotateExpectRace
] = " ExpectRace ";
235 name
[StatAnnotateBenignRaceSized
] = " BenignRaceSized ";
236 name
[StatAnnotateBenignRace
] = " BenignRace ";
237 name
[StatAnnotateIgnoreReadsBegin
] = " IgnoreReadsBegin ";
238 name
[StatAnnotateIgnoreReadsEnd
] = " IgnoreReadsEnd ";
239 name
[StatAnnotateIgnoreWritesBegin
] = " IgnoreWritesBegin ";
240 name
[StatAnnotateIgnoreWritesEnd
] = " IgnoreWritesEnd ";
241 name
[StatAnnotatePublishMemoryRange
] = " PublishMemoryRange ";
242 name
[StatAnnotateUnpublishMemoryRange
] = " UnpublishMemoryRange ";
243 name
[StatAnnotateThreadName
] = " ThreadName ";
245 name
[StatMtxTotal
] = "Contentionz ";
246 name
[StatMtxTrace
] = " Trace ";
247 name
[StatMtxThreads
] = " Threads ";
248 name
[StatMtxReport
] = " Report ";
249 name
[StatMtxSyncVar
] = " SyncVar ";
250 name
[StatMtxSyncTab
] = " SyncTab ";
251 name
[StatMtxSlab
] = " Slab ";
252 name
[StatMtxAtExit
] = " Atexit ";
253 name
[StatMtxAnnotations
] = " Annotations ";
255 Printf("Statistics:\n");
256 for (int i
= 0; i
< StatCnt
; i
++)
257 Printf("%s: %zu\n", name
[i
], (uptr
)stat
[i
]);
260 } // namespace __tsan