tsan_stat.cc 11 KB

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