1*9880d681SAndroid Build Coastguard Worker //===- CoverageSummaryInfo.h - Coverage summary for function/file ---------===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker // These structures are used to represent code coverage metrics 11*9880d681SAndroid Build Coastguard Worker // for functions/files. 12*9880d681SAndroid Build Coastguard Worker // 13*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_COV_COVERAGESUMMARYINFO_H 16*9880d681SAndroid Build Coastguard Worker #define LLVM_COV_COVERAGESUMMARYINFO_H 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Worker #include "llvm/ProfileData/Coverage/CoverageMapping.h" 19*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h" 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker namespace llvm { 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker /// \brief Provides information about region coverage for a function/file. 24*9880d681SAndroid Build Coastguard Worker struct RegionCoverageInfo { 25*9880d681SAndroid Build Coastguard Worker /// \brief The number of regions that were executed at least once. 26*9880d681SAndroid Build Coastguard Worker size_t Covered; 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker /// \brief The number of regions that weren't executed. 29*9880d681SAndroid Build Coastguard Worker size_t NotCovered; 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker /// \brief The total number of regions in a function/file. 32*9880d681SAndroid Build Coastguard Worker size_t NumRegions; 33*9880d681SAndroid Build Coastguard Worker RegionCoverageInfoRegionCoverageInfo34*9880d681SAndroid Build Coastguard Worker RegionCoverageInfo() : Covered(0), NotCovered(0), NumRegions(0) {} 35*9880d681SAndroid Build Coastguard Worker RegionCoverageInfoRegionCoverageInfo36*9880d681SAndroid Build Coastguard Worker RegionCoverageInfo(size_t Covered, size_t NumRegions) 37*9880d681SAndroid Build Coastguard Worker : Covered(Covered), NotCovered(NumRegions - Covered), 38*9880d681SAndroid Build Coastguard Worker NumRegions(NumRegions) {} 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker RegionCoverageInfo &operator+=(const RegionCoverageInfo &RHS) { 41*9880d681SAndroid Build Coastguard Worker Covered += RHS.Covered; 42*9880d681SAndroid Build Coastguard Worker NotCovered += RHS.NotCovered; 43*9880d681SAndroid Build Coastguard Worker NumRegions += RHS.NumRegions; 44*9880d681SAndroid Build Coastguard Worker return *this; 45*9880d681SAndroid Build Coastguard Worker } 46*9880d681SAndroid Build Coastguard Worker isFullyCoveredRegionCoverageInfo47*9880d681SAndroid Build Coastguard Worker bool isFullyCovered() const { return Covered == NumRegions; } 48*9880d681SAndroid Build Coastguard Worker getPercentCoveredRegionCoverageInfo49*9880d681SAndroid Build Coastguard Worker double getPercentCovered() const { 50*9880d681SAndroid Build Coastguard Worker if (NumRegions == 0) 51*9880d681SAndroid Build Coastguard Worker return 0.0; 52*9880d681SAndroid Build Coastguard Worker return double(Covered) / double(NumRegions) * 100.0; 53*9880d681SAndroid Build Coastguard Worker } 54*9880d681SAndroid Build Coastguard Worker }; 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker /// \brief Provides information about line coverage for a function/file. 57*9880d681SAndroid Build Coastguard Worker struct LineCoverageInfo { 58*9880d681SAndroid Build Coastguard Worker /// \brief The number of lines that were executed at least once. 59*9880d681SAndroid Build Coastguard Worker size_t Covered; 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker /// \brief The number of lines that weren't executed. 62*9880d681SAndroid Build Coastguard Worker size_t NotCovered; 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker /// \brief The number of lines that aren't code. 65*9880d681SAndroid Build Coastguard Worker size_t NonCodeLines; 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker /// \brief The total number of lines in a function/file. 68*9880d681SAndroid Build Coastguard Worker size_t NumLines; 69*9880d681SAndroid Build Coastguard Worker LineCoverageInfoLineCoverageInfo70*9880d681SAndroid Build Coastguard Worker LineCoverageInfo() 71*9880d681SAndroid Build Coastguard Worker : Covered(0), NotCovered(0), NonCodeLines(0), NumLines(0) {} 72*9880d681SAndroid Build Coastguard Worker LineCoverageInfoLineCoverageInfo73*9880d681SAndroid Build Coastguard Worker LineCoverageInfo(size_t Covered, size_t NumNonCodeLines, size_t NumLines) 74*9880d681SAndroid Build Coastguard Worker : Covered(Covered), NotCovered(NumLines - NumNonCodeLines - Covered), 75*9880d681SAndroid Build Coastguard Worker NonCodeLines(NumNonCodeLines), NumLines(NumLines) {} 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Worker LineCoverageInfo &operator+=(const LineCoverageInfo &RHS) { 78*9880d681SAndroid Build Coastguard Worker Covered += RHS.Covered; 79*9880d681SAndroid Build Coastguard Worker NotCovered += RHS.NotCovered; 80*9880d681SAndroid Build Coastguard Worker NonCodeLines += RHS.NonCodeLines; 81*9880d681SAndroid Build Coastguard Worker NumLines += RHS.NumLines; 82*9880d681SAndroid Build Coastguard Worker return *this; 83*9880d681SAndroid Build Coastguard Worker } 84*9880d681SAndroid Build Coastguard Worker isFullyCoveredLineCoverageInfo85*9880d681SAndroid Build Coastguard Worker bool isFullyCovered() const { return Covered == (NumLines - NonCodeLines); } 86*9880d681SAndroid Build Coastguard Worker getPercentCoveredLineCoverageInfo87*9880d681SAndroid Build Coastguard Worker double getPercentCovered() const { 88*9880d681SAndroid Build Coastguard Worker if (NumLines - NonCodeLines == 0) 89*9880d681SAndroid Build Coastguard Worker return 0.0; 90*9880d681SAndroid Build Coastguard Worker return double(Covered) / double(NumLines - NonCodeLines) * 100.0; 91*9880d681SAndroid Build Coastguard Worker } 92*9880d681SAndroid Build Coastguard Worker }; 93*9880d681SAndroid Build Coastguard Worker 94*9880d681SAndroid Build Coastguard Worker /// \brief Provides information about function coverage for a file. 95*9880d681SAndroid Build Coastguard Worker struct FunctionCoverageInfo { 96*9880d681SAndroid Build Coastguard Worker /// \brief The number of functions that were executed. 97*9880d681SAndroid Build Coastguard Worker size_t Executed; 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Worker /// \brief The total number of functions in this file. 100*9880d681SAndroid Build Coastguard Worker size_t NumFunctions; 101*9880d681SAndroid Build Coastguard Worker FunctionCoverageInfoFunctionCoverageInfo102*9880d681SAndroid Build Coastguard Worker FunctionCoverageInfo() : Executed(0), NumFunctions(0) {} 103*9880d681SAndroid Build Coastguard Worker FunctionCoverageInfoFunctionCoverageInfo104*9880d681SAndroid Build Coastguard Worker FunctionCoverageInfo(size_t Executed, size_t NumFunctions) 105*9880d681SAndroid Build Coastguard Worker : Executed(Executed), NumFunctions(NumFunctions) {} 106*9880d681SAndroid Build Coastguard Worker addFunctionFunctionCoverageInfo107*9880d681SAndroid Build Coastguard Worker void addFunction(bool Covered) { 108*9880d681SAndroid Build Coastguard Worker if (Covered) 109*9880d681SAndroid Build Coastguard Worker ++Executed; 110*9880d681SAndroid Build Coastguard Worker ++NumFunctions; 111*9880d681SAndroid Build Coastguard Worker } 112*9880d681SAndroid Build Coastguard Worker isFullyCoveredFunctionCoverageInfo113*9880d681SAndroid Build Coastguard Worker bool isFullyCovered() const { return Executed == NumFunctions; } 114*9880d681SAndroid Build Coastguard Worker getPercentCoveredFunctionCoverageInfo115*9880d681SAndroid Build Coastguard Worker double getPercentCovered() const { 116*9880d681SAndroid Build Coastguard Worker if (NumFunctions == 0) 117*9880d681SAndroid Build Coastguard Worker return 0.0; 118*9880d681SAndroid Build Coastguard Worker return double(Executed) / double(NumFunctions) * 100.0; 119*9880d681SAndroid Build Coastguard Worker } 120*9880d681SAndroid Build Coastguard Worker }; 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker /// \brief A summary of function's code coverage. 123*9880d681SAndroid Build Coastguard Worker struct FunctionCoverageSummary { 124*9880d681SAndroid Build Coastguard Worker StringRef Name; 125*9880d681SAndroid Build Coastguard Worker uint64_t ExecutionCount; 126*9880d681SAndroid Build Coastguard Worker RegionCoverageInfo RegionCoverage; 127*9880d681SAndroid Build Coastguard Worker LineCoverageInfo LineCoverage; 128*9880d681SAndroid Build Coastguard Worker FunctionCoverageSummaryFunctionCoverageSummary129*9880d681SAndroid Build Coastguard Worker FunctionCoverageSummary(StringRef Name) : Name(Name), ExecutionCount(0) {} 130*9880d681SAndroid Build Coastguard Worker FunctionCoverageSummaryFunctionCoverageSummary131*9880d681SAndroid Build Coastguard Worker FunctionCoverageSummary(StringRef Name, uint64_t ExecutionCount, 132*9880d681SAndroid Build Coastguard Worker const RegionCoverageInfo &RegionCoverage, 133*9880d681SAndroid Build Coastguard Worker const LineCoverageInfo &LineCoverage) 134*9880d681SAndroid Build Coastguard Worker : Name(Name), ExecutionCount(ExecutionCount), 135*9880d681SAndroid Build Coastguard Worker RegionCoverage(RegionCoverage), LineCoverage(LineCoverage) { 136*9880d681SAndroid Build Coastguard Worker } 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker /// \brief Compute the code coverage summary for the given function coverage 139*9880d681SAndroid Build Coastguard Worker /// mapping record. 140*9880d681SAndroid Build Coastguard Worker static FunctionCoverageSummary 141*9880d681SAndroid Build Coastguard Worker get(const coverage::FunctionRecord &Function); 142*9880d681SAndroid Build Coastguard Worker }; 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker /// \brief A summary of file's code coverage. 145*9880d681SAndroid Build Coastguard Worker struct FileCoverageSummary { 146*9880d681SAndroid Build Coastguard Worker StringRef Name; 147*9880d681SAndroid Build Coastguard Worker RegionCoverageInfo RegionCoverage; 148*9880d681SAndroid Build Coastguard Worker LineCoverageInfo LineCoverage; 149*9880d681SAndroid Build Coastguard Worker FunctionCoverageInfo FunctionCoverage; 150*9880d681SAndroid Build Coastguard Worker FileCoverageSummaryFileCoverageSummary151*9880d681SAndroid Build Coastguard Worker FileCoverageSummary(StringRef Name) : Name(Name) {} 152*9880d681SAndroid Build Coastguard Worker addFunctionFileCoverageSummary153*9880d681SAndroid Build Coastguard Worker void addFunction(const FunctionCoverageSummary &Function) { 154*9880d681SAndroid Build Coastguard Worker RegionCoverage += Function.RegionCoverage; 155*9880d681SAndroid Build Coastguard Worker LineCoverage += Function.LineCoverage; 156*9880d681SAndroid Build Coastguard Worker FunctionCoverage.addFunction(/*Covered=*/Function.ExecutionCount > 0); 157*9880d681SAndroid Build Coastguard Worker } 158*9880d681SAndroid Build Coastguard Worker }; 159*9880d681SAndroid Build Coastguard Worker 160*9880d681SAndroid Build Coastguard Worker } // namespace llvm 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Worker #endif // LLVM_COV_COVERAGESUMMARYINFO_H 163