diff options
| author | Kostya Serebryany <kcc@google.com> | 2016-01-16 03:53:32 +0000 |
|---|---|---|
| committer | Kostya Serebryany <kcc@google.com> | 2016-01-16 03:53:32 +0000 |
| commit | 476f0ce31a442f5fadc3e0978c2e3190faf96447 (patch) | |
| tree | 5dadf11893d75cf52ee4d2445408b3046ecc469d /llvm/lib/Fuzzer/FuzzerTraceState.cpp | |
| parent | 33ff1dda6a2638f4e1040c282ddc75e5e4483871 (diff) | |
| download | bcm5719-llvm-476f0ce31a442f5fadc3e0978c2e3190faf96447.tar.gz bcm5719-llvm-476f0ce31a442f5fadc3e0978c2e3190faf96447.zip | |
[libFuzzer] replace vector with a simpler data structure in the Dictionaries to avoid memory allocations on hot path
llvm-svn: 257985
Diffstat (limited to 'llvm/lib/Fuzzer/FuzzerTraceState.cpp')
| -rw-r--r-- | llvm/lib/Fuzzer/FuzzerTraceState.cpp | 23 |
1 files changed, 8 insertions, 15 deletions
diff --git a/llvm/lib/Fuzzer/FuzzerTraceState.cpp b/llvm/lib/Fuzzer/FuzzerTraceState.cpp index 1948b282c94..bbc1cf4d8a3 100644 --- a/llvm/lib/Fuzzer/FuzzerTraceState.cpp +++ b/llvm/lib/Fuzzer/FuzzerTraceState.cpp @@ -164,14 +164,10 @@ struct LabelRange { // For now, very simple: put Size bytes of Data at position Pos. struct TraceBasedMutation { - static const size_t kMaxSize = 28; - uint32_t Pos : 24; - uint32_t Size : 8; - uint8_t Data[kMaxSize]; + uint32_t Pos; + Word W; }; -const size_t TraceBasedMutation::kMaxSize; - // Declared as static globals for faster checks inside the hooks. static bool RecordingTraces = false; static bool RecordingMemcmp = false; @@ -223,12 +219,11 @@ class TraceState { RecordingMemcmp = false; for (size_t i = 0; i < NumMutations; i++) { auto &M = Mutations[i]; - Unit U(M.Data, M.Data + M.Size); if (Options.Verbosity >= 2) { - AutoDictUnitCounts[U]++; + AutoDictUnitCounts[M.W]++; AutoDictAdds++; if ((AutoDictAdds & (AutoDictAdds - 1)) == 0) { - typedef std::pair<size_t, Unit> CU; + typedef std::pair<size_t, Word> CU; std::vector<CU> CountedUnits; for (auto &I : AutoDictUnitCounts) CountedUnits.push_back(std::make_pair(I.second, I.first)); @@ -242,17 +237,15 @@ class TraceState { } } } - USF.GetMD().AddWordToAutoDictionary(U, M.Pos); + USF.GetMD().AddWordToAutoDictionary(M.W, M.Pos); } } void AddMutation(uint32_t Pos, uint32_t Size, const uint8_t *Data) { if (NumMutations >= kMaxMutations) return; - assert(Size <= TraceBasedMutation::kMaxSize); auto &M = Mutations[NumMutations++]; M.Pos = Pos; - M.Size = Size; - memcpy(M.Data, Data, Size); + M.W.Set(Data, Size); } void AddMutation(uint32_t Pos, uint32_t Size, uint64_t Data) { @@ -274,7 +267,7 @@ class TraceState { const Fuzzer::FuzzingOptions &Options; uint8_t **CurrentUnitData; size_t *CurrentUnitSize; - std::map<Unit, size_t> AutoDictUnitCounts; + std::map<Word, size_t> AutoDictUnitCounts; size_t AutoDictAdds = 0; static thread_local bool IsMyThread; }; @@ -423,7 +416,7 @@ void TraceState::TraceCmpCallback(uintptr_t PC, size_t CmpSize, size_t CmpType, void TraceState::TraceMemcmpCallback(size_t CmpSize, const uint8_t *Data1, const uint8_t *Data2) { if (!RecordingMemcmp || !IsMyThread) return; - CmpSize = std::min(CmpSize, TraceBasedMutation::kMaxSize); + CmpSize = std::min(CmpSize, Word::GetMaxSize()); int Added2 = TryToAddDesiredData(Data1, Data2, CmpSize); int Added1 = TryToAddDesiredData(Data2, Data1, CmpSize); if ((Added1 || Added2) && Options.Verbosity >= 3) { |

