diff options
author | Kostya Serebryany <kcc@google.com> | 2016-08-30 01:30:14 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2016-08-30 01:30:14 +0000 |
commit | 4d22e4fcb92cf1f3af8fe0246694fa572971fd22 (patch) | |
tree | 3fceef14bd7a0ea159241f337ab290d1cd029a50 /llvm/lib/Fuzzer/FuzzerTraceState.cpp | |
parent | b3177cea0a1b03a03a372c1ba48f7300d80b82b2 (diff) | |
download | bcm5719-llvm-4d22e4fcb92cf1f3af8fe0246694fa572971fd22.tar.gz bcm5719-llvm-4d22e4fcb92cf1f3af8fe0246694fa572971fd22.zip |
[libFuzzer] use trace-div and trace-gep for guided fuzzing, add tests
llvm-svn: 280046
Diffstat (limited to 'llvm/lib/Fuzzer/FuzzerTraceState.cpp')
-rw-r--r-- | llvm/lib/Fuzzer/FuzzerTraceState.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/llvm/lib/Fuzzer/FuzzerTraceState.cpp b/llvm/lib/Fuzzer/FuzzerTraceState.cpp index f1307d7d3a2..7bbc7591fbd 100644 --- a/llvm/lib/Fuzzer/FuzzerTraceState.cpp +++ b/llvm/lib/Fuzzer/FuzzerTraceState.cpp @@ -584,6 +584,14 @@ static void AddValueForCmp(void *PCptr, uint64_t Arg1, uint64_t Arg2) { VP.AddValue(Idx); } +static void AddValueForSingleVal(void *PCptr, uintptr_t Val) { + if (!Val) return; + uintptr_t PC = reinterpret_cast<uintptr_t>(PCptr); + uint64_t ArgDistance = __builtin_popcountl(Val) - 1; // [0,63] + uintptr_t Idx = (PC & 4095) | (ArgDistance << 12); + VP.AddValue(Idx); +} + } // namespace fuzzer using fuzzer::TS; @@ -780,4 +788,17 @@ void __sanitizer_cov_trace_switch(uint64_t Val, uint64_t *Cases) { TS->TraceSwitchCallback(PC, Cases[1], Val, Cases[0], Cases + 2); } +__attribute__((visibility("default"))) +void __sanitizer_cov_trace_div4(uint32_t Val) { + fuzzer::AddValueForSingleVal(__builtin_return_address(0), Val); +} +__attribute__((visibility("default"))) +void __sanitizer_cov_trace_div8(uint64_t Val) { + fuzzer::AddValueForSingleVal(__builtin_return_address(0), Val); +} +__attribute__((visibility("default"))) +void __sanitizer_cov_trace_gep(uintptr_t Idx) { + fuzzer::AddValueForSingleVal(__builtin_return_address(0), Idx); +} + } // extern "C" |