Index: test/tools/sancov/Inputs/blacklist.txt =================================================================== --- /dev/null +++ test/tools/sancov/Inputs/blacklist.txt @@ -0,0 +1 @@ +fun:bar* Index: test/tools/sancov/blacklist.test =================================================================== --- /dev/null +++ test/tools/sancov/blacklist.test @@ -0,0 +1,5 @@ +REQUIRES: x86_64-linux +RUN: sancov -obj %p/Inputs/test-linux_x86_64 -covered-functions -blacklist %p/Inputs/blacklist.txt %p/Inputs/test-linux_x86_64.sancov | FileCheck %s + +CHECK-NOT: Inputs{{[/\\]}}test.cpp:12 bar(std::string) +CHECK: Inputs{{[/\\]}}test.cpp:14 main Index: tools/sancov/sancov.cc =================================================================== --- tools/sancov/sancov.cc +++ tools/sancov/sancov.cc @@ -34,6 +34,7 @@ #include "llvm/Support/Path.h" #include "llvm/Support/PrettyStackTrace.h" #include "llvm/Support/Signals.h" +#include "llvm/Support/SpecialCaseList.h" #include "llvm/Support/TargetRegistry.h" #include "llvm/Support/TargetSelect.h" #include "llvm/Support/ToolOutputFile.h" @@ -80,6 +81,12 @@ "strip_path_prefix", cl::init(""), cl::desc("Strip this prefix from file paths in reports.")); +static cl::opt + ClBlacklist("blacklist", cl::init(""), + cl::desc("Blacklist file (sanitizer blacklist format).")); + +static const char *const DefaultBlacklist = "fun:__sancov*"; + // --------- FORMAT SPECIFICATION --------- struct FileHeader { @@ -169,8 +176,8 @@ for (auto Addr : Addrs) { auto InliningInfo = Symbolizer.symbolizeInlinedCode(ClBinaryName, Addr); FailIfError(InliningInfo); - for (uint32_t i = 0; i < InliningInfo->getNumberOfFrames(); ++i) { - auto FrameInfo = InliningInfo->getFrame(i); + for (uint32_t I = 0; I < InliningInfo->getNumberOfFrames(); ++I) { + auto FrameInfo = InliningInfo->getFrame(I); SmallString<256> FileName(FrameInfo.FileName); sys::path::remove_dots(FileName, /* remove_dot_dot */ true); FileLoc Loc = {FileName.str(), FrameInfo.Line}; @@ -186,7 +193,7 @@ std::set computeFunctionLocs(const std::set &Addrs) { std::map Fns = computeFunctionsMap(Addrs); - std::set result; + std::set Result; std::string LastFileName; std::set ProcessedFunctions; @@ -201,10 +208,10 @@ if (!ProcessedFunctions.insert(FunctionName).second) continue; - result.insert(FunctionLoc{P.first, P.second}); + Result.insert(FunctionLoc{P.first, P.second}); } - return result; + return Result; } // Locate __sanitizer_cov function address. @@ -337,9 +344,27 @@ return Result; } +static std::unique_ptr createBlacklist() { + if (!ClBlacklist.empty()) + return SpecialCaseList::createOrDie({{ClBlacklist}}); + std::unique_ptr MB = + MemoryBuffer::getMemBuffer(DefaultBlacklist); + std::string Error; + auto Blacklist = SpecialCaseList::create(MB.get(), Error); + FailIfNotEmpty(Error); + return Blacklist; +} + static void printFunctionLocs(const std::set &FnLocs, raw_ostream &OS) { + std::unique_ptr Blacklist = createBlacklist(); + for (const FunctionLoc &FnLoc : FnLocs) { + if (Blacklist->inSection("fun", FnLoc.FunctionName)) + continue; + if (Blacklist->inSection("src", FnLoc.Loc.FileName)) + continue; + OS << stripPathPrefix(FnLoc.Loc.FileName) << ":" << FnLoc.Loc.Line << " " << FnLoc.FunctionName << "\n"; }