Index: test/tools/llvm-cov/report.cpp =================================================================== --- /dev/null +++ test/tools/llvm-cov/report.cpp @@ -0,0 +1,24 @@ +// RUN: llvm-cov report %S/Inputs/report.covmapping -instr-profile %S/Inputs/report.profdata -no-colors | FileCheck %s + +// CHECK: Filename Regions Miss Cover Functions Executed +// CHECK: TOTAL 5 2 60.00% 4 75.00% + +void foo(bool cond) { + if (cond) { + } +} + +void bar() { +} + +void func() { +} + +int main() { + foo(false); + bar(); + return 0; +} + +// llvm-cov doesn't work on big endian yet +// XFAIL: powerpc64-, s390x, mips-, mips64-, sparc Index: tools/llvm-cov/CodeCoverage.cpp =================================================================== --- tools/llvm-cov/CodeCoverage.cpp +++ tools/llvm-cov/CodeCoverage.cpp @@ -395,6 +395,8 @@ // Create the mapping regions with evaluated execution counts Counts.clear(); PGOReader->getFunctionCounts(Function.Name, I.FunctionHash, Counts); + if (!Counts.empty()) + Function.ExecutionCount = Counts[0]; // Get the biggest referenced counters bool RegionError = false; Index: tools/llvm-cov/CoverageReport.cpp =================================================================== --- tools/llvm-cov/CoverageReport.cpp +++ tools/llvm-cov/CoverageReport.cpp @@ -85,7 +85,7 @@ return Column(Str, Width).set(Value); } -static const unsigned FileReportColumns[] = {25, 10, 8, 8, 10, 8}; +static const unsigned FileReportColumns[] = {25, 10, 8, 8, 10, 10}; static const unsigned FunctionReportColumns[] = {25, 10, 8, 8, 10, 8, 8}; /// \brief Prints a horizontal divider which spans across the given columns. @@ -178,7 +178,7 @@ render(Function, OS); renderDivider(FunctionReportColumns, OS); OS << "\n"; - render(FunctionCoverageSummary("TOTAL", File.RegionCoverage, + render(FunctionCoverageSummary("TOTAL", 0, File.RegionCoverage, File.LineCoverage), OS); } @@ -190,7 +190,8 @@ << column("Miss", FileReportColumns[2], Column::RightAlignment) << column("Cover", FileReportColumns[3], Column::RightAlignment) << column("Functions", FileReportColumns[4], Column::RightAlignment) - << column("Cover", FileReportColumns[5], Column::RightAlignment) << "\n"; + << column("Executed", FileReportColumns[5], Column::RightAlignment) + << "\n"; renderDivider(FileReportColumns, OS); OS << "\n"; for (const auto &File : Summary.getFileSummaries()) Index: tools/llvm-cov/CoverageSummary.cpp =================================================================== --- tools/llvm-cov/CoverageSummary.cpp +++ tools/llvm-cov/CoverageSummary.cpp @@ -81,7 +81,7 @@ NonCodeLines += File.LineCoverage.NonCodeLines; CoveredLines += File.LineCoverage.Covered; - NumFunctionsCovered += File.FunctionCoverage.FullyCovered; + NumFunctionsCovered += File.FunctionCoverage.Executed; NumFunctions += File.FunctionCoverage.NumFunctions; } return FileCoverageSummary( Index: tools/llvm-cov/CoverageSummaryInfo.h =================================================================== --- tools/llvm-cov/CoverageSummaryInfo.h +++ tools/llvm-cov/CoverageSummaryInfo.h @@ -69,33 +69,34 @@ /// \brief Provides information about function coverage for a file. struct FunctionCoverageInfo { - /// \brief The number of functions that have full - /// region coverage. - size_t FullyCovered; + /// \brief The number of functions that were executed. + size_t Executed; /// \brief The total number of functions in this file. size_t NumFunctions; - FunctionCoverageInfo(size_t FullyCovered, size_t NumFunctions) - : FullyCovered(FullyCovered), NumFunctions(NumFunctions) {} + FunctionCoverageInfo(size_t Executed, size_t NumFunctions) + : Executed(Executed), NumFunctions(NumFunctions) {} - bool isFullyCovered() const { return FullyCovered == NumFunctions; } + bool isFullyCovered() const { return Executed == NumFunctions; } double getPercentCovered() const { - return double(FullyCovered) / double(NumFunctions) * 100.0; + 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, + FunctionCoverageSummary(StringRef Name, uint64_t ExecutionCount, const RegionCoverageInfo &RegionCoverage, const LineCoverageInfo &LineCoverage) - : Name(Name), RegionCoverage(RegionCoverage), LineCoverage(LineCoverage) { + : Name(Name), ExecutionCount(ExecutionCount), + RegionCoverage(RegionCoverage), LineCoverage(LineCoverage) { } /// \brief Compute the code coverage summary for the given function coverage Index: tools/llvm-cov/CoverageSummaryInfo.cpp =================================================================== --- tools/llvm-cov/CoverageSummaryInfo.cpp +++ tools/llvm-cov/CoverageSummaryInfo.cpp @@ -65,7 +65,8 @@ NumLines += LineCount; } return FunctionCoverageSummary( - Function.PrettyName, RegionCoverageInfo(CoveredRegions, NumCodeRegions), + Function.PrettyName, Function.ExecutionCount, + RegionCoverageInfo(CoveredRegions, NumCodeRegions), LineCoverageInfo(CoveredLines, 0, NumLines)); } @@ -74,7 +75,7 @@ ArrayRef FunctionSummaries) { size_t NumRegions = 0, CoveredRegions = 0; size_t NumLines = 0, NonCodeLines = 0, CoveredLines = 0; - size_t NumFunctionsCovered = 0; + size_t NumFunctionsExecuted = 0; for (const auto &Func : FunctionSummaries) { CoveredRegions += Func.RegionCoverage.Covered; NumRegions += Func.RegionCoverage.NumRegions; @@ -83,13 +84,13 @@ NonCodeLines += Func.LineCoverage.NonCodeLines; NumLines += Func.LineCoverage.NumLines; - if (Func.RegionCoverage.isFullyCovered()) - ++NumFunctionsCovered; + if (Func.ExecutionCount != 0) + ++NumFunctionsExecuted; } return FileCoverageSummary( Name, RegionCoverageInfo(CoveredRegions, NumRegions), LineCoverageInfo(CoveredLines, NonCodeLines, NumLines), - FunctionCoverageInfo(NumFunctionsCovered, FunctionSummaries.size()), + FunctionCoverageInfo(NumFunctionsExecuted, FunctionSummaries.size()), FunctionSummaries); } Index: tools/llvm-cov/FunctionCoverageMapping.h =================================================================== --- tools/llvm-cov/FunctionCoverageMapping.h +++ tools/llvm-cov/FunctionCoverageMapping.h @@ -37,11 +37,13 @@ std::string Name; /// \brief Demangled function name. std::string PrettyName; + /// \brief The number of times this function was executed. + uint64_t ExecutionCount; std::vector Filenames; std::vector MappingRegions; FunctionCoverageMapping(StringRef Name, ArrayRef Filenames) - : Name(Name), PrettyName(Name), + : Name(Name), PrettyName(Name), ExecutionCount(0), Filenames(Filenames.begin(), Filenames.end()) {} };