llvm-cov: Fix an issue with showing regions but not counts
authorJustin Bogner <mail@justinbogner.com>
Mon, 15 Sep 2014 22:12:28 +0000 (22:12 +0000)
committerJustin Bogner <mail@justinbogner.com>
Mon, 15 Sep 2014 22:12:28 +0000 (22:12 +0000)
In r217746, though it was supposed to be NFC, I broke llvm-cov's
handling of showing regions without showing counts. This should've
shown up in the existing tests, except they were checking debug output
that was displayed regardless of what was actually output. I've moved
the relevant debug output to a more appropriate place so that the
tests catch this kind of thing.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@217835 91177308-0d34-0410-b5e6-96231b3b80d8

test/tools/llvm-cov/showRegionMarkers.cpp
tools/llvm-cov/SourceCoverageView.cpp
tools/llvm-cov/SourceCoverageView.h

index 2e6d3a94bd3032ace992a0b3122c653160f806f1..136c3bf7cac3460678551a67db1daa0ef70c4e3d 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: llvm-cov show %S/Inputs/regionMarkers.covmapping -instr-profile %S/Inputs/regionMarkers.profdata -show-regions -dump -filename-equivalence %s | FileCheck %s
+// RUN: llvm-cov show %S/Inputs/regionMarkers.covmapping -instr-profile %S/Inputs/regionMarkers.profdata -show-regions -dump -filename-equivalence %s 2>&1 | FileCheck %s
 
 int main() {                      // CHECK: Marker at [[@LINE]]:12 = 1
   int x = 0;
index 87a68e0db032ec30266f661f66c96160c258ec7a..7c6d9a5c0f38cbc3b015abfc872fbddec26c16d6 100644 (file)
@@ -118,6 +118,13 @@ void SourceCoverageView::renderRegionMarkers(raw_ostream &OS,
     Buffer.clear();
   }
   OS << "\n";
+
+  if (Options.Debug) {
+    for (const auto &Region : Regions) {
+      errs() << "Marker at " << Region.Line << ":" << Region.Column << " = "
+             << Region.ExecutionCount << "\n";
+    }
+  }
 }
 
 /// \brief Insert a new highlighting range into the line's highlighting ranges
@@ -316,17 +323,24 @@ void SourceCoverageView::render(raw_ostream &OS, unsigned Offset) {
   }
 }
 
-void
-SourceCoverageView::createLineCoverageInfo(SourceCoverageDataManager &Data) {
+void SourceCoverageView::setUpVisibleRange(SourceCoverageDataManager &Data) {
   auto CountedRegions = Data.getSourceRegions();
   if (!CountedRegions.size())
     return;
 
-  LineOffset = CountedRegions.front().LineStart;
-  LineStats.resize(CountedRegions.front().LineEnd - LineOffset + 1);
+  unsigned Start = CountedRegions.front().LineStart, End = 0;
+  for (const auto &CR : CountedRegions) {
+    Start = std::min(Start, CR.LineStart);
+    End = std::max(End, CR.LineEnd);
+  }
+  LineOffset = Start;
+  LineStats.resize(End - Start + 1);
+}
+
+void
+SourceCoverageView::createLineCoverageInfo(SourceCoverageDataManager &Data) {
+  auto CountedRegions = Data.getSourceRegions();
   for (const auto &CR : CountedRegions) {
-    if (CR.LineEnd > LineStats.size())
-      LineStats.resize(CR.LineEnd - LineOffset + 1);
     if (CR.Kind == coverage::CounterMappingRegion::SkippedRegion) {
       // Reset the line stats for skipped regions.
       for (unsigned Line = CR.LineStart; Line <= CR.LineEnd;
@@ -395,16 +409,10 @@ void SourceCoverageView::createRegionMarkers(SourceCoverageDataManager &Data) {
     if (CR.Kind != coverage::CounterMappingRegion::SkippedRegion)
       Markers.push_back(
           RegionMarker(CR.LineStart, CR.ColumnStart, CR.ExecutionCount));
-
-  if (Options.Debug) {
-    for (const auto &Marker : Markers) {
-      outs() << "Marker at " << Marker.Line << ":" << Marker.Column << " = "
-             << Marker.ExecutionCount << "\n";
-    }
-  }
 }
 
 void SourceCoverageView::load(SourceCoverageDataManager &Data) {
+  setUpVisibleRange(Data);
   if (Options.ShowLineStats)
     createLineCoverageInfo(Data);
   if (Options.Colors)
index 37d4027a56871d6d721b5315e2598676ebed752d..362ff1a4cbd061930d578fe43ad5d31db70e8f88 100644 (file)
@@ -119,6 +119,9 @@ private:
   std::vector<RegionMarker> Markers;
   StringRef FunctionName;
 
+  /// \brief Initialize the visible source range for this view.
+  void setUpVisibleRange(SourceCoverageDataManager &Data);
+
   /// \brief Create the line coverage information using the coverage data.
   void createLineCoverageInfo(SourceCoverageDataManager &Data);