blob: e26a59f44271c7a744ba55ac23fc87777857f5dc [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"
Kostya Serebryany86586182016-09-21 21:17:23 +000016#include "FuzzerValueBitMap.h"
Kostya Serebryany6f5a8042016-09-21 01:50:50 +000017
18namespace fuzzer {
19
20class TracePC {
21 public:
22 void HandleTrace(uintptr_t *guard, uintptr_t PC);
23 void HandleInit(uintptr_t *start, uintptr_t *stop);
24 void HandleCallerCallee(uintptr_t Caller, uintptr_t Callee);
25 size_t GetTotalCoverage() { return TotalCoverage; }
26 void SetUseCounters(bool UC) { UseCounters = UC; }
27 size_t UpdateCounterMap(ValueBitMap *Map);
28 void FinalizeTrace();
29
Kostya Serebryany624f59f2016-09-22 01:34:58 +000030 size_t GetNewPCIDs(uintptr_t **NewPCIDsPtr) {
31 *NewPCIDsPtr = NewPCIDs;
32 return NumNewPCIDs;
Kostya Serebryany6f5a8042016-09-21 01:50:50 +000033 }
34
Kostya Serebryany624f59f2016-09-22 01:34:58 +000035 void ResetNewPCIDs() { NumNewPCIDs = 0; }
36 uintptr_t GetPCbyPCID(uintptr_t PCID) { return PCs[PCID]; }
37
Kostya Serebryany6f5a8042016-09-21 01:50:50 +000038 void Reset() {
39 TotalCoverage = 0;
40 TotalCounterBits = 0;
Kostya Serebryany624f59f2016-09-22 01:34:58 +000041 NumNewPCIDs = 0;
Kostya Serebryany6f5a8042016-09-21 01:50:50 +000042 CounterMap.Reset();
43 TotalCoverageMap.Reset();
44 ResetGuards();
45 }
46
47 void PrintModuleInfo();
48
49 void PrintCoverage();
50
51private:
52 bool UseCounters = false;
53 size_t TotalCoverage = 0;
54 size_t TotalCounterBits = 0;
55
Kostya Serebryany624f59f2016-09-22 01:34:58 +000056 static const size_t kMaxNewPCIDs = 64;
57 uintptr_t NewPCIDs[kMaxNewPCIDs];
58 size_t NumNewPCIDs = 0;
59 void AddNewPCID(uintptr_t PCID) {
60 NewPCIDs[(NumNewPCIDs++) % kMaxNewPCIDs] = PCID;
61 }
Kostya Serebryany6f5a8042016-09-21 01:50:50 +000062
63 void ResetGuards();
64
65 struct Module {
66 uintptr_t *Start, *Stop;
67 };
68
69 Module Modules[4096];
70 size_t NumModules = 0;
71 size_t NumGuards = 0;
72
73 static const size_t kNumCounters = 1 << 14;
74 uint8_t Counters[kNumCounters];
75
76 static const size_t kNumPCs = 1 << 20;
77 uintptr_t PCs[kNumPCs];
78
79 ValueBitMap CounterMap;
80 ValueBitMap TotalCoverageMap;
81};
82
83extern TracePC TPC;
84
85} // namespace fuzzer
86
87#endif // LLVM_FUZZER_TRACE_PC