1 //===- CoverageSummaryInfo.cpp - Coverage summary for function/file -------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // These structures are used to represent code coverage metrics
10 // for functions/files.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #include "CoverageSummaryInfo.h"
15
16 using namespace llvm;
17 using namespace coverage;
18
19 FunctionCoverageSummary
get(const CoverageMapping & CM,const coverage::FunctionRecord & Function)20 FunctionCoverageSummary::get(const CoverageMapping &CM,
21 const coverage::FunctionRecord &Function) {
22 // Compute the region coverage.
23 size_t NumCodeRegions = 0, CoveredRegions = 0;
24 for (auto &CR : Function.CountedRegions) {
25 if (CR.Kind != CounterMappingRegion::CodeRegion)
26 continue;
27 ++NumCodeRegions;
28 if (CR.ExecutionCount != 0)
29 ++CoveredRegions;
30 }
31
32 // Compute the line coverage
33 size_t NumLines = 0, CoveredLines = 0;
34 CoverageData CD = CM.getCoverageForFunction(Function);
35 for (const auto &LCS : getLineCoverageStats(CD)) {
36 if (!LCS.isMapped())
37 continue;
38 ++NumLines;
39 if (LCS.getExecutionCount())
40 ++CoveredLines;
41 }
42
43 return FunctionCoverageSummary(
44 Function.Name, Function.ExecutionCount,
45 RegionCoverageInfo(CoveredRegions, NumCodeRegions),
46 LineCoverageInfo(CoveredLines, NumLines));
47 }
48
49 FunctionCoverageSummary
get(const InstantiationGroup & Group,ArrayRef<FunctionCoverageSummary> Summaries)50 FunctionCoverageSummary::get(const InstantiationGroup &Group,
51 ArrayRef<FunctionCoverageSummary> Summaries) {
52 std::string Name;
53 if (Group.hasName()) {
54 Name = Group.getName();
55 } else {
56 llvm::raw_string_ostream OS(Name);
57 OS << "Definition at line " << Group.getLine() << ", column "
58 << Group.getColumn();
59 }
60
61 FunctionCoverageSummary Summary(Name);
62 Summary.ExecutionCount = Group.getTotalExecutionCount();
63 Summary.RegionCoverage = Summaries[0].RegionCoverage;
64 Summary.LineCoverage = Summaries[0].LineCoverage;
65 for (const auto &FCS : Summaries.drop_front()) {
66 Summary.RegionCoverage.merge(FCS.RegionCoverage);
67 Summary.LineCoverage.merge(FCS.LineCoverage);
68 }
69 return Summary;
70 }
71