diff options
Diffstat (limited to 'llvm/tools/llvm-cov/CoverageSummaryInfo.cpp')
| -rw-r--r-- | llvm/tools/llvm-cov/CoverageSummaryInfo.cpp | 70 | 
1 files changed, 70 insertions, 0 deletions
| diff --git a/llvm/tools/llvm-cov/CoverageSummaryInfo.cpp b/llvm/tools/llvm-cov/CoverageSummaryInfo.cpp new file mode 100644 index 0000000000000..1029f7784040d --- /dev/null +++ b/llvm/tools/llvm-cov/CoverageSummaryInfo.cpp @@ -0,0 +1,70 @@ +//===- CoverageSummaryInfo.cpp - Coverage summary for function/file -------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// 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; +} | 
