diff --git a/llvm/test/tools/sancov/Inputs/fun_blacklist.txt b/llvm/test/tools/sancov/Inputs/fun_ignorelist.txt rename from llvm/test/tools/sancov/Inputs/fun_blacklist.txt rename to llvm/test/tools/sancov/Inputs/fun_ignorelist.txt diff --git a/llvm/test/tools/sancov/Inputs/src_blacklist.txt b/llvm/test/tools/sancov/Inputs/src_ignorelist.txt rename from llvm/test/tools/sancov/Inputs/src_blacklist.txt rename to llvm/test/tools/sancov/Inputs/src_ignorelist.txt diff --git a/llvm/test/tools/sancov/blacklist.test b/llvm/test/tools/sancov/blacklist.test deleted file mode 100644 --- a/llvm/test/tools/sancov/blacklist.test +++ /dev/null @@ -1,26 +0,0 @@ -REQUIRES: x86-registered-target && host-byteorder-little-endian -RUN: sancov -covered-functions %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.0.sancov | FileCheck %s --check-prefix=ALL -RUN: sancov -covered-functions -blacklist %p/Inputs/fun_blacklist.txt %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.0.sancov | FileCheck %s -RUN: sancov -covered-functions -blacklist %p/Inputs/src_blacklist.txt %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.1.sancov | FileCheck --check-prefix=CHECK1 %s -RUN: sancov -print-coverage-stats %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.1.sancov | FileCheck --check-prefix=STATS %s -RUN: sancov -print-coverage-stats -blacklist %p/Inputs/fun_blacklist.txt %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.1.sancov | FileCheck --check-prefix=STATS-BLIST %s - -ALL: test.cpp:12 bar(std::string) -ALL: test.cpp:14 main - -CHECK-NOT: test.cpp:12 bar(std::string) -CHECK: test.cpp:14 main - -CHECK1-NOT: test.cpp:12 bar(std::string) -CHECK1-NOT: test.cpp:14 main - -STATS: all-edges: 9 -STATS: cov-edges: 7 -STATS: all-functions: 3 -STATS: cov-functions: 3 - -STATS-BLIST: all-edges: 8 -STATS-BLIST: cov-edges: 6 -STATS-BLIST: all-functions: 2 -STATS-BLIST: cov-functions: 2 - diff --git a/llvm/test/tools/sancov/ignorelist.test b/llvm/test/tools/sancov/ignorelist.test new file mode 100644 --- /dev/null +++ b/llvm/test/tools/sancov/ignorelist.test @@ -0,0 +1,29 @@ +REQUIRES: x86-registered-target && host-byteorder-little-endian +RUN: sancov -covered-functions %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.0.sancov | FileCheck %s --check-prefix=ALL +RUN: sancov -covered-functions -ignorelist %p/Inputs/fun_ignorelist.txt %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.0.sancov | FileCheck %s +RUN: sancov -covered-functions -blacklist %p/Inputs/fun_ignorelist.txt %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.0.sancov | FileCheck %s +RUN: sancov -covered-functions -ignorelist %p/Inputs/src_ignorelist.txt %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.1.sancov | FileCheck --check-prefix=CHECK1 %s +RUN: sancov -covered-functions -blacklist %p/Inputs/src_ignorelist.txt %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.1.sancov | FileCheck --check-prefix=CHECK1 %s +RUN: sancov -print-coverage-stats %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.1.sancov | FileCheck --check-prefix=STATS %s +RUN: sancov -print-coverage-stats -ignorelist %p/Inputs/fun_ignorelist.txt %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.1.sancov | FileCheck --check-prefix=STATS-BLIST %s +RUN: sancov -print-coverage-stats -blacklist %p/Inputs/fun_ignorelist.txt %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.1.sancov | FileCheck --check-prefix=STATS-BLIST %s + +ALL: test.cpp:12 bar(std::string) +ALL: test.cpp:14 main + +CHECK-NOT: test.cpp:12 bar(std::string) +CHECK: test.cpp:14 main + +CHECK1-NOT: test.cpp:12 bar(std::string) +CHECK1-NOT: test.cpp:14 main + +STATS: all-edges: 9 +STATS: cov-edges: 7 +STATS: all-functions: 3 +STATS: cov-functions: 3 + +STATS-BLIST: all-edges: 8 +STATS-BLIST: cov-edges: 6 +STATS-BLIST: all-functions: 2 +STATS-BLIST: cov-functions: 2 + diff --git a/llvm/tools/sancov/sancov.cpp b/llvm/tools/sancov/sancov.cpp --- a/llvm/tools/sancov/sancov.cpp +++ b/llvm/tools/sancov/sancov.cpp @@ -103,16 +103,24 @@ cl::desc("Strip this prefix from file paths in reports.")); static cl::opt - ClBlacklist("blacklist", cl::init(""), - cl::desc("Blacklist file (sanitizer blacklist format).")); + ClIgnorelist("ignorelist", cl::init(""), + cl::desc("Ignorelist file (sanitizer ignorelist format).")); + +static cl::opt + ClBlacklist("blacklist", cl::init(""), cl::Hidden, + cl::desc("ignorelist file (sanitizer ignorelist format).")); static cl::opt ClUseDefaultBlacklist( "use_default_blacklist", cl::init(true), cl::Hidden, - cl::desc("Controls if default blacklist should be used.")); + cl::desc("Controls if default ignorelist should be used.")); -static const char *const DefaultBlacklistStr = "fun:__sanitizer_.*\n" - "src:/usr/include/.*\n" - "src:.*/libc\\+\\+/.*\n"; +static cl::opt ClUseDefaultIgnorelist( + "use_default_ignorelist", cl::init(true), cl::Hidden, + cl::desc("Controls if default ignorelist should be used.")); + +static const char *const DefaultIgnorelistStr = "fun:__sanitizer_.*\n" + "src:/usr/include/.*\n" + "src:.*/libc\\+\\+/.*\n"; // --------- FORMAT SPECIFICATION --------- @@ -473,48 +481,53 @@ return stripPathPrefix(sys::path::convert_to_slash(std::string(S))); } -class Blacklists { +class Ignorelists { public: - Blacklists() - : DefaultBlacklist(createDefaultBlacklist()), - UserBlacklist(createUserBlacklist()) {} + Ignorelists() + : DefaultIgnorelist(createDefaultIgnorelist()), + UserIgnorelist(createUserIgnorelist()) {} - bool isBlacklisted(const DILineInfo &I) { - if (DefaultBlacklist && - DefaultBlacklist->inSection("sancov", "fun", I.FunctionName)) + bool isIgnorelisted(const DILineInfo &I) { + if (DefaultIgnorelist && + DefaultIgnorelist->inSection("sancov", "fun", I.FunctionName)) return true; - if (DefaultBlacklist && - DefaultBlacklist->inSection("sancov", "src", I.FileName)) + if (DefaultIgnorelist && + DefaultIgnorelist->inSection("sancov", "src", I.FileName)) return true; - if (UserBlacklist && - UserBlacklist->inSection("sancov", "fun", I.FunctionName)) + if (UserIgnorelist && + UserIgnorelist->inSection("sancov", "fun", I.FunctionName)) return true; - if (UserBlacklist && UserBlacklist->inSection("sancov", "src", I.FileName)) + if (UserIgnorelist && + UserIgnorelist->inSection("sancov", "src", I.FileName)) return true; return false; } private: - static std::unique_ptr createDefaultBlacklist() { - if (!ClUseDefaultBlacklist) + static std::unique_ptr createDefaultIgnorelist() { + if ((!ClUseDefaultIgnorelist) && (!ClUseDefaultBlacklist)) return std::unique_ptr(); std::unique_ptr MB = - MemoryBuffer::getMemBuffer(DefaultBlacklistStr); + MemoryBuffer::getMemBuffer(DefaultIgnorelistStr); std::string Error; - auto Blacklist = SpecialCaseList::create(MB.get(), Error); + auto Ignorelist = SpecialCaseList::create(MB.get(), Error); failIfNotEmpty(Error); - return Blacklist; + return Ignorelist; } - static std::unique_ptr createUserBlacklist() { - if (ClBlacklist.empty()) + static std::unique_ptr createUserIgnorelist() { + if ((ClBlacklist.empty()) && ClIgnorelist.empty()) return std::unique_ptr(); - return SpecialCaseList::createOrDie({{ClBlacklist}}, + if (!ClBlacklist.empty()) + return SpecialCaseList::createOrDie({{ClBlacklist}}, + *vfs::getRealFileSystem()); + + return SpecialCaseList::createOrDie({{ClIgnorelist}}, *vfs::getRealFileSystem()); } - std::unique_ptr DefaultBlacklist; - std::unique_ptr UserBlacklist; + std::unique_ptr DefaultIgnorelist; + std::unique_ptr UserIgnorelist; }; static std::vector @@ -523,7 +536,7 @@ const std::set &CoveredAddrs) { std::vector Result; auto Symbolizer(createSymbolizer()); - Blacklists B; + Ignorelists Ig; std::set CoveredFiles; if (ClSkipDeadFiles) { @@ -561,7 +574,7 @@ CoveredFiles.find(LineInfo->FileName) == CoveredFiles.end()) continue; LineInfo->FileName = normalizeFilename(LineInfo->FileName); - if (B.isBlacklisted(*LineInfo)) + if (Ig.isIgnorelisted(*LineInfo)) continue; auto Id = utohexstr(Addr, true); @@ -578,7 +591,7 @@ CoveredFiles.find(FrameInfo.FileName) == CoveredFiles.end()) continue; FrameInfo.FileName = normalizeFilename(FrameInfo.FileName); - if (B.isBlacklisted(FrameInfo)) + if (Ig.isIgnorelisted(FrameInfo)) continue; if (Infos.find(FrameInfo) == Infos.end()) { Infos.insert(FrameInfo); @@ -878,7 +891,7 @@ Hasher.update((*BufOrErr)->getBuffer()); Coverage->BinaryHash = toHex(Hasher.final()); - Blacklists B; + Ignorelists Ig; auto Symbolizer(createSymbolizer()); for (uint64_t Addr : *Data.Addrs) { @@ -887,7 +900,7 @@ auto LineInfo = Symbolizer->symbolizeCode( ObjectFile, {Addr, object::SectionedAddress::UndefSection}); failIfError(LineInfo); - if (B.isBlacklisted(*LineInfo)) + if (Ig.isIgnorelisted(*LineInfo)) continue; Coverage->CoveredIds.insert(utohexstr(Addr, true));