blob: 7847a2abf48c73ccded1307ce592521892dd0645 [file] [log] [blame]
Alex Lorenz6c7a6a12014-08-22 22:56:03 +00001//===- CoverageSummaryInfo.cpp - Coverage summary for function/file -------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// These structures are used to represent code coverage metrics
11// for functions/files.
12//
13//===----------------------------------------------------------------------===//
14
15#include "CoverageSummaryInfo.h"
16
17using namespace llvm;
18using namespace coverage;
19
20FunctionCoverageSummary
Vedant Kumar1ef0d5a2017-09-19 02:00:12 +000021FunctionCoverageSummary::get(const CoverageMapping &CM,
22 const coverage::FunctionRecord &Function) {
Ying Yibb5cae82016-07-22 09:20:21 +000023 // Compute the region coverage.
Alex Lorenz6c7a6a12014-08-22 22:56:03 +000024 size_t NumCodeRegions = 0, CoveredRegions = 0;
Justin Bogner74a60252014-09-09 05:32:14 +000025 for (auto &CR : Function.CountedRegions) {
26 if (CR.Kind != CounterMappingRegion::CodeRegion)
Alex Lorenz6c7a6a12014-08-22 22:56:03 +000027 continue;
28 ++NumCodeRegions;
Justin Bogner74a60252014-09-09 05:32:14 +000029 if (CR.ExecutionCount != 0)
Alex Lorenz6c7a6a12014-08-22 22:56:03 +000030 ++CoveredRegions;
31 }
32
33 // Compute the line coverage
34 size_t NumLines = 0, CoveredLines = 0;
Vedant Kumar1ef0d5a2017-09-19 02:00:12 +000035 CoverageData CD = CM.getCoverageForFunction(Function);
Vedant Kumar53719452017-10-14 02:27:29 +000036 for (const auto &LCS : getLineCoverageStats(CD)) {
37 if (!LCS.isMapped())
38 continue;
39 ++NumLines;
40 if (LCS.getExecutionCount())
41 ++CoveredLines;
Alex Lorenz6c7a6a12014-08-22 22:56:03 +000042 }
Vedant Kumar1ef0d5a2017-09-19 02:00:12 +000043
Alex Lorenz6c7a6a12014-08-22 22:56:03 +000044 return FunctionCoverageSummary(
Alex Lorenz38c59de2014-09-30 12:45:13 +000045 Function.Name, Function.ExecutionCount,
46 RegionCoverageInfo(CoveredRegions, NumCodeRegions),
Vedant Kumar1b70b5d2016-09-19 01:46:01 +000047 LineCoverageInfo(CoveredLines, NumLines));
Alex Lorenz6c7a6a12014-08-22 22:56:03 +000048}
Vedant Kumare17f26f2016-09-19 00:38:23 +000049
Vedant Kumara8dfa812017-08-02 23:35:25 +000050FunctionCoverageSummary
51FunctionCoverageSummary::get(const InstantiationGroup &Group,
52 ArrayRef<FunctionCoverageSummary> Summaries) {
53 std::string Name;
54 if (Group.hasName()) {
55 Name = Group.getName();
56 } else {
57 llvm::raw_string_ostream OS(Name);
58 OS << "Definition at line " << Group.getLine() << ", column "
59 << Group.getColumn();
60 }
61
Vedant Kumar31b24fc2017-09-08 18:44:49 +000062 FunctionCoverageSummary Summary(Name);
Vedant Kumara8dfa812017-08-02 23:35:25 +000063 Summary.ExecutionCount = Group.getTotalExecutionCount();
64 Summary.RegionCoverage = Summaries[0].RegionCoverage;
65 Summary.LineCoverage = Summaries[0].LineCoverage;
66 for (const auto &FCS : Summaries.drop_front()) {
Vedant Kumarc94f3922017-09-15 23:00:01 +000067 Summary.RegionCoverage.merge(FCS.RegionCoverage);
68 Summary.LineCoverage.merge(FCS.LineCoverage);
Vedant Kumara8dfa812017-08-02 23:35:25 +000069 }
70 return Summary;
Vedant Kumare17f26f2016-09-19 00:38:23 +000071}