diff options
Diffstat (limited to 'lib/Fuzzer/FuzzerValueBitMap.h')
| -rw-r--r-- | lib/Fuzzer/FuzzerValueBitMap.h | 21 | 
1 files changed, 14 insertions, 7 deletions
diff --git a/lib/Fuzzer/FuzzerValueBitMap.h b/lib/Fuzzer/FuzzerValueBitMap.h index 0692acd13ee3..8f7ff74300f4 100644 --- a/lib/Fuzzer/FuzzerValueBitMap.h +++ b/lib/Fuzzer/FuzzerValueBitMap.h @@ -18,19 +18,20 @@ namespace fuzzer {  // A bit map containing kMapSizeInWords bits.  struct ValueBitMap { -  static const size_t kMapSizeInBits = 65371;        // Prime. -  static const size_t kMapSizeInBitsAligned = 65536; // 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)); }    // Computes a hash function of Value and sets the corresponding bit.    // 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]; @@ -39,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; @@ -62,14 +68,15 @@ struct ValueBitMap {          Other.Map[i] = 0;        }        if (M) -        Res += __builtin_popcountl(M); +        Res += __builtin_popcountll(M);      }      NumBits = Res;      return OldNumBits < NumBits;    }    template <class Callback> -  void ForEach(Callback CB) { +  ATTRIBUTE_NO_SANITIZE_ALL +  void ForEach(Callback CB) const {      for (size_t i = 0; i < kMapSizeInWords; i++)        if (uintptr_t M = Map[i])          for (size_t j = 0; j < sizeof(M) * 8; j++)  | 
