| //===- 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; | |
| } |