llvm-cov: Rework the API for getting the coverage of a file (NFC)

This encapsulates how we handle the coverage regions of a file or
function. In the old model, the user had to deal with nested regions,
so they needed to maintain their own auxiliary data structures to get
any useful information out of this. The new API provides a sequence of
non-overlapping coverage segments, which makes it possible to render
coverage information in a single pass and avoids a fair amount of
extra work.

llvm-svn: 217975
diff --git a/llvm/tools/llvm-cov/CodeCoverage.cpp b/llvm/tools/llvm-cov/CodeCoverage.cpp
index fcc1c6b..eef4185 100644
--- a/llvm/tools/llvm-cov/CodeCoverage.cpp
+++ b/llvm/tools/llvm-cov/CodeCoverage.cpp
@@ -284,12 +284,12 @@
     return;
   auto SubView = llvm::make_unique<SourceCoverageView>(SourceBuffer.get(),
                                                        Parent.getOptions());
-  SourceCoverageDataManager RegionManager;
+  auto RegionManager = llvm::make_unique<SourceCoverageDataManager>();
   for (const auto &CR : Function.CountedRegions) {
     if (CR.FileID == ExpandedRegion.ExpandedFileID)
-      RegionManager.insert(CR);
+      RegionManager->insert(CR);
   }
-  SubView->load(RegionManager);
+  SubView->load(std::move(RegionManager));
   createExpansionSubViews(*SubView, ExpandedRegion.ExpandedFileID, Function);
   Parent.addExpansion(ExpandedRegion, std::move(SubView));
 }
@@ -311,16 +311,16 @@
 void CodeCoverageTool::createInstantiationSubView(
     StringRef SourceFile, const FunctionCoverageMapping &Function,
     SourceCoverageView &View) {
-  SourceCoverageDataManager RegionManager;
+  auto RegionManager = llvm::make_unique<SourceCoverageDataManager>();
   SmallSet<unsigned, 8> InterestingFileIDs;
   if (!gatherInterestingFileIDs(SourceFile, Function, InterestingFileIDs))
     return;
   // Get the interesting regions
   for (const auto &CR : Function.CountedRegions) {
     if (InterestingFileIDs.count(CR.FileID))
-      RegionManager.insert(CR);
+      RegionManager->insert(CR);
   }
-  View.load(RegionManager);
+  View.load(std::move(RegionManager));
   unsigned MainFileID;
   if (findMainViewFileID(SourceFile, Function, MainFileID))
     return;
@@ -331,7 +331,7 @@
     StringRef SourceFile, SourceCoverageView &View,
     ArrayRef<FunctionCoverageMapping> FunctionMappingRecords,
     bool UseOnlyRegionsInMainFile) {
-  SourceCoverageDataManager RegionManager;
+  auto RegionManager = llvm::make_unique<SourceCoverageDataManager>();
   FunctionInstantiationSetCollector InstantiationSetCollector;
 
   for (const auto &Function : FunctionMappingRecords) {
@@ -347,14 +347,14 @@
     // Get the interesting regions
     for (const auto &CR : Function.CountedRegions) {
       if (InterestingFileIDs.count(CR.FileID))
-        RegionManager.insert(CR);
+        RegionManager->insert(CR);
     }
     InstantiationSetCollector.insert(Function, MainFileID);
     createExpansionSubViews(View, MainFileID, Function);
   }
-  if (RegionManager.getSourceRegions().empty())
+  if (RegionManager->getCoverageSegments().empty())
     return true;
-  View.load(RegionManager);
+  View.load(std::move(RegionManager));
   // Show instantiations
   if (!ViewOpts.ShowFunctionInstantiations)
     return false;
@@ -626,7 +626,7 @@
       ViewOpts.colored_ostream(outs(), raw_ostream::CYAN)
           << Function.Name << " from " << SourceFile << ":";
       outs() << "\n";
-      mainView.render(outs());
+      mainView.render(outs(), /*WholeFile=*/false);
       if (FunctionMappingRecords.size() > 1)
         outs() << "\n";
     }
@@ -663,7 +663,7 @@
       ViewOpts.colored_ostream(outs(), raw_ostream::CYAN) << SourceFile << ":";
       outs() << "\n";
     }
-    mainView.render(outs());
+    mainView.render(outs(), /*Wholefile=*/true);
     if (SourceFiles.size() > 1)
       outs() << "\n";
   }