forked from OSchip/llvm-project
[llvm-cov] Avoid 0% when reporting something that's 0/0
This commit makes llvm-cov avoid showing 0% (0/0) coverage for things like file function coverage, etc. in reports and HTML output. This can happen for files like headers that have macros but no functions. This commit makes llvm-cov report - (0/0) instead. rdar://29246480 Differential Revision: https://reviews.llvm.org/D26615 llvm-svn: 287539
This commit is contained in:
parent
91972d7f9d
commit
35369c1eb6
llvm
test/tools/llvm-cov
tools/llvm-cov
Binary file not shown.
|
@ -0,0 +1,3 @@
|
|||
// This header has no functions
|
||||
|
||||
#define NOFUNCTIONS(x) (x) > 0 ? 0 : 1
|
|
@ -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
|
|
@ -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: <td class='column-entry-green'><pre>- (0/0)
|
||||
// HTML-NO: 0.00% (0/0)
|
|
@ -154,36 +154,48 @@ void CoverageReport::render(const FileCoverageSummary &File,
|
|||
(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";
|
||||
}
|
||||
|
||||
|
|
|
@ -307,13 +307,17 @@ void CoveragePrinterHTML::emitFileSummary(raw_ostream &OS, StringRef SF,
|
|||
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));
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue