diff options
author | Eli Friedman <efriedma@codeaurora.org> | 2017-08-09 20:43:31 +0000 |
---|---|---|
committer | Eli Friedman <efriedma@codeaurora.org> | 2017-08-09 20:43:31 +0000 |
commit | c0c182cce1565213a4b0b0a7284538fbcf8b5955 (patch) | |
tree | 758f6d6294057b08fe1a87f9b73402b4df9aa4be /llvm/tools | |
parent | 14a22a442d8aa6bee8c828872b82b7dd722dc7b8 (diff) | |
download | bcm5719-llvm-c0c182cce1565213a4b0b0a7284538fbcf8b5955.tar.gz bcm5719-llvm-c0c182cce1565213a4b0b0a7284538fbcf8b5955.zip |
[llvm-cov] Rearrange entries in report index.
Files which don't contain any functions are likely useless; don't
include them in the main table. Put the links at the bottom of the
page, in case someone wants to figure out coverage for code inside
a macro.
Not sure if this is the best solution, but it seems like an
improvement.
Differential Revision: https://reviews.llvm.org/D36298
llvm-svn: 310518
Diffstat (limited to 'llvm/tools')
-rw-r--r-- | llvm/tools/llvm-cov/CoverageReport.cpp | 18 | ||||
-rw-r--r-- | llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp | 51 | ||||
-rw-r--r-- | llvm/tools/llvm-cov/SourceCoverageViewHTML.h | 2 |
3 files changed, 58 insertions, 13 deletions
diff --git a/llvm/tools/llvm-cov/CoverageReport.cpp b/llvm/tools/llvm-cov/CoverageReport.cpp index 7c273a2430c..3c9bf3975b3 100644 --- a/llvm/tools/llvm-cov/CoverageReport.cpp +++ b/llvm/tools/llvm-cov/CoverageReport.cpp @@ -371,8 +371,22 @@ void CoverageReport::renderFileReports(raw_ostream &OS, renderDivider(FileReportColumns, OS); OS << "\n"; - for (const FileCoverageSummary &FCS : FileReports) - render(FCS, OS); + bool EmptyFiles = false; + for (const FileCoverageSummary &FCS : FileReports) { + if (FCS.FunctionCoverage.NumFunctions) + render(FCS, OS); + else + EmptyFiles = true; + } + + if (EmptyFiles) { + OS << "\n" + << "Files which contain no functions:\n"; + + for (const FileCoverageSummary &FCS : FileReports) + if (!FCS.FunctionCoverage.NumFunctions) + render(FCS, OS); + } renderDivider(FileReportColumns, OS); OS << "\n"; diff --git a/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp b/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp index 64b888e89d7..7548a969b99 100644 --- a/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp +++ b/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp @@ -294,6 +294,18 @@ static void emitColumnLabelsForIndex(raw_ostream &OS) { OS << tag("tr", join(Columns.begin(), Columns.end(), "")); } +std::string +CoveragePrinterHTML::buildLinkToFile(StringRef SF, + const FileCoverageSummary &FCS) const { + SmallString<128> LinkTextStr(sys::path::relative_path(FCS.Name)); + sys::path::remove_dots(LinkTextStr, /*remove_dot_dots=*/true); + sys::path::native(LinkTextStr); + std::string LinkText = escape(LinkTextStr, Opts); + std::string LinkTarget = + escape(getOutputPath(SF, "html", /*InToplevel=*/false), Opts); + return a(LinkTarget, LinkText); +} + /// Render a file coverage summary (\p FCS) in a table row. If \p IsTotals is /// false, link the summary to \p SF. void CoveragePrinterHTML::emitFileSummary(raw_ostream &OS, StringRef SF, @@ -326,13 +338,7 @@ void CoveragePrinterHTML::emitFileSummary(raw_ostream &OS, StringRef SF, if (IsTotals) { Filename = "TOTALS"; } else { - SmallString<128> LinkTextStr(sys::path::relative_path(FCS.Name)); - sys::path::remove_dots(LinkTextStr, /*remove_dot_dots=*/true); - sys::path::native(LinkTextStr); - std::string LinkText = escape(LinkTextStr, Opts); - std::string LinkTarget = - escape(getOutputPath(SF, "html", /*InToplevel=*/false), Opts); - Filename = a(LinkTarget, LinkText); + Filename = buildLinkToFile(SF, FCS); } Columns.emplace_back(tag("td", tag("pre", Filename))); @@ -387,16 +393,39 @@ Error CoveragePrinterHTML::createIndexFile( " for information about interpreting this report."); // Emit a table containing links to reports for each file in the covmapping. + // Exclude files which don't contain any regions. OSRef << BeginCenteredDiv << BeginTable; emitColumnLabelsForIndex(OSRef); FileCoverageSummary Totals("TOTALS"); auto FileReports = CoverageReport::prepareFileReports(Coverage, Totals, SourceFiles); - for (unsigned I = 0, E = FileReports.size(); I < E; ++I) - emitFileSummary(OSRef, SourceFiles[I], FileReports[I]); + bool EmptyFiles = false; + for (unsigned I = 0, E = FileReports.size(); I < E; ++I) { + if (FileReports[I].FunctionCoverage.NumFunctions) + emitFileSummary(OSRef, SourceFiles[I], FileReports[I]); + else + EmptyFiles = true; + } emitFileSummary(OSRef, "Totals", Totals, /*IsTotals=*/true); - OSRef << EndTable << EndCenteredDiv - << tag("h5", escape(Opts.getLLVMVersionString(), Opts)); + OSRef << EndTable << EndCenteredDiv; + + // Emit links to files which don't contain any functions. These are normally + // not very useful, but could be relevant for code which abuses the + // preprocessor. + if (EmptyFiles) { + OSRef << tag("p", "Files which contain no functions. (These " + "files contain code pulled into other files " + "by the preprocessor.)\n"); + OSRef << BeginCenteredDiv << BeginTable; + for (unsigned I = 0, E = FileReports.size(); I < E; ++I) + if (!FileReports[I].FunctionCoverage.NumFunctions) { + std::string Link = buildLinkToFile(SourceFiles[I], FileReports[I]); + OSRef << tag("tr", tag("td", tag("pre", Link)), "light-row") << '\n'; + } + OSRef << EndTable << EndCenteredDiv; + } + + OSRef << tag("h5", escape(Opts.getLLVMVersionString(), Opts)); emitEpilog(OSRef); return Error::success(); diff --git a/llvm/tools/llvm-cov/SourceCoverageViewHTML.h b/llvm/tools/llvm-cov/SourceCoverageViewHTML.h index 94b08a5e7fc..8cb73567a2e 100644 --- a/llvm/tools/llvm-cov/SourceCoverageViewHTML.h +++ b/llvm/tools/llvm-cov/SourceCoverageViewHTML.h @@ -38,6 +38,8 @@ private: void emitFileSummary(raw_ostream &OS, StringRef SF, const FileCoverageSummary &FCS, bool IsTotals = false) const; + std::string buildLinkToFile(StringRef SF, + const FileCoverageSummary &FCS) const; }; /// \brief A code coverage view which supports html-based rendering. |