| Absolute File Name: | /home/qt/qt5_coco/qt5/qtbase/src/testlib/qbenchmarkperfevents.cpp | 
| Switch to Source code | Preprocessed file | 
| Line | Source | Count | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | - | |||||||||||||||||||
| 2 | - | |||||||||||||||||||
| 3 | - | |||||||||||||||||||
| 4 | - | |||||||||||||||||||
| 5 | - | |||||||||||||||||||
| 6 | - | |||||||||||||||||||
| 7 | - | |||||||||||||||||||
| 8 | - | |||||||||||||||||||
| 9 | - | |||||||||||||||||||
| 10 | - | |||||||||||||||||||
| 11 | - | |||||||||||||||||||
| 12 | - | |||||||||||||||||||
| 13 | - | |||||||||||||||||||
| 14 | - | |||||||||||||||||||
| 15 | - | |||||||||||||||||||
| 16 | static perf_event_attr attr; | - | ||||||||||||||||||
| 17 | - | |||||||||||||||||||
| 18 | static void initPerf() | - | ||||||||||||||||||
| 19 | { | - | ||||||||||||||||||
| 20 | static bool done; | - | ||||||||||||||||||
| 21 | if (!done 
 | 0 | ||||||||||||||||||
| 22 | memset(&attr, 0, sizeof attr); | - | ||||||||||||||||||
| 23 | attr.size = sizeof attr; | - | ||||||||||||||||||
| 24 | attr.read_format = PERF_FORMAT_TOTAL_TIME_ENABLED | PERF_FORMAT_TOTAL_TIME_RUNNING; | - | ||||||||||||||||||
| 25 | attr.disabled = true; | - | ||||||||||||||||||
| 26 | attr.inherit = true; | - | ||||||||||||||||||
| 27 | attr.pinned = true; | - | ||||||||||||||||||
| 28 | attr.inherit_stat = true; | - | ||||||||||||||||||
| 29 | attr.task = true; | - | ||||||||||||||||||
| 30 | - | |||||||||||||||||||
| 31 | - | |||||||||||||||||||
| 32 | attr.type = PERF_TYPE_HARDWARE; | - | ||||||||||||||||||
| 33 | attr.config = PERF_COUNT_HW_CPU_CYCLES; | - | ||||||||||||||||||
| 34 | - | |||||||||||||||||||
| 35 | done = true; | - | ||||||||||||||||||
| 36 | } never executed:  end of block | 0 | ||||||||||||||||||
| 37 | } never executed:  end of block | 0 | ||||||||||||||||||
| 38 | static int perf_event_open(perf_event_attr *attr, pid_t pid, int cpu, int group_fd, unsigned long flags) | - | ||||||||||||||||||
| 39 | { | - | ||||||||||||||||||
| 40 | - | |||||||||||||||||||
| 41 | return never executed: syscall(298, attr, pid, cpu, group_fd, flags); return syscall(298, attr, pid, cpu, group_fd, flags);never executed:  return syscall(298, attr, pid, cpu, group_fd, flags); | 0 | ||||||||||||||||||
| 42 | } | - | ||||||||||||||||||
| 43 | - | |||||||||||||||||||
| 44 | bool QBenchmarkPerfEventsMeasurer::isAvailable() | - | ||||||||||||||||||
| 45 | { | - | ||||||||||||||||||
| 46 | - | |||||||||||||||||||
| 47 | - | |||||||||||||||||||
| 48 | return never executed: perf_event_open(0, 0, 0, 0, 0) == -1 return perf_event_open(0, 0, 0, 0, 0) == -1 && (*__errno_location ()) != 38;
 
 
 never executed:  return perf_event_open(0, 0, 0, 0, 0) == -1 && (*__errno_location ()) != 38; | 0 | ||||||||||||||||||
| 49 | } | - | ||||||||||||||||||
| 50 | struct Events { | - | ||||||||||||||||||
| 51 | unsigned offset; | - | ||||||||||||||||||
| 52 | quint32 type; | - | ||||||||||||||||||
| 53 | quint64 event_id; | - | ||||||||||||||||||
| 54 | QTest::QBenchmarkMetric metric; | - | ||||||||||||||||||
| 55 | }; | - | ||||||||||||||||||
| 56 | - | |||||||||||||||||||
| 57 | - | |||||||||||||||||||
| 58 | static const char eventlist_strings[] = | - | ||||||||||||||||||
| 59 | "alignment-faults\0" | - | ||||||||||||||||||
| 60 | "branch-instructions\0" | - | ||||||||||||||||||
| 61 | "branch-load-misses\0" | - | ||||||||||||||||||
| 62 | "branch-loads\0" | - | ||||||||||||||||||
| 63 | "branch-mispredicts\0" | - | ||||||||||||||||||
| 64 | "branch-misses\0" | - | ||||||||||||||||||
| 65 | "branch-predicts\0" | - | ||||||||||||||||||
| 66 | "branch-read-misses\0" | - | ||||||||||||||||||
| 67 | "branch-reads\0" | - | ||||||||||||||||||
| 68 | "branches\0" | - | ||||||||||||||||||
| 69 | "bus-cycles\0" | - | ||||||||||||||||||
| 70 | "cache-misses\0" | - | ||||||||||||||||||
| 71 | "cache-references\0" | - | ||||||||||||||||||
| 72 | "context-switches\0" | - | ||||||||||||||||||
| 73 | "cpu-clock\0" | - | ||||||||||||||||||
| 74 | "cpu-cycles\0" | - | ||||||||||||||||||
| 75 | "cpu-migrations\0" | - | ||||||||||||||||||
| 76 | "cs\0" | - | ||||||||||||||||||
| 77 | "cycles\0" | - | ||||||||||||||||||
| 78 | "emulation-faults\0" | - | ||||||||||||||||||
| 79 | "faults\0" | - | ||||||||||||||||||
| 80 | "idle-cycles-backend\0" | - | ||||||||||||||||||
| 81 | "idle-cycles-frontend\0" | - | ||||||||||||||||||
| 82 | "instructions\0" | - | ||||||||||||||||||
| 83 | "l1d-cache-load-misses\0" | - | ||||||||||||||||||
| 84 | "l1d-cache-loads\0" | - | ||||||||||||||||||
| 85 | "l1d-cache-prefetch-misses\0" | - | ||||||||||||||||||
| 86 | "l1d-cache-prefetches\0" | - | ||||||||||||||||||
| 87 | "l1d-cache-read-misses\0" | - | ||||||||||||||||||
| 88 | "l1d-cache-reads\0" | - | ||||||||||||||||||
| 89 | "l1d-cache-store-misses\0" | - | ||||||||||||||||||
| 90 | "l1d-cache-stores\0" | - | ||||||||||||||||||
| 91 | "l1d-cache-write-misses\0" | - | ||||||||||||||||||
| 92 | "l1d-cache-writes\0" | - | ||||||||||||||||||
| 93 | "l1d-load-misses\0" | - | ||||||||||||||||||
| 94 | "l1d-loads\0" | - | ||||||||||||||||||
| 95 | "l1d-prefetch-misses\0" | - | ||||||||||||||||||
| 96 | "l1d-prefetches\0" | - | ||||||||||||||||||
| 97 | "l1d-read-misses\0" | - | ||||||||||||||||||
| 98 | "l1d-reads\0" | - | ||||||||||||||||||
| 99 | "l1d-store-misses\0" | - | ||||||||||||||||||
| 100 | "l1d-stores\0" | - | ||||||||||||||||||
| 101 | "l1d-write-misses\0" | - | ||||||||||||||||||
| 102 | "l1d-writes\0" | - | ||||||||||||||||||
| 103 | "l1i-cache-load-misses\0" | - | ||||||||||||||||||
| 104 | "l1i-cache-loads\0" | - | ||||||||||||||||||
| 105 | "l1i-cache-prefetch-misses\0" | - | ||||||||||||||||||
| 106 | "l1i-cache-prefetches\0" | - | ||||||||||||||||||
| 107 | "l1i-cache-read-misses\0" | - | ||||||||||||||||||
| 108 | "l1i-cache-reads\0" | - | ||||||||||||||||||
| 109 | "l1i-load-misses\0" | - | ||||||||||||||||||
| 110 | "l1i-loads\0" | - | ||||||||||||||||||
| 111 | "l1i-prefetch-misses\0" | - | ||||||||||||||||||
| 112 | "l1i-prefetches\0" | - | ||||||||||||||||||
| 113 | "l1i-read-misses\0" | - | ||||||||||||||||||
| 114 | "l1i-reads\0" | - | ||||||||||||||||||
| 115 | "llc-cache-load-misses\0" | - | ||||||||||||||||||
| 116 | "llc-cache-loads\0" | - | ||||||||||||||||||
| 117 | "llc-cache-prefetch-misses\0" | - | ||||||||||||||||||
| 118 | "llc-cache-prefetches\0" | - | ||||||||||||||||||
| 119 | "llc-cache-read-misses\0" | - | ||||||||||||||||||
| 120 | "llc-cache-reads\0" | - | ||||||||||||||||||
| 121 | "llc-cache-store-misses\0" | - | ||||||||||||||||||
| 122 | "llc-cache-stores\0" | - | ||||||||||||||||||
| 123 | "llc-cache-write-misses\0" | - | ||||||||||||||||||
| 124 | "llc-cache-writes\0" | - | ||||||||||||||||||
| 125 | "llc-load-misses\0" | - | ||||||||||||||||||
| 126 | "llc-loads\0" | - | ||||||||||||||||||
| 127 | "llc-prefetch-misses\0" | - | ||||||||||||||||||
| 128 | "llc-prefetches\0" | - | ||||||||||||||||||
| 129 | "llc-read-misses\0" | - | ||||||||||||||||||
| 130 | "llc-reads\0" | - | ||||||||||||||||||
| 131 | "llc-store-misses\0" | - | ||||||||||||||||||
| 132 | "llc-stores\0" | - | ||||||||||||||||||
| 133 | "llc-write-misses\0" | - | ||||||||||||||||||
| 134 | "llc-writes\0" | - | ||||||||||||||||||
| 135 | "major-faults\0" | - | ||||||||||||||||||
| 136 | "migrations\0" | - | ||||||||||||||||||
| 137 | "minor-faults\0" | - | ||||||||||||||||||
| 138 | "page-faults\0" | - | ||||||||||||||||||
| 139 | "stalled-cycles-backend\0" | - | ||||||||||||||||||
| 140 | "stalled-cycles-frontend\0" | - | ||||||||||||||||||
| 141 | "task-clock\0" | - | ||||||||||||||||||
| 142 | "\0"; | - | ||||||||||||||||||
| 143 | - | |||||||||||||||||||
| 144 | static const Events eventlist[] = { | - | ||||||||||||||||||
| 145 | { 0, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_ALIGNMENT_FAULTS, QTest::AlignmentFaults }, | - | ||||||||||||||||||
| 146 | { 17, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_INSTRUCTIONS, QTest::BranchInstructions }, | - | ||||||||||||||||||
| 147 | { 37, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_BPU | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::BranchMisses }, | - | ||||||||||||||||||
| 148 | { 56, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_BPU | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::BranchInstructions }, | - | ||||||||||||||||||
| 149 | { 69, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_BPU | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::BranchMisses }, | - | ||||||||||||||||||
| 150 | { 88, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_MISSES, QTest::BranchMisses }, | - | ||||||||||||||||||
| 151 | { 102, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_BPU | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::BranchInstructions }, | - | ||||||||||||||||||
| 152 | { 118, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_BPU | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::BranchMisses }, | - | ||||||||||||||||||
| 153 | { 137, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_BPU | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::BranchInstructions }, | - | ||||||||||||||||||
| 154 | { 150, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BRANCH_INSTRUCTIONS, QTest::BranchInstructions }, | - | ||||||||||||||||||
| 155 | { 159, PERF_TYPE_HARDWARE, PERF_COUNT_HW_BUS_CYCLES, QTest::BusCycles }, | - | ||||||||||||||||||
| 156 | { 170, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_MISSES, QTest::CacheMisses }, | - | ||||||||||||||||||
| 157 | { 183, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CACHE_REFERENCES, QTest::CacheReferences }, | - | ||||||||||||||||||
| 158 | { 200, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CONTEXT_SWITCHES, QTest::ContextSwitches }, | - | ||||||||||||||||||
| 159 | { 217, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_CLOCK, QTest::WalltimeMilliseconds }, | - | ||||||||||||||||||
| 160 | { 227, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES, QTest::CPUCycles }, | - | ||||||||||||||||||
| 161 | { 238, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_MIGRATIONS, QTest::CPUMigrations }, | - | ||||||||||||||||||
| 162 | { 253, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CONTEXT_SWITCHES, QTest::ContextSwitches }, | - | ||||||||||||||||||
| 163 | { 256, PERF_TYPE_HARDWARE, PERF_COUNT_HW_CPU_CYCLES, QTest::CPUCycles }, | - | ||||||||||||||||||
| 164 | { 263, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS, QTest::EmulationFaults }, | - | ||||||||||||||||||
| 165 | { 280, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS, QTest::PageFaults }, | - | ||||||||||||||||||
| 166 | { 287, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_BACKEND, QTest::StalledCycles }, | - | ||||||||||||||||||
| 167 | { 307, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND, QTest::StalledCycles }, | - | ||||||||||||||||||
| 168 | { 328, PERF_TYPE_HARDWARE, PERF_COUNT_HW_INSTRUCTIONS, QTest::Instructions }, | - | ||||||||||||||||||
| 169 | { 341, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1D | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CacheReads }, | - | ||||||||||||||||||
| 170 | { 363, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1D | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CacheReads }, | - | ||||||||||||||||||
| 171 | { 379, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1D | PERF_COUNT_HW_CACHE_OP_PREFETCH << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CachePrefetches }, | - | ||||||||||||||||||
| 172 | { 405, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1D | PERF_COUNT_HW_CACHE_OP_PREFETCH << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CachePrefetches }, | - | ||||||||||||||||||
| 173 | { 426, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1D | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CacheReads }, | - | ||||||||||||||||||
| 174 | { 448, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1D | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CacheReads }, | - | ||||||||||||||||||
| 175 | { 464, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1D | PERF_COUNT_HW_CACHE_OP_WRITE << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CacheWrites }, | - | ||||||||||||||||||
| 176 | { 487, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1D | PERF_COUNT_HW_CACHE_OP_WRITE << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CacheWrites }, | - | ||||||||||||||||||
| 177 | { 504, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1D | PERF_COUNT_HW_CACHE_OP_WRITE << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CacheWrites }, | - | ||||||||||||||||||
| 178 | { 527, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1D | PERF_COUNT_HW_CACHE_OP_WRITE << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CacheWrites }, | - | ||||||||||||||||||
| 179 | { 544, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1D | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CacheReads }, | - | ||||||||||||||||||
| 180 | { 560, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1D | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CacheReads }, | - | ||||||||||||||||||
| 181 | { 570, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1D | PERF_COUNT_HW_CACHE_OP_PREFETCH << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CachePrefetches }, | - | ||||||||||||||||||
| 182 | { 590, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1D | PERF_COUNT_HW_CACHE_OP_PREFETCH << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CachePrefetches }, | - | ||||||||||||||||||
| 183 | { 605, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1D | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CacheReads }, | - | ||||||||||||||||||
| 184 | { 621, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1D | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CacheReads }, | - | ||||||||||||||||||
| 185 | { 631, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1D | PERF_COUNT_HW_CACHE_OP_WRITE << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CacheWrites }, | - | ||||||||||||||||||
| 186 | { 648, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1D | PERF_COUNT_HW_CACHE_OP_WRITE << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CacheWrites }, | - | ||||||||||||||||||
| 187 | { 659, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1D | PERF_COUNT_HW_CACHE_OP_WRITE << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CacheWrites }, | - | ||||||||||||||||||
| 188 | { 676, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1D | PERF_COUNT_HW_CACHE_OP_WRITE << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CacheWrites }, | - | ||||||||||||||||||
| 189 | { 687, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1I | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CacheReads }, | - | ||||||||||||||||||
| 190 | { 709, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1I | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CacheReads }, | - | ||||||||||||||||||
| 191 | { 725, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1I | PERF_COUNT_HW_CACHE_OP_PREFETCH << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CachePrefetches }, | - | ||||||||||||||||||
| 192 | { 751, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1I | PERF_COUNT_HW_CACHE_OP_PREFETCH << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CachePrefetches }, | - | ||||||||||||||||||
| 193 | { 772, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1I | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CacheReads }, | - | ||||||||||||||||||
| 194 | { 794, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1I | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CacheReads }, | - | ||||||||||||||||||
| 195 | { 810, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1I | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CacheReads }, | - | ||||||||||||||||||
| 196 | { 826, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1I | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CacheReads }, | - | ||||||||||||||||||
| 197 | { 836, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1I | PERF_COUNT_HW_CACHE_OP_PREFETCH << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CachePrefetches }, | - | ||||||||||||||||||
| 198 | { 856, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1I | PERF_COUNT_HW_CACHE_OP_PREFETCH << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CachePrefetches }, | - | ||||||||||||||||||
| 199 | { 871, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1I | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CacheReads }, | - | ||||||||||||||||||
| 200 | { 887, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_L1I | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CacheReads }, | - | ||||||||||||||||||
| 201 | { 897, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_LL | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CacheReads }, | - | ||||||||||||||||||
| 202 | { 919, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_LL | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CacheReads }, | - | ||||||||||||||||||
| 203 | { 935, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_LL | PERF_COUNT_HW_CACHE_OP_PREFETCH << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CachePrefetches }, | - | ||||||||||||||||||
| 204 | { 961, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_LL | PERF_COUNT_HW_CACHE_OP_PREFETCH << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CachePrefetches }, | - | ||||||||||||||||||
| 205 | { 982, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_LL | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CacheReads }, | - | ||||||||||||||||||
| 206 | { 1004, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_LL | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CacheReads }, | - | ||||||||||||||||||
| 207 | { 1020, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_LL | PERF_COUNT_HW_CACHE_OP_WRITE << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CacheWrites }, | - | ||||||||||||||||||
| 208 | { 1043, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_LL | PERF_COUNT_HW_CACHE_OP_WRITE << 8| PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CacheWrites }, | - | ||||||||||||||||||
| 209 | { 1060, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_LL | PERF_COUNT_HW_CACHE_OP_WRITE << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CacheWrites }, | - | ||||||||||||||||||
| 210 | { 1083, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_LL | PERF_COUNT_HW_CACHE_OP_WRITE << 8| PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CacheWrites }, | - | ||||||||||||||||||
| 211 | { 1100, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_LL | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CacheReads }, | - | ||||||||||||||||||
| 212 | { 1116, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_LL | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CacheReads }, | - | ||||||||||||||||||
| 213 | { 1126, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_LL | PERF_COUNT_HW_CACHE_OP_PREFETCH << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CachePrefetches }, | - | ||||||||||||||||||
| 214 | { 1146, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_LL | PERF_COUNT_HW_CACHE_OP_PREFETCH << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CachePrefetches }, | - | ||||||||||||||||||
| 215 | { 1161, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_LL | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CacheReads }, | - | ||||||||||||||||||
| 216 | { 1177, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_LL | PERF_COUNT_HW_CACHE_OP_READ << 8 | PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CacheReads }, | - | ||||||||||||||||||
| 217 | { 1187, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_LL | PERF_COUNT_HW_CACHE_OP_WRITE << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CacheWrites }, | - | ||||||||||||||||||
| 218 | { 1204, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_LL | PERF_COUNT_HW_CACHE_OP_WRITE << 8| PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CacheWrites }, | - | ||||||||||||||||||
| 219 | { 1215, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_LL | PERF_COUNT_HW_CACHE_OP_WRITE << 8 | PERF_COUNT_HW_CACHE_RESULT_MISS << 16), QTest::CacheWrites }, | - | ||||||||||||||||||
| 220 | { 1232, PERF_TYPE_HW_CACHE, (PERF_COUNT_HW_CACHE_LL | PERF_COUNT_HW_CACHE_OP_WRITE << 8| PERF_COUNT_HW_CACHE_RESULT_ACCESS << 16), QTest::CacheWrites }, | - | ||||||||||||||||||
| 221 | { 1243, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MAJ, QTest::MajorPageFaults }, | - | ||||||||||||||||||
| 222 | { 1256, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_CPU_MIGRATIONS, QTest::CPUMigrations }, | - | ||||||||||||||||||
| 223 | { 1267, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS_MIN, QTest::MinorPageFaults }, | - | ||||||||||||||||||
| 224 | { 1280, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_PAGE_FAULTS, QTest::PageFaults }, | - | ||||||||||||||||||
| 225 | { 1292, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_BACKEND, QTest::StalledCycles }, | - | ||||||||||||||||||
| 226 | { 1315, PERF_TYPE_HARDWARE, PERF_COUNT_HW_STALLED_CYCLES_FRONTEND, QTest::StalledCycles }, | - | ||||||||||||||||||
| 227 | { 1339, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_TASK_CLOCK, QTest::WalltimeMilliseconds }, | - | ||||||||||||||||||
| 228 | { 0, PERF_TYPE_MAX, 0, QTest::Events } | - | ||||||||||||||||||
| 229 | }; | - | ||||||||||||||||||
| 230 | - | |||||||||||||||||||
| 231 | - | |||||||||||||||||||
| 232 | QTest::QBenchmarkMetric QBenchmarkPerfEventsMeasurer::metricForEvent(quint32 type, quint64 event_id) | - | ||||||||||||||||||
| 233 | { | - | ||||||||||||||||||
| 234 | const Events *ptr = eventlist; | - | ||||||||||||||||||
| 235 | for ( ; ptr->type != PERF_TYPE_MAX 
 | 0 | ||||||||||||||||||
| 236 | if (ptr->type == type 
 
 | 0 | ||||||||||||||||||
| 237 | return never executed: ptr->metric; return ptr->metric;never executed:  return ptr->metric; | 0 | ||||||||||||||||||
| 238 | } never executed:  end of block | 0 | ||||||||||||||||||
| 239 | return never executed: QTest::Events; return QTest::Events;never executed:  return QTest::Events; | 0 | ||||||||||||||||||
| 240 | } | - | ||||||||||||||||||
| 241 | - | |||||||||||||||||||
| 242 | void QBenchmarkPerfEventsMeasurer::setCounter(const char *name) | - | ||||||||||||||||||
| 243 | { | - | ||||||||||||||||||
| 244 | initPerf(); | - | ||||||||||||||||||
| 245 | const char *colon = strchr(name, ':'); | - | ||||||||||||||||||
| 246 | int n = colon 
 | 0 | ||||||||||||||||||
| 247 | const Events *ptr = eventlist; | - | ||||||||||||||||||
| 248 | for ( ; ptr->type != PERF_TYPE_MAX 
 | 0 | ||||||||||||||||||
| 249 | int c = strncmp(name, eventlist_strings + ptr->offset, n); | - | ||||||||||||||||||
| 250 | if (c == 0 
 | 0 | ||||||||||||||||||
| 251 | break; never executed:  break; | 0 | ||||||||||||||||||
| 252 | if (c < 0 
 | 0 | ||||||||||||||||||
| 253 | fprintf(stderr, "ERROR: Performance counter type '%s' is unknown\n", name); | - | ||||||||||||||||||
| 254 | exit(1); never executed:  exit(1); | 0 | ||||||||||||||||||
| 255 | } | - | ||||||||||||||||||
| 256 | } never executed:  end of block | 0 | ||||||||||||||||||
| 257 | - | |||||||||||||||||||
| 258 | attr.type = ptr->type; | - | ||||||||||||||||||
| 259 | attr.config = ptr->event_id; | - | ||||||||||||||||||
| 260 | - | |||||||||||||||||||
| 261 | - | |||||||||||||||||||
| 262 | if (!colon 
 | 0 | ||||||||||||||||||
| 263 | return; never executed:  return; | 0 | ||||||||||||||||||
| 264 | while (*++ 
 
 | 0 | ||||||||||||||||||
| 265 | switch (*colon) { | - | ||||||||||||||||||
| 266 | case never executed: 'u': case 'u':never executed:  case 'u': | 0 | ||||||||||||||||||
| 267 | attr.exclude_user = true; | - | ||||||||||||||||||
| 268 | break; never executed:  break; | 0 | ||||||||||||||||||
| 269 | case never executed: 'k': case 'k':never executed:  case 'k': | 0 | ||||||||||||||||||
| 270 | attr.exclude_kernel = true; | - | ||||||||||||||||||
| 271 | break; never executed:  break; | 0 | ||||||||||||||||||
| 272 | case never executed: 'h': case 'h':never executed:  case 'h': | 0 | ||||||||||||||||||
| 273 | attr.exclude_hv = true; | - | ||||||||||||||||||
| 274 | break; never executed:  break; | 0 | ||||||||||||||||||
| 275 | case never executed: 'G': case 'G':never executed:  case 'G': | 0 | ||||||||||||||||||
| 276 | attr.exclude_guest = true; | - | ||||||||||||||||||
| 277 | break; never executed:  break; | 0 | ||||||||||||||||||
| 278 | case never executed: 'H': case 'H':never executed:  case 'H': | 0 | ||||||||||||||||||
| 279 | attr.exclude_host = true; | - | ||||||||||||||||||
| 280 | break; never executed:  break; | 0 | ||||||||||||||||||
| 281 | default never executed: : default:never executed:  default: | 0 | ||||||||||||||||||
| 282 | fprintf(stderr, "ERROR: Unknown attribute '%c'\n", *colon); | - | ||||||||||||||||||
| 283 | exit(1); never executed:  exit(1); | 0 | ||||||||||||||||||
| 284 | } | - | ||||||||||||||||||
| 285 | } | - | ||||||||||||||||||
| 286 | } never executed:  end of block | 0 | ||||||||||||||||||
| 287 | - | |||||||||||||||||||
| 288 | void QBenchmarkPerfEventsMeasurer::listCounters() | - | ||||||||||||||||||
| 289 | { | - | ||||||||||||||||||
| 290 | if (!isAvailable() 
 | 0 | ||||||||||||||||||
| 291 | printf("Performance counters are not available on this system\n"); | - | ||||||||||||||||||
| 292 | return; never executed:  return; | 0 | ||||||||||||||||||
| 293 | } | - | ||||||||||||||||||
| 294 | - | |||||||||||||||||||
| 295 | printf("The following performance counters are available:\n"); | - | ||||||||||||||||||
| 296 | const Events *ptr = eventlist; | - | ||||||||||||||||||
| 297 | for ( ; ptr->type != PERF_TYPE_MAX 
 | 0 | ||||||||||||||||||
| 298 | printf(" %-30s [%s]\n", eventlist_strings + ptr->offset, | - | ||||||||||||||||||
| 299 | ptr->type == PERF_TYPE_HARDWARE ? "hardware" : | - | ||||||||||||||||||
| 300 | ptr->type == PERF_TYPE_SOFTWARE ? "software" : | - | ||||||||||||||||||
| 301 | ptr->type == PERF_TYPE_HW_CACHE ? "cache" : "other"); | - | ||||||||||||||||||
| 302 | } never executed:  end of block | 0 | ||||||||||||||||||
| 303 | - | |||||||||||||||||||
| 304 | printf("\nAttributes can be specified by adding a colon and the following:\n" | - | ||||||||||||||||||
| 305 | " u - exclude measuring in the userspace\n" | - | ||||||||||||||||||
| 306 | " k - exclude measuring in kernel mode\n" | - | ||||||||||||||||||
| 307 | " h - exclude measuring in the hypervisor\n" | - | ||||||||||||||||||
| 308 | " G - exclude measuring when running virtualized (guest VM)\n" | - | ||||||||||||||||||
| 309 | " H - exclude measuring when running non-virtualized (host system)\n" | - | ||||||||||||||||||
| 310 | "Attributes can be combined, for example: -perfcounter branch-mispredicts:kh\n"); | - | ||||||||||||||||||
| 311 | } never executed:  end of block | 0 | ||||||||||||||||||
| 312 | - | |||||||||||||||||||
| 313 | QBenchmarkPerfEventsMeasurer::QBenchmarkPerfEventsMeasurer() | - | ||||||||||||||||||
| 314 | : fd(-1) | - | ||||||||||||||||||
| 315 | { | - | ||||||||||||||||||
| 316 | } never executed:  end of block | 0 | ||||||||||||||||||
| 317 | - | |||||||||||||||||||
| 318 | QBenchmarkPerfEventsMeasurer::~QBenchmarkPerfEventsMeasurer() | - | ||||||||||||||||||
| 319 | { | - | ||||||||||||||||||
| 320 | qt_safe_close(fd); | - | ||||||||||||||||||
| 321 | } never executed:  end of block | 0 | ||||||||||||||||||
| 322 | - | |||||||||||||||||||
| 323 | void QBenchmarkPerfEventsMeasurer::init() | - | ||||||||||||||||||
| 324 | { | - | ||||||||||||||||||
| 325 | } | - | ||||||||||||||||||
| 326 | - | |||||||||||||||||||
| 327 | void QBenchmarkPerfEventsMeasurer::start() | - | ||||||||||||||||||
| 328 | { | - | ||||||||||||||||||
| 329 | - | |||||||||||||||||||
| 330 | initPerf(); | - | ||||||||||||||||||
| 331 | if (fd == -1 
 | 0 | ||||||||||||||||||
| 332 | - | |||||||||||||||||||
| 333 | - | |||||||||||||||||||
| 334 | - | |||||||||||||||||||
| 335 | - | |||||||||||||||||||
| 336 | fd = perf_event_open(&attr, 0, -1, -1, 0); | - | ||||||||||||||||||
| 337 | if (fd == -1 
 | 0 | ||||||||||||||||||
| 338 | perror("QBenchmarkPerfEventsMeasurer::start: perf_event_open"); | - | ||||||||||||||||||
| 339 | exit(1); never executed:  exit(1); | 0 | ||||||||||||||||||
| 340 | } else { | - | ||||||||||||||||||
| 341 | ::fcntl(fd, 2, 1); | - | ||||||||||||||||||
| 342 | } never executed:  end of block | 0 | ||||||||||||||||||
| 343 | } | - | ||||||||||||||||||
| 344 | - | |||||||||||||||||||
| 345 | - | |||||||||||||||||||
| 346 | ::ioctl(fd, (((0U) << (((0 +8)+8)+14)) | ((('$')) << (0 +8)) | (((3)) << 0) | ((0) << ((0 +8)+8)))); | - | ||||||||||||||||||
| 347 | ::ioctl(fd, (((0U) << (((0 +8)+8)+14)) | ((('$')) << (0 +8)) | (((0)) << 0) | ((0) << ((0 +8)+8)))); | - | ||||||||||||||||||
| 348 | } never executed:  end of block | 0 | ||||||||||||||||||
| 349 | - | |||||||||||||||||||
| 350 | qint64 QBenchmarkPerfEventsMeasurer::checkpoint() | - | ||||||||||||||||||
| 351 | { | - | ||||||||||||||||||
| 352 | ::ioctl(fd, (((0U) << (((0 +8)+8)+14)) | ((('$')) << (0 +8)) | (((1)) << 0) | ((0) << ((0 +8)+8)))); | - | ||||||||||||||||||
| 353 | qint64 value = readValue(); | - | ||||||||||||||||||
| 354 | ::ioctl(fd, (((0U) << (((0 +8)+8)+14)) | ((('$')) << (0 +8)) | (((0)) << 0) | ((0) << ((0 +8)+8)))); | - | ||||||||||||||||||
| 355 | return never executed: value; return value;never executed:  return value; | 0 | ||||||||||||||||||
| 356 | } | - | ||||||||||||||||||
| 357 | - | |||||||||||||||||||
| 358 | qint64 QBenchmarkPerfEventsMeasurer::stop() | - | ||||||||||||||||||
| 359 | { | - | ||||||||||||||||||
| 360 | - | |||||||||||||||||||
| 361 | ::ioctl(fd, (((0U) << (((0 +8)+8)+14)) | ((('$')) << (0 +8)) | (((1)) << 0) | ((0) << ((0 +8)+8)))); | - | ||||||||||||||||||
| 362 | return never executed: readValue(); return readValue();never executed:  return readValue(); | 0 | ||||||||||||||||||
| 363 | } | - | ||||||||||||||||||
| 364 | - | |||||||||||||||||||
| 365 | bool QBenchmarkPerfEventsMeasurer::isMeasurementAccepted(qint64) | - | ||||||||||||||||||
| 366 | { | - | ||||||||||||||||||
| 367 | return never executed: true; return true;never executed:  return true; | 0 | ||||||||||||||||||
| 368 | } | - | ||||||||||||||||||
| 369 | - | |||||||||||||||||||
| 370 | int QBenchmarkPerfEventsMeasurer::adjustIterationCount(int) | - | ||||||||||||||||||
| 371 | { | - | ||||||||||||||||||
| 372 | return never executed: 1; return 1;never executed:  return 1; | 0 | ||||||||||||||||||
| 373 | } | - | ||||||||||||||||||
| 374 | - | |||||||||||||||||||
| 375 | int QBenchmarkPerfEventsMeasurer::adjustMedianCount(int) | - | ||||||||||||||||||
| 376 | { | - | ||||||||||||||||||
| 377 | return never executed: 1; return 1;never executed:  return 1; | 0 | ||||||||||||||||||
| 378 | } | - | ||||||||||||||||||
| 379 | - | |||||||||||||||||||
| 380 | QTest::QBenchmarkMetric QBenchmarkPerfEventsMeasurer::metricType() | - | ||||||||||||||||||
| 381 | { | - | ||||||||||||||||||
| 382 | return never executed: metricForEvent(attr.type, attr.config); return metricForEvent(attr.type, attr.config);never executed:  return metricForEvent(attr.type, attr.config); | 0 | ||||||||||||||||||
| 383 | } | - | ||||||||||||||||||
| 384 | - | |||||||||||||||||||
| 385 | static quint64 rawReadValue(int fd) | - | ||||||||||||||||||
| 386 | { | - | ||||||||||||||||||
| 387 | struct read_format { | - | ||||||||||||||||||
| 388 | quint64 value; | - | ||||||||||||||||||
| 389 | quint64 time_enabled; | - | ||||||||||||||||||
| 390 | quint64 time_running; | - | ||||||||||||||||||
| 391 | } results; | - | ||||||||||||||||||
| 392 | - | |||||||||||||||||||
| 393 | size_t nread = 0; | - | ||||||||||||||||||
| 394 | while (nread < sizeof results 
 | 0 | ||||||||||||||||||
| 395 | char *ptr = reinterpret_cast<char *>(&results); | - | ||||||||||||||||||
| 396 | qint64 r = qt_safe_read(fd, ptr + nread, sizeof results - nread); | - | ||||||||||||||||||
| 397 | if (r == -1 
 | 0 | ||||||||||||||||||
| 398 | perror("QBenchmarkPerfEventsMeasurer::readValue: reading the results"); | - | ||||||||||||||||||
| 399 | exit(1); never executed:  exit(1); | 0 | ||||||||||||||||||
| 400 | } | - | ||||||||||||||||||
| 401 | nread += quint64(r); | - | ||||||||||||||||||
| 402 | } never executed:  end of block | 0 | ||||||||||||||||||
| 403 | - | |||||||||||||||||||
| 404 | if (results.time_running == results.time_enabled 
 | 0 | ||||||||||||||||||
| 405 | return never executed: results.value; return results.value;never executed:  return results.value; | 0 | ||||||||||||||||||
| 406 | - | |||||||||||||||||||
| 407 | - | |||||||||||||||||||
| 408 | return never executed: results.value * (double(results.time_running) / double(results.time_enabled)); return results.value * (double(results.time_running) / double(results.time_enabled));never executed:  return results.value * (double(results.time_running) / double(results.time_enabled)); | 0 | ||||||||||||||||||
| 409 | } | - | ||||||||||||||||||
| 410 | - | |||||||||||||||||||
| 411 | qint64 QBenchmarkPerfEventsMeasurer::readValue() | - | ||||||||||||||||||
| 412 | { | - | ||||||||||||||||||
| 413 | quint64 raw = rawReadValue(fd); | - | ||||||||||||||||||
| 414 | if (metricType() == QTest::WalltimeMilliseconds 
 | 0 | ||||||||||||||||||
| 415 | - | |||||||||||||||||||
| 416 | return never executed: raw / 1000000; return raw / 1000000;never executed:  return raw / 1000000; | 0 | ||||||||||||||||||
| 417 | } | - | ||||||||||||||||||
| 418 | return never executed: raw; return raw;never executed:  return raw; | 0 | ||||||||||||||||||
| 419 | } | - | ||||||||||||||||||
| 420 | - | |||||||||||||||||||
| 421 | - | |||||||||||||||||||
| Switch to Source code | Preprocessed file |