diff options
author | Kostya Serebryany <kcc@google.com> | 2017-03-30 01:27:20 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2017-03-30 01:27:20 +0000 |
commit | d7d1d517ee13d8fad6279de29f236295bef10b58 (patch) | |
tree | 444b044407fec0c18b8219a39c0d8c274d0f424e /llvm/lib/Fuzzer/FuzzerTracePC.cpp | |
parent | af3a4e97d8627a32606ed32001583fe08f15b928 (diff) | |
download | bcm5719-llvm-d7d1d517ee13d8fad6279de29f236295bef10b58.tar.gz bcm5719-llvm-d7d1d517ee13d8fad6279de29f236295bef10b58.zip |
[libFuzzer] best effort support for -fsanitize-coverage=trace-pc instrumentation. It is less efficient and precise than -fsanitize-coverage=trace-pc-guard, but still works
llvm-svn: 299046
Diffstat (limited to 'llvm/lib/Fuzzer/FuzzerTracePC.cpp')
-rw-r--r-- | llvm/lib/Fuzzer/FuzzerTracePC.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/llvm/lib/Fuzzer/FuzzerTracePC.cpp b/llvm/lib/Fuzzer/FuzzerTracePC.cpp index c73008dccd3..ce0f7a47eee 100644 --- a/llvm/lib/Fuzzer/FuzzerTracePC.cpp +++ b/llvm/lib/Fuzzer/FuzzerTracePC.cpp @@ -287,6 +287,17 @@ void __sanitizer_cov_trace_pc_guard(uint32_t *Guard) { __sancov_trace_pc_guard_8bit_counters[Idx]++; } +// Best-effort support for -fsanitize-coverage=trace-pc, which is available +// in both Clang and GCC. +ATTRIBUTE_INTERFACE +ATTRIBUTE_NO_SANITIZE_ALL +void __sanitizer_cov_trace_pc() { + uintptr_t PC = reinterpret_cast<uintptr_t>(__builtin_return_address(0)); + uintptr_t Idx = PC & (((uintptr_t)1 << fuzzer::TracePC::kTracePcBits) - 1); + __sancov_trace_pc_pcs[Idx] = PC; + __sancov_trace_pc_guard_8bit_counters[Idx]++; +} + ATTRIBUTE_INTERFACE void __sanitizer_cov_trace_pc_guard_init(uint32_t *Start, uint32_t *Stop) { fuzzer::TPC.HandleInit(Start, Stop); |