| //===- CoverageSummaryInfo.cpp - Coverage summary for function/file -------===// | 
 | // | 
 | //                     The LLVM Compiler Infrastructure | 
 | // | 
 | // This file is distributed under the University of Illinois Open Source | 
 | // License. See LICENSE.TXT for details. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 | // | 
 | // These structures are used to represent code coverage metrics | 
 | // for functions/files. | 
 | // | 
 | //===----------------------------------------------------------------------===// | 
 |  | 
 | #include "CoverageSummaryInfo.h" | 
 |  | 
 | using namespace llvm; | 
 | using namespace coverage; | 
 |  | 
 | FunctionCoverageSummary | 
 | FunctionCoverageSummary::get(const CoverageMapping &CM, | 
 |                              const coverage::FunctionRecord &Function) { | 
 |   // Compute the region coverage. | 
 |   size_t NumCodeRegions = 0, CoveredRegions = 0; | 
 |   for (auto &CR : Function.CountedRegions) { | 
 |     if (CR.Kind != CounterMappingRegion::CodeRegion) | 
 |       continue; | 
 |     ++NumCodeRegions; | 
 |     if (CR.ExecutionCount != 0) | 
 |       ++CoveredRegions; | 
 |   } | 
 |  | 
 |   // Compute the line coverage | 
 |   size_t NumLines = 0, CoveredLines = 0; | 
 |   CoverageData CD = CM.getCoverageForFunction(Function); | 
 |   for (const auto &LCS : getLineCoverageStats(CD)) { | 
 |     if (!LCS.isMapped()) | 
 |       continue; | 
 |     ++NumLines; | 
 |     if (LCS.getExecutionCount()) | 
 |       ++CoveredLines; | 
 |   } | 
 |  | 
 |   return FunctionCoverageSummary( | 
 |       Function.Name, Function.ExecutionCount, | 
 |       RegionCoverageInfo(CoveredRegions, NumCodeRegions), | 
 |       LineCoverageInfo(CoveredLines, NumLines)); | 
 | } | 
 |  | 
 | FunctionCoverageSummary | 
 | FunctionCoverageSummary::get(const InstantiationGroup &Group, | 
 |                              ArrayRef<FunctionCoverageSummary> Summaries) { | 
 |   std::string Name; | 
 |   if (Group.hasName()) { | 
 |     Name = Group.getName(); | 
 |   } else { | 
 |     llvm::raw_string_ostream OS(Name); | 
 |     OS << "Definition at line " << Group.getLine() << ", column " | 
 |        << Group.getColumn(); | 
 |   } | 
 |  | 
 |   FunctionCoverageSummary Summary(Name); | 
 |   Summary.ExecutionCount = Group.getTotalExecutionCount(); | 
 |   Summary.RegionCoverage = Summaries[0].RegionCoverage; | 
 |   Summary.LineCoverage = Summaries[0].LineCoverage; | 
 |   for (const auto &FCS : Summaries.drop_front()) { | 
 |     Summary.RegionCoverage.merge(FCS.RegionCoverage); | 
 |     Summary.LineCoverage.merge(FCS.LineCoverage); | 
 |   } | 
 |   return Summary; | 
 | } |