diff options
| author | Kostya Serebryany <kcc@google.com> | 2017-08-11 23:03:22 +0000 |
|---|---|---|
| committer | Kostya Serebryany <kcc@google.com> | 2017-08-11 23:03:22 +0000 |
| commit | 0873be2ad0cd97e61e8babb0549e6475a20f7a76 (patch) | |
| tree | e0207e55d0e4aca7a87ef6f419ca7f413c5872a0 /llvm/lib/Fuzzer/FuzzerTracePC.h | |
| parent | 2b452c7192e296993688b78b305f6e7e46aaf625 (diff) | |
| download | bcm5719-llvm-0873be2ad0cd97e61e8babb0549e6475a20f7a76.tar.gz bcm5719-llvm-0873be2ad0cd97e61e8babb0549e6475a20f7a76.zip | |
[libFuzzer] experimental support for Clang's coverage (fprofile-instr-generate), Linux-only
llvm-svn: 310771
Diffstat (limited to 'llvm/lib/Fuzzer/FuzzerTracePC.h')
| -rw-r--r-- | llvm/lib/Fuzzer/FuzzerTracePC.h | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/llvm/lib/Fuzzer/FuzzerTracePC.h b/llvm/lib/Fuzzer/FuzzerTracePC.h index ea6794c75aa..40827b32828 100644 --- a/llvm/lib/Fuzzer/FuzzerTracePC.h +++ b/llvm/lib/Fuzzer/FuzzerTracePC.h @@ -91,6 +91,7 @@ class TracePC { memset(Counters(), 0, GetNumPCs()); ClearExtraCounters(); ClearInlineCounters(); + ClearClangCounters(); } void ClearInlineCounters(); @@ -196,14 +197,9 @@ void ForEachNonZeroByte(const uint8_t *Begin, const uint8_t *End, Handle8bitCounter(FirstFeature, P - Begin, V); } -template <class Callback> // bool Callback(size_t Feature) -ATTRIBUTE_NO_SANITIZE_ADDRESS -__attribute__((noinline)) -void TracePC::CollectFeatures(Callback HandleFeature) const { - uint8_t *Counters = this->Counters(); - size_t N = GetNumPCs(); - auto Handle8bitCounter = [&](size_t FirstFeature, - size_t Idx, uint8_t Counter) { +// Given a non-zero Counters returns a number in [0,7]. +template<class T> +unsigned CounterToFeature(T Counter) { assert(Counter); unsigned Bit = 0; /**/ if (Counter >= 128) Bit = 7; @@ -213,7 +209,18 @@ void TracePC::CollectFeatures(Callback HandleFeature) const { else if (Counter >= 4) Bit = 3; else if (Counter >= 3) Bit = 2; else if (Counter >= 2) Bit = 1; - HandleFeature(FirstFeature + Idx * 8 + Bit); + return Bit; +} + +template <class Callback> // bool Callback(size_t Feature) +ATTRIBUTE_NO_SANITIZE_ADDRESS +__attribute__((noinline)) +void TracePC::CollectFeatures(Callback HandleFeature) const { + uint8_t *Counters = this->Counters(); + size_t N = GetNumPCs(); + auto Handle8bitCounter = [&](size_t FirstFeature, + size_t Idx, uint8_t Counter) { + HandleFeature(FirstFeature + Idx * 8 + CounterToFeature(Counter)); }; size_t FirstFeature = 0; @@ -231,6 +238,14 @@ void TracePC::CollectFeatures(Callback HandleFeature) const { } } + if (size_t NumClangCounters = ClangCountersEnd() - ClangCountersBegin()) { + auto P = ClangCountersBegin(); + for (size_t Idx = 0; Idx < NumClangCounters; Idx++) + if (auto Cnt = P[Idx]) + HandleFeature(FirstFeature + Idx * 8 + CounterToFeature(Cnt)); + FirstFeature += NumClangCounters; + } + ForEachNonZeroByte(ExtraCountersBegin(), ExtraCountersEnd(), FirstFeature, Handle8bitCounter); FirstFeature += (ExtraCountersEnd() - ExtraCountersBegin()) * 8; |

