void TracePC::HandleTrace(uint32_t *Guard, uintptr_t PC) {
uint32_t Idx = *Guard;
PCs[Idx] = PC;
- Counters[Idx % kNumCounters]++;
+ Counters[Idx]++;
}
size_t TracePC::GetTotalPCCoverage() {
size_t Res = 0;
- for (size_t i = 1; i < GetNumPCs(); i++)
+ for (size_t i = 1, N = GetNumPCs(); i < N; i++)
if (PCs[i])
Res++;
return Res;
void ResetMaps() {
ValueProfileMap.Reset();
- memset(Counters, 0, sizeof(Counters));
+ memset(Counters, 0, GetNumPCs());
}
void UpdateFeatureSet(size_t CurrentElementIdx, size_t CurrentElementSize);
size_t NumModules; // linker-initialized.
size_t NumGuards; // linker-initialized.
- static const size_t kNumCounters = 1 << 14;
- alignas(8) uint8_t Counters[kNumCounters];
-
- static const size_t kNumPCs = 1 << 24;
+ static const size_t kNumPCs = 1 << 21;
+ alignas(8) uint8_t Counters[kNumPCs];
uintptr_t PCs[kNumPCs];
std::set<uintptr_t> *PrintedPCs;
size_t Res = 0;
const size_t Step = 8;
assert(reinterpret_cast<uintptr_t>(Counters) % Step == 0);
- size_t N = Min(kNumCounters, NumGuards + 1);
+ size_t N = GetNumPCs();
N = (N + Step - 1) & ~(Step - 1); // Round up.
for (size_t Idx = 0; Idx < N; Idx += Step) {
uint64_t Bundle = *reinterpret_cast<uint64_t*>(&Counters[Idx]);
}
if (UseValueProfile)
ValueProfileMap.ForEach([&](size_t Idx) {
- if (CB(NumGuards * 8 + Idx))
+ if (CB(N * 8 + Idx))
Res++;
});
return Res;