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