| //===- CoverageSummaryInfo.h - 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. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_COV_COVERAGESUMMARYINFO_H |
| #define LLVM_COV_COVERAGESUMMARYINFO_H |
| |
| #include "llvm/ProfileData/CoverageMapping.h" |
| #include "llvm/Support/raw_ostream.h" |
| |
| namespace llvm { |
| |
| /// \brief Provides information about region coverage for a function/file. |
| struct RegionCoverageInfo { |
| /// \brief The number of regions that were executed at least once. |
| size_t Covered; |
| |
| /// \brief The number of regions that weren't executed. |
| size_t NotCovered; |
| |
| /// \brief The total number of regions in a function/file. |
| size_t NumRegions; |
| |
| RegionCoverageInfo() : Covered(0), NotCovered(0), NumRegions(0) {} |
| |
| RegionCoverageInfo(size_t Covered, size_t NumRegions) |
| : Covered(Covered), NotCovered(NumRegions - Covered), |
| NumRegions(NumRegions) {} |
| |
| RegionCoverageInfo &operator+=(const RegionCoverageInfo &RHS) { |
| Covered += RHS.Covered; |
| NotCovered += RHS.NotCovered; |
| NumRegions += RHS.NumRegions; |
| return *this; |
| } |
| |
| bool isFullyCovered() const { return Covered == NumRegions; } |
| |
| double getPercentCovered() const { |
| return double(Covered) / double(NumRegions) * 100.0; |
| } |
| }; |
| |
| /// \brief Provides information about line coverage for a function/file. |
| struct LineCoverageInfo { |
| /// \brief The number of lines that were executed at least once. |
| size_t Covered; |
| |
| /// \brief The number of lines that weren't executed. |
| size_t NotCovered; |
| |
| /// \brief The number of lines that aren't code. |
| size_t NonCodeLines; |
| |
| /// \brief The total number of lines in a function/file. |
| size_t NumLines; |
| |
| LineCoverageInfo() |
| : Covered(0), NotCovered(0), NonCodeLines(0), NumLines(0) {} |
| |
| LineCoverageInfo(size_t Covered, size_t NumNonCodeLines, size_t NumLines) |
| : Covered(Covered), NotCovered(NumLines - NumNonCodeLines - Covered), |
| NonCodeLines(NumNonCodeLines), NumLines(NumLines) {} |
| |
| LineCoverageInfo &operator+=(const LineCoverageInfo &RHS) { |
| Covered += RHS.Covered; |
| NotCovered += RHS.NotCovered; |
| NonCodeLines += RHS.NonCodeLines; |
| NumLines += RHS.NumLines; |
| return *this; |
| } |
| |
| bool isFullyCovered() const { return Covered == (NumLines - NonCodeLines); } |
| |
| double getPercentCovered() const { |
| return double(Covered) / double(NumLines - NonCodeLines) * 100.0; |
| } |
| }; |
| |
| /// \brief Provides information about function coverage for a file. |
| struct FunctionCoverageInfo { |
| /// \brief The number of functions that were executed. |
| size_t Executed; |
| |
| /// \brief The total number of functions in this file. |
| size_t NumFunctions; |
| |
| FunctionCoverageInfo() : Executed(0), NumFunctions(0) {} |
| |
| FunctionCoverageInfo(size_t Executed, size_t NumFunctions) |
| : Executed(Executed), NumFunctions(NumFunctions) {} |
| |
| void addFunction(bool Covered) { |
| if (Covered) |
| ++Executed; |
| ++NumFunctions; |
| } |
| |
| bool isFullyCovered() const { return Executed == NumFunctions; } |
| |
| double getPercentCovered() const { |
| return double(Executed) / double(NumFunctions) * 100.0; |
| } |
| }; |
| |
| /// \brief A summary of function's code coverage. |
| struct FunctionCoverageSummary { |
| StringRef Name; |
| uint64_t ExecutionCount; |
| RegionCoverageInfo RegionCoverage; |
| LineCoverageInfo LineCoverage; |
| |
| FunctionCoverageSummary(StringRef Name) : Name(Name), ExecutionCount(0) {} |
| |
| FunctionCoverageSummary(StringRef Name, uint64_t ExecutionCount, |
| const RegionCoverageInfo &RegionCoverage, |
| const LineCoverageInfo &LineCoverage) |
| : Name(Name), ExecutionCount(ExecutionCount), |
| RegionCoverage(RegionCoverage), LineCoverage(LineCoverage) { |
| } |
| |
| /// \brief Compute the code coverage summary for the given function coverage |
| /// mapping record. |
| static FunctionCoverageSummary |
| get(const coverage::FunctionRecord &Function); |
| }; |
| |
| /// \brief A summary of file's code coverage. |
| struct FileCoverageSummary { |
| StringRef Name; |
| RegionCoverageInfo RegionCoverage; |
| LineCoverageInfo LineCoverage; |
| FunctionCoverageInfo FunctionCoverage; |
| |
| FileCoverageSummary(StringRef Name) : Name(Name) {} |
| |
| void addFunction(const FunctionCoverageSummary &Function) { |
| RegionCoverage += Function.RegionCoverage; |
| LineCoverage += Function.LineCoverage; |
| FunctionCoverage.addFunction(/*Covered=*/Function.ExecutionCount > 0); |
| } |
| }; |
| |
| } // namespace llvm |
| |
| #endif // LLVM_COV_COVERAGESUMMARYINFO_H |