blob: 2ba0808c8ce0f4122e54822a4eb30bd7885e3ab6 [file] [log] [blame]
Kostya Serebryany6f5a8042016-09-21 01:50:50 +00001//===- FuzzerTracePC.h - Internal header for the Fuzzer ---------*- C++ -* ===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9// fuzzer::TracePC
10//===----------------------------------------------------------------------===//
11
12#ifndef LLVM_FUZZER_TRACE_PC
13#define LLVM_FUZZER_TRACE_PC
14
15#include "FuzzerDefs.h"
16
17namespace fuzzer {
18
19class TracePC {
20 public:
21 void HandleTrace(uintptr_t *guard, uintptr_t PC);
22 void HandleInit(uintptr_t *start, uintptr_t *stop);
23 void HandleCallerCallee(uintptr_t Caller, uintptr_t Callee);
24 size_t GetTotalCoverage() { return TotalCoverage; }
25 void SetUseCounters(bool UC) { UseCounters = UC; }
26 size_t UpdateCounterMap(ValueBitMap *Map);
27 void FinalizeTrace();
28
29 size_t GetNewPCsAndFlush(uintptr_t **NewPCsPtr = nullptr) {
30 if (NewPCsPtr)
31 *NewPCsPtr = NewPCs;
32 size_t Res = NumNewPCs;
33 NumNewPCs = 0;
34 return Res;
35 }
36
37 void Reset() {
38 TotalCoverage = 0;
39 TotalCounterBits = 0;
40 NumNewPCs = 0;
41 CounterMap.Reset();
42 TotalCoverageMap.Reset();
43 ResetGuards();
44 }
45
46 void PrintModuleInfo();
47
48 void PrintCoverage();
49
50private:
51 bool UseCounters = false;
52 size_t TotalCoverage = 0;
53 size_t TotalCounterBits = 0;
54
55 static const size_t kMaxNewPCs = 64;
56 uintptr_t NewPCs[kMaxNewPCs];
57 size_t NumNewPCs = 0;
58 void AddNewPC(uintptr_t PC) { NewPCs[(NumNewPCs++) % kMaxNewPCs] = PC; }
59
60 void ResetGuards();
61
62 struct Module {
63 uintptr_t *Start, *Stop;
64 };
65
66 Module Modules[4096];
67 size_t NumModules = 0;
68 size_t NumGuards = 0;
69
70 static const size_t kNumCounters = 1 << 14;
71 uint8_t Counters[kNumCounters];
72
73 static const size_t kNumPCs = 1 << 20;
74 uintptr_t PCs[kNumPCs];
75
76 ValueBitMap CounterMap;
77 ValueBitMap TotalCoverageMap;
78};
79
80extern TracePC TPC;
81
82} // namespace fuzzer
83
84#endif // LLVM_FUZZER_TRACE_PC