xref: /netbsd-src/sys/external/bsd/compiler_rt/dist/lib/fuzzer/FuzzerExtraCounters.cpp (revision a7c257b03e4462df2b1020128fb82716512d7856)
1*a7c257b0Skamil //===- FuzzerExtraCounters.cpp - Extra coverage counters ------------------===//
2*a7c257b0Skamil //
3*a7c257b0Skamil //                     The LLVM Compiler Infrastructure
4*a7c257b0Skamil //
5*a7c257b0Skamil // This file is distributed under the University of Illinois Open Source
6*a7c257b0Skamil // License. See LICENSE.TXT for details.
7*a7c257b0Skamil //
8*a7c257b0Skamil //===----------------------------------------------------------------------===//
9*a7c257b0Skamil // Extra coverage counters defined by user code.
10*a7c257b0Skamil //===----------------------------------------------------------------------===//
11*a7c257b0Skamil 
12*a7c257b0Skamil #include "FuzzerDefs.h"
13*a7c257b0Skamil 
14*a7c257b0Skamil #if LIBFUZZER_LINUX || LIBFUZZER_NETBSD || LIBFUZZER_FREEBSD ||                \
15*a7c257b0Skamil     LIBFUZZER_OPENBSD
16*a7c257b0Skamil __attribute__((weak)) extern uint8_t __start___libfuzzer_extra_counters;
17*a7c257b0Skamil __attribute__((weak)) extern uint8_t __stop___libfuzzer_extra_counters;
18*a7c257b0Skamil 
19*a7c257b0Skamil namespace fuzzer {
ExtraCountersBegin()20*a7c257b0Skamil uint8_t *ExtraCountersBegin() { return &__start___libfuzzer_extra_counters; }
ExtraCountersEnd()21*a7c257b0Skamil uint8_t *ExtraCountersEnd() { return &__stop___libfuzzer_extra_counters; }
22*a7c257b0Skamil ATTRIBUTE_NO_SANITIZE_ALL
ClearExtraCounters()23*a7c257b0Skamil void ClearExtraCounters() {  // hand-written memset, don't asan-ify.
24*a7c257b0Skamil   uintptr_t *Beg = reinterpret_cast<uintptr_t*>(ExtraCountersBegin());
25*a7c257b0Skamil   uintptr_t *End = reinterpret_cast<uintptr_t*>(ExtraCountersEnd());
26*a7c257b0Skamil   for (; Beg < End; Beg++) {
27*a7c257b0Skamil     *Beg = 0;
28*a7c257b0Skamil     __asm__ __volatile__("" : : : "memory");
29*a7c257b0Skamil   }
30*a7c257b0Skamil }
31*a7c257b0Skamil 
32*a7c257b0Skamil }  // namespace fuzzer
33*a7c257b0Skamil 
34*a7c257b0Skamil #else
35*a7c257b0Skamil // TODO: implement for other platforms.
36*a7c257b0Skamil namespace fuzzer {
ExtraCountersBegin()37*a7c257b0Skamil uint8_t *ExtraCountersBegin() { return nullptr; }
ExtraCountersEnd()38*a7c257b0Skamil uint8_t *ExtraCountersEnd() { return nullptr; }
ClearExtraCounters()39*a7c257b0Skamil void ClearExtraCounters() {}
40*a7c257b0Skamil }  // namespace fuzzer
41*a7c257b0Skamil 
42*a7c257b0Skamil #endif
43