diff options
author | Mike Aizatsky <aizatsky@chromium.org> | 2016-03-24 00:00:08 +0000 |
---|---|---|
committer | Mike Aizatsky <aizatsky@chromium.org> | 2016-03-24 00:00:08 +0000 |
commit | 5c79bb364a3bf3de914a34492cf9fabcc53fa3b5 (patch) | |
tree | 696810382d1babfff24be71092b66d8f61c8ebb3 | |
parent | e7aad357a95be22a91d4d7d4131fb5fcf49f50ca (diff) | |
download | bcm5719-llvm-5c79bb364a3bf3de914a34492cf9fabcc53fa3b5.tar.gz bcm5719-llvm-5c79bb364a3bf3de914a34492cf9fabcc53fa3b5.zip |
[sancov] -print-coverage-stats option to print various coverage statistics.
Differential Revision: http://reviews.llvm.org/D18418
llvm-svn: 264222
-rw-r--r-- | llvm/test/tools/sancov/stats.test | 9 | ||||
-rw-r--r-- | llvm/tools/sancov/sancov.cc | 54 |
2 files changed, 59 insertions, 4 deletions
diff --git a/llvm/test/tools/sancov/stats.test b/llvm/test/tools/sancov/stats.test new file mode 100644 index 00000000000..e91100b941b --- /dev/null +++ b/llvm/test/tools/sancov/stats.test @@ -0,0 +1,9 @@ +REQUIRES: x86_64-linux +RUN: sancov -print-coverage-stats %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.0.sancov | FileCheck %s + +CHECK: all-points: 16 +CHECK: cov-points: 7 +CHECK: all-fns: 3 +CHECK: cov-fns: 2 + + diff --git a/llvm/tools/sancov/sancov.cc b/llvm/tools/sancov/sancov.cc index d7dd8b67492..31671f7b08e 100644 --- a/llvm/tools/sancov/sancov.cc +++ b/llvm/tools/sancov/sancov.cc @@ -63,7 +63,8 @@ enum ActionType { PrintCovPointsAction, CoveredFunctionsAction, NotCoveredFunctionsAction, - HtmlReportAction + HtmlReportAction, + StatsAction }; cl::opt<ActionType> Action( @@ -77,6 +78,8 @@ cl::opt<ActionType> Action( "Print all not covered funcions."), clEnumValN(HtmlReportAction, "html-report", "Print HTML coverage report."), + clEnumValN(StatsAction, "print-coverage-stats", + "Print coverage statistics."), clEnumValEnd)); static cl::list<std::string> @@ -516,6 +519,23 @@ static ErrorOr<bool> isCoverageFile(std::string FileName) { return Header->Magic == BinCoverageMagic; } +struct CoverageStats { + CoverageStats() : AllPoints(0), CovPoints(0), AllFns(0), CovFns(0) {} + + size_t AllPoints; + size_t CovPoints; + size_t AllFns; + size_t CovFns; +}; + +static raw_ostream &operator<<(raw_ostream &OS, const CoverageStats &Stats) { + OS << "all-points: " << Stats.AllPoints << "\n"; + OS << "cov-points: " << Stats.CovPoints << "\n"; + OS << "all-fns: " << Stats.AllFns << "\n"; + OS << "cov-fns: " << Stats.CovFns << "\n"; + return OS; +} + class CoverageData { public: // Read single file coverage data. @@ -615,9 +635,8 @@ public: MIXED = 3 }; - SourceCoverageData(std::string ObjectFile, const std::set<uint64_t> &Addrs) { - std::set<uint64_t> AllCovPoints = getCoveragePoints(ObjectFile); - + SourceCoverageData(std::string ObjectFile, const std::set<uint64_t> &Addrs) + : AllCovPoints(getCoveragePoints(ObjectFile)) { if (!std::includes(AllCovPoints.begin(), AllCovPoints.end(), Addrs.begin(), Addrs.end())) { Fail("Coverage points in binary and .sancov file do not match."); @@ -776,7 +795,15 @@ public: return Files; } + void collectStats(CoverageStats *Stats) const { + Stats->AllPoints += AllCovPoints.size(); + Stats->AllFns += computeAllFunctions().size(); + Stats->CovFns += computeCoveredFunctions().size(); + } + private: + const std::set<uint64_t> AllCovPoints; + std::vector<AddrInfo> AllAddrInfo; std::vector<AddrInfo> CovAddrInfo; }; @@ -954,6 +981,13 @@ public: } } + void collectStats(CoverageStats *Stats) const { + Stats->CovPoints += Addrs->size(); + + SourceCoverageData SCovData(ObjectFile, *Addrs); + SCovData.collectStats(Stats); + } + private: CoverageDataWithObjectFile(std::string ObjectFile, std::unique_ptr<CoverageData> Coverage) @@ -1048,6 +1082,14 @@ public: } } + void printStats(raw_ostream &OS) const { + CoverageStats Stats; + for (const auto &Cov : Coverage) { + Cov->collectStats(&Stats); + } + OS << Stats; + } + void printReport(raw_ostream &OS) const { auto Title = (llvm::sys::path::filename(MainObjFile) + " Coverage Report").str(); @@ -1172,6 +1214,10 @@ int main(int argc, char **argv) { CovDataSet.get()->printReport(outs()); return 0; } + case StatsAction: { + CovDataSet.get()->printStats(outs()); + return 0; + } case PrintAction: case PrintCovPointsAction: llvm_unreachable("unsupported action"); |