diff options
author | Kostya Serebryany <kcc@google.com> | 2017-08-22 01:28:32 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2017-08-22 01:28:32 +0000 |
commit | 190938f453f63c379a3c07c0140a69d87ff812a8 (patch) | |
tree | 47371e59897d4420293492e8fc5d34cdb217e076 /lib/fuzzer/FuzzerTracePC.h | |
parent | 8713a9766f1d0a033de92dc57b8df67ae53ff425 (diff) |
[libFuzzer] apply changes lost during the migration to compiler-rt
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@311420 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/fuzzer/FuzzerTracePC.h')
-rw-r--r-- | lib/fuzzer/FuzzerTracePC.h | 50 |
1 files changed, 27 insertions, 23 deletions
diff --git a/lib/fuzzer/FuzzerTracePC.h b/lib/fuzzer/FuzzerTracePC.h index ea6794c75..56f1820f7 100644 --- a/lib/fuzzer/FuzzerTracePC.h +++ b/lib/fuzzer/FuzzerTracePC.h @@ -91,6 +91,7 @@ class TracePC { memset(Counters(), 0, GetNumPCs()); ClearExtraCounters(); ClearInlineCounters(); + ClearClangCounters(); } void ClearInlineCounters(); @@ -119,19 +120,8 @@ class TracePC { return PCs()[Idx]; } - void RecordCurrentStack() { - uintptr_t Stack = GetCurrentStack(); - if (Stack < LowestStack) - LowestStack = Stack; - } - void RecordInitialStack() { - InitialStack = GetCurrentStack(); - LowestStack = InitialStack; - } - uintptr_t GetCurrentStack() const { - return reinterpret_cast<uintptr_t>(__builtin_frame_address(0)); - } - uintptr_t GetMaxStackOffset() const { return InitialStack - LowestStack; } + void RecordInitialStack(); + uintptr_t GetMaxStackOffset() const; template<class CallBack> void ForEachObservedPC(CallBack CB) { @@ -166,7 +156,7 @@ private: std::set<uintptr_t> ObservedPCs; ValueBitMap ValueProfileMap; - uintptr_t InitialStack, LowestStack; // Assume stack grows down. + uintptr_t InitialStack; }; template <class Callback> @@ -196,14 +186,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 +198,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 +227,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; |