Index: llvm/trunk/test/tools/llvm-cov/Inputs/zeroFunctionFile.h =================================================================== --- llvm/trunk/test/tools/llvm-cov/Inputs/zeroFunctionFile.h +++ llvm/trunk/test/tools/llvm-cov/Inputs/zeroFunctionFile.h @@ -0,0 +1,3 @@ +// This header has no functions + +#define NOFUNCTIONS(x) (x) > 0 ? 0 : 1 Index: llvm/trunk/test/tools/llvm-cov/Inputs/zeroFunctionFile.proftext =================================================================== --- llvm/trunk/test/tools/llvm-cov/Inputs/zeroFunctionFile.proftext +++ llvm/trunk/test/tools/llvm-cov/Inputs/zeroFunctionFile.proftext @@ -0,0 +1,16 @@ +foo +# Func Hash: +13 +# Num Counters: +2 +# Counter Values: +1 +1 + +main +# Func Hash: +0 +# Num Counters: +1 +# Counter Values: +1 Index: llvm/trunk/test/tools/llvm-cov/zeroFunctionFile.c =================================================================== --- llvm/trunk/test/tools/llvm-cov/zeroFunctionFile.c +++ llvm/trunk/test/tools/llvm-cov/zeroFunctionFile.c @@ -0,0 +1,19 @@ +#include "Inputs/zeroFunctionFile.h" + +int foo(int x) { + return NOFUNCTIONS(x); +} +int main() { + return foo(2); +} + +// RUN: llvm-profdata merge %S/Inputs/zeroFunctionFile.proftext -o %t.profdata + +// RUN: llvm-cov report %S/Inputs/zeroFunctionFile.covmapping -instr-profile %t.profdata 2>&1 | FileCheck --check-prefix=REPORT --strict-whitespace %s +// REPORT: 0 0 - 0 0 - 0 0 - 0 0 - +// REPORT-NO: 0% + +// RUN: llvm-cov show %S/Inputs/zeroFunctionFile.covmapping -format html -instr-profile %t.profdata -o %t.dir +// RUN: FileCheck %s -input-file=%t.dir/index.html -check-prefix=HTML +// HTML:
- (0/0) +// HTML-NO: 0.00% (0/0) Index: llvm/trunk/tools/llvm-cov/CoverageReport.cpp =================================================================== --- llvm/trunk/tools/llvm-cov/CoverageReport.cpp +++ llvm/trunk/tools/llvm-cov/CoverageReport.cpp @@ -154,36 +154,48 @@ (unsigned)File.RegionCoverage.NumRegions); Options.colored_ostream(OS, FileCoverageColor) << format( "%*u", FileReportColumns[2], (unsigned)File.RegionCoverage.NotCovered); - Options.colored_ostream(OS, FileCoverageColor) - << format("%*.2f", FileReportColumns[3] - 1, - File.RegionCoverage.getPercentCovered()) - << '%'; + if (File.RegionCoverage.NumRegions) + Options.colored_ostream(OS, FileCoverageColor) + << format("%*.2f", FileReportColumns[3] - 1, + File.RegionCoverage.getPercentCovered()) + << '%'; + else + OS << column("-", FileReportColumns[3], Column::RightAlignment); OS << format("%*u", FileReportColumns[4], (unsigned)File.FunctionCoverage.NumFunctions); OS << format("%*u", FileReportColumns[5], (unsigned)(File.FunctionCoverage.NumFunctions - File.FunctionCoverage.Executed)); - Options.colored_ostream(OS, FuncCoverageColor) - << format("%*.2f", FileReportColumns[6] - 1, - File.FunctionCoverage.getPercentCovered()) - << '%'; + if (File.FunctionCoverage.NumFunctions) + Options.colored_ostream(OS, FuncCoverageColor) + << format("%*.2f", FileReportColumns[6] - 1, + File.FunctionCoverage.getPercentCovered()) + << '%'; + else + OS << column("-", FileReportColumns[6], Column::RightAlignment); OS << format("%*u", FileReportColumns[7], (unsigned)File.InstantiationCoverage.NumFunctions); OS << format("%*u", FileReportColumns[8], (unsigned)(File.InstantiationCoverage.NumFunctions - File.InstantiationCoverage.Executed)); - Options.colored_ostream(OS, InstantiationCoverageColor) - << format("%*.2f", FileReportColumns[9] - 1, - File.InstantiationCoverage.getPercentCovered()) - << '%'; + if (File.InstantiationCoverage.NumFunctions) + Options.colored_ostream(OS, InstantiationCoverageColor) + << format("%*.2f", FileReportColumns[9] - 1, + File.InstantiationCoverage.getPercentCovered()) + << '%'; + else + OS << column("-", FileReportColumns[9], Column::RightAlignment); OS << format("%*u", FileReportColumns[10], (unsigned)File.LineCoverage.NumLines); Options.colored_ostream(OS, LineCoverageColor) << format( "%*u", FileReportColumns[11], (unsigned)File.LineCoverage.NotCovered); - Options.colored_ostream(OS, LineCoverageColor) - << format("%*.2f", FileReportColumns[12] - 1, - File.LineCoverage.getPercentCovered()) - << '%'; + if (File.LineCoverage.NumLines) + Options.colored_ostream(OS, LineCoverageColor) + << format("%*.2f", FileReportColumns[12] - 1, + File.LineCoverage.getPercentCovered()) + << '%'; + else + OS << column("-", FileReportColumns[12], Column::RightAlignment); OS << "\n"; } Index: llvm/trunk/tools/llvm-cov/SourceCoverageViewHTML.cpp =================================================================== --- llvm/trunk/tools/llvm-cov/SourceCoverageViewHTML.cpp +++ llvm/trunk/tools/llvm-cov/SourceCoverageViewHTML.cpp @@ -307,13 +307,17 @@ std::string S; { raw_string_ostream RSO{S}; - RSO << format("%*.2f", 7, Pctg) << "% (" << Hit << '/' << Total << ')'; + if (Total) + RSO << format("%*.2f", 7, Pctg) << "% "; + else + RSO << "- "; + RSO << '(' << Hit << '/' << Total << ')'; } const char *CellClass = "column-entry-yellow"; - if (Pctg < 80.0) - CellClass = "column-entry-red"; - else if (Hit == Total) + if (Hit == Total) CellClass = "column-entry-green"; + else if (Pctg < 80.0) + CellClass = "column-entry-red"; Columns.emplace_back(tag("td", tag("pre", S), CellClass)); };