mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-02 16:36:40 +00:00
f1c5f8681a
LineCoverageIterator makes it easy for clients of coverage data to determine line execution counts for a file or function. The coverage iteration logic is tricky enough that it really pays not to have multiple copies of it. Hopefully having just one implementation in LLVM will make the iteration logic easier to test, reuse, and update. This commit is NFC but I've added a unit test to go along with it just because it's easy to do now. llvm-svn: 316141
72 lines
2.2 KiB
C++
72 lines
2.2 KiB
C++
//===- 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;
|
|
}
|