From f15adebe757b91340c7540dd1618af2aeb0d1fca Mon Sep 17 00:00:00 2001 From: Kostya Serebryany Date: Mon, 31 Jul 2017 20:20:59 +0000 Subject: [PATCH] [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 --- lib/Fuzzer/FuzzerTracePC.cpp | 31 ++++++++++++++++--- lib/Fuzzer/FuzzerTracePC.h | 5 +++ .../test/inline-8bit-counters/CMakeLists.txt | 2 +- 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(Start); + const uintptr_t *E = reinterpret_cast(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 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 -- 2.40.0