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 000000000000..1029f7784040 --- /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; +} |