summaryrefslogtreecommitdiff
path: root/lib/Fuzzer
diff options
context:
space:
mode:
authorKostya Serebryany <kcc@google.com>2017-07-31 20:20:59 +0000
committerKostya Serebryany <kcc@google.com>2017-07-31 20:20:59 +0000
commitf15adebe757b91340c7540dd1618af2aeb0d1fca (patch)
tree792dd6923e7603a76feec04b13acd77d15181fe0 /lib/Fuzzer
parentde4ee6c474c2bb648d0976c3a3752c98533c6c88 (diff)
[libFuzzer] implement __sanitizer_cov_pcs_init and add pc-table to build flags for one test (for now)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309615 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Fuzzer')
-rw-r--r--lib/Fuzzer/FuzzerTracePC.cpp31
-rw-r--r--lib/Fuzzer/FuzzerTracePC.h5
-rw-r--r--lib/Fuzzer/test/inline-8bit-counters/CMakeLists.txt2
3 files changed, 32 insertions, 6 deletions
diff --git a/lib/Fuzzer/FuzzerTracePC.cpp b/lib/Fuzzer/FuzzerTracePC.cpp
index bf2a6110e85..1c4c24032fc 100644
--- a/lib/Fuzzer/FuzzerTracePC.cpp
+++ b/lib/Fuzzer/FuzzerTracePC.cpp
@@ -66,6 +66,15 @@ void TracePC::HandleInline8bitCountersInit(uint8_t *Start, uint8_t *Stop) {
NumInline8bitCounters += Stop - Start;
}
+void TracePC::HandlePCsInit(const uint8_t *Start, const uint8_t *Stop) {
+ const uintptr_t *B = reinterpret_cast<const uintptr_t *>(Start);
+ const uintptr_t *E = reinterpret_cast<const uintptr_t *>(Stop);
+ if (NumPCTables && ModulePCTable[NumPCTables - 1].Start == B) return;
+ assert(NumPCTables < sizeof(ModulePCTable) / sizeof(ModulePCTable[0]));
+ ModulePCTable[NumPCTables++] = {B, E};
+ NumPCsInPCTables = E - B;
+}
+
void TracePC::HandleInit(uint32_t *Start, uint32_t *Stop) {
if (Start == Stop || *Start) return;
assert(NumModules < sizeof(Modules) / sizeof(Modules[0]));
@@ -85,17 +94,28 @@ void TracePC::HandleInit(uint32_t *Start, uint32_t *Stop) {
}
void TracePC::PrintModuleInfo() {
- Printf("INFO: Loaded %zd modules (%zd guards): ", NumModules, NumGuards);
- for (size_t i = 0; i < NumModules; i++)
- Printf("[%p, %p), ", Modules[i].Start, Modules[i].Stop);
- Printf("\n");
+ if (NumGuards) {
+ Printf("INFO: Loaded %zd modules (%zd guards): ", NumModules, NumGuards);
+ for (size_t i = 0; i < NumModules; i++)
+ Printf("[%p, %p), ", Modules[i].Start, Modules[i].Stop);
+ Printf("\n");
+ }
if (NumModulesWithInline8bitCounters) {
- Printf("INFO: Loaded %zd modules with %zd inline 8-bit counters\n",
+ Printf("INFO: Loaded %zd modules with %zd inline 8-bit counters: ",
NumModulesWithInline8bitCounters, NumInline8bitCounters);
for (size_t i = 0; i < NumModulesWithInline8bitCounters; i++)
Printf("[%p, %p), ", ModuleCounters[i].Start, ModuleCounters[i].Stop);
Printf("\n");
}
+ if (NumPCTables) {
+ Printf("INFO: Loaded %zd PC tables, %zd PCs: ", NumPCTables,
+ NumPCsInPCTables);
+ for (size_t i = 0; i < NumPCTables; i++) {
+ Printf("[%p,%p), ", ModulePCTable[i].Start, ModulePCTable[i].Stop,
+ ModulePCTable[i].Stop - ModulePCTable[i].Start);
+ }
+ Printf("\n");
+ }
}
ATTRIBUTE_NO_SANITIZE_ALL
@@ -354,6 +374,7 @@ void __sanitizer_cov_8bit_counters_init(uint8_t *Start, uint8_t *Stop) {
ATTRIBUTE_INTERFACE
void __sanitizer_cov_pcs_init(const uint8_t *pcs_beg, const uint8_t *pcs_end) {
+ fuzzer::TPC.HandlePCsInit(pcs_beg, pcs_end);
}
ATTRIBUTE_INTERFACE
diff --git a/lib/Fuzzer/FuzzerTracePC.h b/lib/Fuzzer/FuzzerTracePC.h
index 28301d17b2c..1ad5cf1d1cc 100644
--- a/lib/Fuzzer/FuzzerTracePC.h
+++ b/lib/Fuzzer/FuzzerTracePC.h
@@ -75,6 +75,7 @@ class TracePC {
void HandleInit(uint32_t *Start, uint32_t *Stop);
void HandleInline8bitCountersInit(uint8_t *Start, uint8_t *Stop);
+ void HandlePCsInit(const uint8_t *Start, const uint8_t *Stop);
void HandleCallerCallee(uintptr_t Caller, uintptr_t Callee);
template <class T> void HandleCmp(uintptr_t PC, T Arg1, T Arg2);
size_t GetTotalPCCoverage();
@@ -149,6 +150,10 @@ private:
size_t NumModulesWithInline8bitCounters; // linker-initialized.
size_t NumInline8bitCounters;
+ struct { const uintptr_t *Start, *Stop; } ModulePCTable[4096];
+ size_t NumPCTables;
+ size_t NumPCsInPCTables;
+
uint8_t *Counters() const;
uintptr_t *PCs() const;
diff --git a/lib/Fuzzer/test/inline-8bit-counters/CMakeLists.txt b/lib/Fuzzer/test/inline-8bit-counters/CMakeLists.txt
index 088ab04fe6a..6b8bdbb5c5e 100644
--- a/lib/Fuzzer/test/inline-8bit-counters/CMakeLists.txt
+++ b/lib/Fuzzer/test/inline-8bit-counters/CMakeLists.txt
@@ -1,7 +1,7 @@
# These tests are instrumented with -fsanitize-coverage=inline-8bit-counters
set(CMAKE_CXX_FLAGS
- "${LIBFUZZER_FLAGS_BASE} -fno-sanitize-coverage=trace-pc-guard -fsanitize-coverage=inline-8bit-counters")
+ "${LIBFUZZER_FLAGS_BASE} -fno-sanitize-coverage=trace-pc-guard -fsanitize-coverage=inline-8bit-counters,pc-table")
set(Inline8bitCounterTests
SimpleTest