[llvm] r276924 - [llvm-cov] Add a debug mode for source range highlighting (in html)

Vedant Kumar via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 27 14:57:15 PDT 2016


Author: vedantk
Date: Wed Jul 27 16:57:15 2016
New Revision: 276924

URL: http://llvm.org/viewvc/llvm-project?rev=276924&view=rev
Log:
[llvm-cov] Add a debug mode for source range highlighting (in html)

llvm-cov's `-dump' option now emits information which helps debug source
range highlighting in html mode.

Modified:
    llvm/trunk/test/tools/llvm-cov/showHighlightedRanges.cpp
    llvm/trunk/tools/llvm-cov/SourceCoverageViewHTML.cpp

Modified: llvm/trunk/test/tools/llvm-cov/showHighlightedRanges.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cov/showHighlightedRanges.cpp?rev=276924&r1=276923&r2=276924&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-cov/showHighlightedRanges.cpp (original)
+++ llvm/trunk/test/tools/llvm-cov/showHighlightedRanges.cpp Wed Jul 27 16:57:15 2016
@@ -1,39 +1,39 @@
-// RUN: llvm-cov show %S/Inputs/highlightedRanges.covmapping -instr-profile %S/Inputs/highlightedRanges.profdata -dump -filename-equivalence %s 2>&1 | FileCheck %s
+// RUN: llvm-cov show %S/Inputs/highlightedRanges.covmapping -instr-profile %S/Inputs/highlightedRanges.profdata -dump -filename-equivalence %s 2>&1 | FileCheck %s -check-prefixes=TEXT,SHARED
 
 void func() {
-  return;
-  int i = 0;                     // CHECK: Highlighted line [[@LINE]], 3 -> ?
-}                                // CHECK: Highlighted line [[@LINE]], 1 -> 2
+  return;                        // TEXT: Highlighted line [[@LINE+1]], 3 -> ?
+  int i = 0;                     // HTML: Highlighted line [[@LINE]], 1 ->
+}                                // SHARED: Highlighted line [[@LINE]], 1 -> 2
 
 void func2(int x) {
   if(x > 5) {
     while(x >= 9) {
       return;
-      --x;                       // CHECK: Highlighted line [[@LINE]], 7 -> ?
-    }                            // CHECK: Highlighted line [[@LINE]], 1 -> 6
-    int i = 0;                   // CHECK: Highlighted line [[@LINE]], 5 -> ?
-  }                              // CHECK: Highlighted line [[@LINE]], 1 -> 4
+      --x;                       // TEXT: Highlighted line [[@LINE]], 7 -> ?
+    }                            // SHARED: Highlighted line [[@LINE]], 1 -> 6
+    int i = 0;                   // TEXT: Highlighted line [[@LINE]], 5 -> ?
+  }                              // SHARED: Highlighted line [[@LINE]], 1 -> 4
 }
 
 void test() {
   int x = 0;
 
-  if (x) {                       // CHECK: Highlighted line [[@LINE]], 10 -> ?
-    x = 0;                       // CHECK: Highlighted line [[@LINE]], 1 -> ?
-  } else {                       // CHECK: Highlighted line [[@LINE]], 1 -> 4
+  if (x) {                       // TEXT: Highlighted line [[@LINE]], 10 -> ?
+    x = 0;                       // SHARED: Highlighted line [[@LINE]], 1 -> ?
+  } else {                       // TEXT: Highlighted line [[@LINE]], 1 -> 4
     x = 1;
   }
 
-                                  // CHECK: Highlighted line [[@LINE+1]], 26 -> 29
-  for (int i = 0; i < 0; ++i) {   // CHECK: Highlighted line [[@LINE]], 31 -> ?
-    x = 1;                        // CHECK: Highlighted line [[@LINE]], 1 -> ?
-  }                               // CHECK: Highlighted line [[@LINE]], 1 -> 4
+                                  // TEXT: Highlighted line [[@LINE+1]], 26 -> 29
+  for (int i = 0; i < 0; ++i) {   // TEXT: Highlighted line [[@LINE]], 31 -> ?
+    x = 1;                        // TEXT: Highlighted line [[@LINE]], 1 -> ?
+  }                               // SHARED: Highlighted line [[@LINE]], 1 -> 4
 
   x = x < 10 ? x +
                1
-             : x - 1;             // CHECK: Highlighted line [[@LINE]], 16 -> 21
-  x = x > 10 ? x +                // CHECK: Highlighted line [[@LINE]], 16 -> ?
-               1                  // CHECK: Highlighted line [[@LINE]], 1 -> 17
+             : x - 1;             // TEXT: Highlighted line [[@LINE]], 16 -> 21
+  x = x > 10 ? x +                // TEXT: Highlighted line [[@LINE]], 16 -> ?
+               1                  // SHARED: Highlighted line [[@LINE]], 1 -> 17
              : x - 1;
 }
 
@@ -44,4 +44,5 @@ int main() {
   return 0;
 }
 
+// RUN: llvm-cov show %S/Inputs/highlightedRanges.covmapping -instr-profile %S/Inputs/highlightedRanges.profdata -format html -dump -filename-equivalence %s 2>&1 | FileCheck %s -check-prefixes=HTML,SHARED
 // RUN: llvm-cov export %S/Inputs/highlightedRanges.covmapping -instr-profile %S/Inputs/highlightedRanges.profdata 2>&1 | FileCheck %S/Inputs/highlightedRanges.json

Modified: llvm/trunk/tools/llvm-cov/SourceCoverageViewHTML.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-cov/SourceCoverageViewHTML.cpp?rev=276924&r1=276923&r2=276924&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-cov/SourceCoverageViewHTML.cpp (original)
+++ llvm/trunk/tools/llvm-cov/SourceCoverageViewHTML.cpp Wed Jul 27 16:57:15 2016
@@ -304,6 +304,7 @@ void SourceCoverageViewHTML::renderLine(
     raw_ostream &OS, LineRef L, const coverage::CoverageSegment *WrappedSegment,
     CoverageSegmentArray Segments, unsigned ExpansionCol, unsigned) {
   StringRef Line = L.Line;
+  unsigned LineNo = L.LineNo;
 
   // Steps for handling text-escaping, highlighting, and tooltip creation:
   //
@@ -337,27 +338,34 @@ void SourceCoverageViewHTML::renderLine(
   for (unsigned I = 0, E = Snippets.size(); I < E; ++I)
     Snippets[I] = escape(Snippets[I]);
 
-  // 3. Use \p WrappedSegment to set the highlight for snippets 0 and 1. Use
-  //    segment 1 to set the highlight for snippet 2, segment 2 to set the
-  //    highlight for snippet 3, and so on.
+  // 3. Use \p WrappedSegment to set the highlight for snippet 0. Use segment
+  //    1 to set the highlight for snippet 2, segment 2 to set the highlight for
+  //    snippet 3, and so on.
 
   Optional<std::string> Color;
-  auto Highlight = [&](const std::string &Snippet) {
+  SmallVector<std::pair<unsigned, unsigned>, 4> HighlightedRanges;
+  auto Highlight = [&](const std::string &Snippet, unsigned LC, unsigned RC) {
+    if (getOptions().Debug) {
+      if (!HighlightedRanges.empty() &&
+          HighlightedRanges.back().second == LC - 1) {
+        HighlightedRanges.back().second = RC;
+      } else
+        HighlightedRanges.emplace_back(LC, RC);
+    }
     return tag("span", Snippet, Color.getValue());
   };
 
   auto CheckIfUncovered = [](const coverage::CoverageSegment *S) {
-    return S && S->HasCount && S->Count == 0;
+    return S && (S->HasCount && S->Count == 0);
   };
 
   if (CheckIfUncovered(WrappedSegment) ||
       CheckIfUncovered(Segments.empty() ? nullptr : Segments.front())) {
     Color = "red";
-    Snippets[0] = Highlight(Snippets[0]);
-    Snippets[1] = Highlight(Snippets[1]);
+    Snippets[0] = Highlight(Snippets[0], 0, Snippets[0].size());
   }
 
-  for (unsigned I = 1, E = Segments.size(); I < E; ++I) {
+  for (unsigned I = 0, E = Segments.size(); I < E; ++I) {
     const auto *CurSeg = Segments[I];
     if (CurSeg->Col == ExpansionCol)
       Color = "cyan";
@@ -367,7 +375,23 @@ void SourceCoverageViewHTML::renderLine(
       Color = None;
 
     if (Color.hasValue())
-      Snippets[I + 1] = Highlight(Snippets[I + 1]);
+      Snippets[I + 1] = Highlight(Snippets[I + 1], CurSeg->Col,
+                                  CurSeg->Col + Snippets[I + 1].size());
+  }
+
+  if (Color.hasValue() && Segments.empty())
+    Snippets.back() = Highlight(Snippets.back(), Snippets[0].size(), 0);
+
+  if (getOptions().Debug) {
+    for (const auto &Range : HighlightedRanges) {
+      errs() << "Highlighted line " << LineNo << ", " << Range.first + 1
+             << " -> ";
+      if (Range.second == 0)
+        errs() << "?";
+      else
+        errs() << Range.second + 1;
+      errs() << "\n";
+    }
   }
 
   // 4. Snippets[1:N+1] correspond to \p Segments[0:N]: use these to generate
@@ -390,7 +414,7 @@ void SourceCoverageViewHTML::renderLine(
 
       Snippets[I + 1] =
           tag("div", Snippets[I + 1] + tag("span", formatCount(CurSeg->Count),
-                                          "tooltip-content"),
+                                           "tooltip-content"),
               "tooltip");
     }
   }




More information about the llvm-commits mailing list