1*0b57cec5SDimitry Andric //===- FuzzerExtraCounters.cpp - Extra coverage counters ------------------===// 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric // Extra coverage counters defined by user code. 9*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 10*0b57cec5SDimitry Andric 11*0b57cec5SDimitry Andric #include "FuzzerPlatform.h" 12*0b57cec5SDimitry Andric #include <cstdint> 13*0b57cec5SDimitry Andric 14*0b57cec5SDimitry Andric #if LIBFUZZER_LINUX || LIBFUZZER_NETBSD || LIBFUZZER_FREEBSD || \ 15*0b57cec5SDimitry Andric LIBFUZZER_FUCHSIA || LIBFUZZER_EMSCRIPTEN 16*0b57cec5SDimitry Andric __attribute__((weak)) extern uint8_t __start___libfuzzer_extra_counters; 17*0b57cec5SDimitry Andric __attribute__((weak)) extern uint8_t __stop___libfuzzer_extra_counters; 18*0b57cec5SDimitry Andric 19*0b57cec5SDimitry Andric namespace fuzzer { ExtraCountersBegin()20*0b57cec5SDimitry Andricuint8_t *ExtraCountersBegin() { return &__start___libfuzzer_extra_counters; } ExtraCountersEnd()21*0b57cec5SDimitry Andricuint8_t *ExtraCountersEnd() { return &__stop___libfuzzer_extra_counters; } 22*0b57cec5SDimitry Andric ATTRIBUTE_NO_SANITIZE_ALL ClearExtraCounters()23*0b57cec5SDimitry Andricvoid ClearExtraCounters() { // hand-written memset, don't asan-ify. 24*0b57cec5SDimitry Andric uintptr_t *Beg = reinterpret_cast<uintptr_t*>(ExtraCountersBegin()); 25*0b57cec5SDimitry Andric uintptr_t *End = reinterpret_cast<uintptr_t*>(ExtraCountersEnd()); 26*0b57cec5SDimitry Andric for (; Beg < End; Beg++) { 27*0b57cec5SDimitry Andric *Beg = 0; 28*0b57cec5SDimitry Andric __asm__ __volatile__("" : : : "memory"); 29*0b57cec5SDimitry Andric } 30*0b57cec5SDimitry Andric } 31*0b57cec5SDimitry Andric 32*0b57cec5SDimitry Andric } // namespace fuzzer 33*0b57cec5SDimitry Andric 34*0b57cec5SDimitry Andric #endif 35*0b57cec5SDimitry Andric