diff --git a/llvm/lib/Fuzzer/FuzzerTracePC.cpp b/llvm/lib/Fuzzer/FuzzerTracePC.cpp index 6c1d1ffaf7d2..9981fc3459dc 100644 --- a/llvm/lib/Fuzzer/FuzzerTracePC.cpp +++ b/llvm/lib/Fuzzer/FuzzerTracePC.cpp @@ -73,7 +73,7 @@ void TracePC::HandleCallerCallee(uintptr_t Caller, uintptr_t Callee) { const uintptr_t kBits = 12; const uintptr_t kMask = (1 << kBits) - 1; uintptr_t Idx = (Caller & kMask) | ((Callee & kMask) << kBits); - ValueProfileMap.AddValue(Idx); + ValueProfileMap.AddValueModPrime(Idx); } void TracePC::InitializePrintNewPCs() { diff --git a/llvm/lib/Fuzzer/FuzzerTracePC.h b/llvm/lib/Fuzzer/FuzzerTracePC.h index b94aa63df625..0b666e1963d9 100644 --- a/llvm/lib/Fuzzer/FuzzerTracePC.h +++ b/llvm/lib/Fuzzer/FuzzerTracePC.h @@ -47,7 +47,6 @@ struct TableOfRecentCompares { class TracePC { public: - static const size_t kFeatureSetSize = ValueBitMap::kNumberOfItems; void HandleTrace(uint32_t *guard, uintptr_t PC); void HandleInit(uint32_t *start, uint32_t *stop); @@ -58,9 +57,6 @@ class TracePC { void SetUseValueProfile(bool VP) { UseValueProfile = VP; } void SetPrintNewPCs(bool P) { DoPrintNewPCs = P; } template size_t CollectFeatures(Callback CB); - bool UpdateValueProfileMap(ValueBitMap *MaxValueProfileMap) { - return UseValueProfile && MaxValueProfileMap->MergeFrom(ValueProfileMap); - } void ResetMaps() { ValueProfileMap.Reset(); diff --git a/llvm/lib/Fuzzer/FuzzerValueBitMap.h b/llvm/lib/Fuzzer/FuzzerValueBitMap.h index 22e06641fa17..68dc3a9fc3ac 100644 --- a/llvm/lib/Fuzzer/FuzzerValueBitMap.h +++ b/llvm/lib/Fuzzer/FuzzerValueBitMap.h @@ -18,12 +18,12 @@ namespace fuzzer { // A bit map containing kMapSizeInWords bits. struct ValueBitMap { - static const size_t kMapSizeInBits = 65371; // Prime. - static const size_t kMapSizeInBitsAligned = 1 << 16; // 2^16 + static const size_t kMapSizeInBits = 1 << 16; + static const size_t kMapPrimeMod = 65371; // Largest Prime < kMapSizeInBits; static const size_t kBitsInWord = (sizeof(uintptr_t) * 8); - static const size_t kMapSizeInWords = kMapSizeInBitsAligned / kBitsInWord; + static const size_t kMapSizeInWords = kMapSizeInBits / kBitsInWord; public: - static const size_t kNumberOfItems = kMapSizeInBits; + // Clears all bits. void Reset() { memset(Map, 0, sizeof(Map)); } @@ -31,7 +31,7 @@ struct ValueBitMap { // Returns true if the bit was changed from 0 to 1. ATTRIBUTE_NO_SANITIZE_ALL inline bool AddValue(uintptr_t Value) { - uintptr_t Idx = Value < kMapSizeInBits ? Value : Value % kMapSizeInBits; + uintptr_t Idx = Value % kMapSizeInBits; uintptr_t WordIdx = Idx / kBitsInWord; uintptr_t BitIdx = Idx % kBitsInWord; uintptr_t Old = Map[WordIdx]; @@ -40,6 +40,11 @@ struct ValueBitMap { return New != Old; } + ATTRIBUTE_NO_SANITIZE_ALL + inline bool AddValueModPrime(uintptr_t Value) { + return AddValue(Value % kMapPrimeMod); + } + inline bool Get(uintptr_t Idx) { assert(Idx < kMapSizeInBits); uintptr_t WordIdx = Idx / kBitsInWord;