[llvm] r264222 - [sancov] -print-coverage-stats option to print various coverage statistics.

Mike Aizatsky via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 23 17:00:08 PDT 2016


Author: aizatsky
Date: Wed Mar 23 19:00:08 2016
New Revision: 264222

URL: http://llvm.org/viewvc/llvm-project?rev=264222&view=rev
Log:
[sancov] -print-coverage-stats option to print various coverage statistics.

Differential Revision: http://reviews.llvm.org/D18418

Added:
    llvm/trunk/test/tools/sancov/stats.test
Modified:
    llvm/trunk/tools/sancov/sancov.cc

Added: llvm/trunk/test/tools/sancov/stats.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/sancov/stats.test?rev=264222&view=auto
==============================================================================
--- llvm/trunk/test/tools/sancov/stats.test (added)
+++ llvm/trunk/test/tools/sancov/stats.test Wed Mar 23 19:00:08 2016
@@ -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
+
+

Modified: llvm/trunk/tools/sancov/sancov.cc
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/sancov/sancov.cc?rev=264222&r1=264221&r2=264222&view=diff
==============================================================================
--- llvm/trunk/tools/sancov/sancov.cc (original)
+++ llvm/trunk/tools/sancov/sancov.cc Wed Mar 23 19:00:08 2016
@@ -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:
   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");




More information about the llvm-commits mailing list