diff options
author | Sean Eveson <eveson.sean@gmail.com> | 2017-09-27 15:37:40 +0000 |
---|---|---|
committer | Sean Eveson <eveson.sean@gmail.com> | 2017-09-27 15:37:40 +0000 |
commit | a7bf6677ff7978f5c604400e4e3c12ed667183fd (patch) | |
tree | 2007aa96b8a0c2812e1fc7e2e56cb1b8f5586e05 | |
parent | 4bac65ed04734a6b4c4ea3edc30e9d3b1ffa9342 (diff) |
[llvm-cov] Create directory structure when filtering using -name*= options
Before this change using any of the -name*= command line options with an output
directory would result in a single file (functions.txt/functions.html)
containing the coverage for those specific functions. Now you get the same
directory structure as when not using any -name*= options.
Differential Revision: https://reviews.llvm.org/D38280
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@314310 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | test/tools/llvm-cov/Inputs/dir-with-filtering.covmapping | bin | 0 -> 264 bytes | |||
-rw-r--r-- | test/tools/llvm-cov/Inputs/dir-with-filtering.proftext | 32 | ||||
-rw-r--r-- | test/tools/llvm-cov/Inputs/dir-with-filtering1.cpp | 8 | ||||
-rw-r--r-- | test/tools/llvm-cov/Inputs/dir-with-filtering2.cpp | 8 | ||||
-rw-r--r-- | test/tools/llvm-cov/dir-with-filtering.test | 69 | ||||
-rw-r--r-- | test/tools/llvm-cov/showLineExecutionCounts.cpp | 8 | ||||
-rw-r--r-- | test/tools/llvm-cov/showTemplateInstantiations.cpp | 4 | ||||
-rw-r--r-- | test/tools/llvm-cov/style.test | 7 | ||||
-rw-r--r-- | tools/llvm-cov/CodeCoverage.cpp | 77 | ||||
-rw-r--r-- | tools/llvm-cov/CoverageReport.cpp | 15 | ||||
-rw-r--r-- | tools/llvm-cov/CoverageReport.h | 10 | ||||
-rw-r--r-- | tools/llvm-cov/SourceCoverageView.cpp | 5 | ||||
-rw-r--r-- | tools/llvm-cov/SourceCoverageView.h | 6 | ||||
-rw-r--r-- | tools/llvm-cov/SourceCoverageViewHTML.cpp | 10 | ||||
-rw-r--r-- | tools/llvm-cov/SourceCoverageViewHTML.h | 3 | ||||
-rw-r--r-- | tools/llvm-cov/SourceCoverageViewText.cpp | 8 | ||||
-rw-r--r-- | tools/llvm-cov/SourceCoverageViewText.h | 3 |
17 files changed, 212 insertions, 61 deletions
diff --git a/test/tools/llvm-cov/Inputs/dir-with-filtering.covmapping b/test/tools/llvm-cov/Inputs/dir-with-filtering.covmapping Binary files differnew file mode 100644 index 00000000000..0f52ba896ec --- /dev/null +++ b/test/tools/llvm-cov/Inputs/dir-with-filtering.covmapping diff --git a/test/tools/llvm-cov/Inputs/dir-with-filtering.proftext b/test/tools/llvm-cov/Inputs/dir-with-filtering.proftext new file mode 100644 index 00000000000..6457ad1751e --- /dev/null +++ b/test/tools/llvm-cov/Inputs/dir-with-filtering.proftext @@ -0,0 +1,32 @@ +main +# Func Hash: +0 +# Num Counters: +1 +# Counter Values: +1 + +_Z2f1v +# Func Hash: +0 +# Num Counters: +1 +# Counter Values: +1 + +_Z2f2v +# Func Hash: +0 +# Num Counters: +1 +# Counter Values: +0 + +_Z2f3v +# Func Hash: +0 +# Num Counters: +1 +# Counter Values: +0 + diff --git a/test/tools/llvm-cov/Inputs/dir-with-filtering1.cpp b/test/tools/llvm-cov/Inputs/dir-with-filtering1.cpp new file mode 100644 index 00000000000..b6a308f5ccb --- /dev/null +++ b/test/tools/llvm-cov/Inputs/dir-with-filtering1.cpp @@ -0,0 +1,8 @@ +int f1() { + return 1; +} + +int main() { + f1(); + return 0; +} diff --git a/test/tools/llvm-cov/Inputs/dir-with-filtering2.cpp b/test/tools/llvm-cov/Inputs/dir-with-filtering2.cpp new file mode 100644 index 00000000000..2fa2c4e6ad1 --- /dev/null +++ b/test/tools/llvm-cov/Inputs/dir-with-filtering2.cpp @@ -0,0 +1,8 @@ +int f2() { + return 2; +} + +int f3() { + return 3; +} + diff --git a/test/tools/llvm-cov/dir-with-filtering.test b/test/tools/llvm-cov/dir-with-filtering.test new file mode 100644 index 00000000000..f3b68ddf763 --- /dev/null +++ b/test/tools/llvm-cov/dir-with-filtering.test @@ -0,0 +1,69 @@ +RUN: llvm-profdata merge %S/Inputs/dir-with-filtering.proftext -o %t.profdata
+
+// Test TEXT both files
+
+RUN: llvm-cov show %S/Inputs/dir-with-filtering.covmapping -o %t.text -instr-profile %t.profdata -path-equivalence=/tmp,%S/Inputs -name=main -name=f2
+
+RUN: FileCheck -input-file=%t.text/index.txt %s -check-prefix=TEXT-INDEX
+TEXT-INDEX: dir-with-filtering1.cpp 1 0 100.00% 1 0 100.00% 4 0 100.00%
+TEXT-INDEX: dir-with-filtering2.cpp 1 1 0.00% 1 1 0.00% 3 3 0.00%
+
+RUN: FileCheck -input-file=%t.text/coverage/tmp/dir-with-filtering1.cpp.txt %s -check-prefix=TEXT-FILE1
+TEXT-FILE1: Coverage Report
+TEXT-FILE1-NOT: _Z2f1v:
+TEXT-FILE1: main:
+TEXT-FILE1-NEXT: {{.*}}int main()
+TEXT-FILE1-NOT: _Z2f1v:
+
+RUN: FileCheck -input-file=%t.text/coverage/tmp/dir-with-filtering2.cpp.txt %s -check-prefix=TEXT-FILE2
+TEXT-FILE2: Coverage Report
+TEXT-FILE2-NOT: _Z2f3v:
+TEXT-FILE2: _Z2f2v:
+TEXT-FILE2-NEXT: {{.*}}int f2()
+TEXT-FILE2-NOT: _Z2f3v:
+
+// Test TEXT one file
+
+RUN: llvm-cov show %S/Inputs/dir-with-filtering.covmapping -o %t.text_one_file -instr-profile %t.profdata -path-equivalence=/tmp,%S/Inputs -name=main -name=f2 %S/Inputs/dir-with-filtering1.cpp
+
+RUN: FileCheck -input-file=%t.text_one_file/index.txt %s -check-prefix=TEXT-INDEX-ONE-FILE
+TEXT-INDEX-ONE-FILE: dir-with-filtering1.cpp 1 0 100.00% 1 0 100.00% 4 0 100.00%
+TEXT-INDEX-ONE-FILE-NOT: dir-with-filtering2.cpp
+
+RUN: FileCheck -input-file=%t.text_one_file/coverage/tmp/dir-with-filtering1.cpp.txt %s -check-prefix=TEXT-FILE1
+
+// Test HTML both files
+
+RUN: llvm-profdata merge %S/Inputs/dir-with-filtering.proftext -o %t.profdata
+RUN: llvm-cov show %S/Inputs/dir-with-filtering.covmapping -format html -o %t.html -instr-profile %t.profdata -path-equivalence=/tmp,%S/Inputs -name=main -name=f2
+
+RUN: FileCheck -input-file=%t.html/index.html %s -check-prefix=HTML-INDEX
+HTML-INDEX: <h2>Coverage Report</h2>
+HTML-INDEX: dir-with-filtering1.cpp{{.*}}100.00% (1/1){{.*}}100.00% (4/4){{.*}}100.00% (1/1)
+HTML-INDEX: dir-with-filtering2.cpp{{.*}}0.00% (0/1){{.*}}0.00% (0/3){{.*}}0.00% (0/1)
+
+RUN: FileCheck -input-file=%t.html/coverage/tmp/dir-with-filtering1.cpp.html %s -check-prefix=HTML-FILE1
+HTML-FILE1-NOT: <pre>f1</pre>
+HTML-FILE1: <pre>main</pre>
+HTML-FILE1-NOT: <pre>f1</pre>
+HTML-FILE1: int main()
+HTML-FILE1-NOT: <pre>f1</pre>
+
+RUN: FileCheck -input-file=%t.html/coverage/tmp/dir-with-filtering2.cpp.html %s -check-prefix=HTML-FILE2
+HTML-FILE2-NOT: <pre>f3</pre>
+HTML-FILE2: <pre>_Z2f2v</pre>
+HTML-FILE2-NOT: <pre>f3</pre>
+HTML-FILE2: int f2()
+HTML-FILE2-NOT: <pre>f3</pre>
+
+// Test HTML one file
+
+RUN: llvm-profdata merge %S/Inputs/dir-with-filtering.proftext -o %t.profdata
+RUN: llvm-cov show %S/Inputs/dir-with-filtering.covmapping -format html -o %t.html_one_file -instr-profile %t.profdata -path-equivalence=/tmp,%S/Inputs -name=main -name=f2 %S/Inputs/dir-with-filtering1.cpp
+
+RUN: FileCheck -input-file=%t.html_one_file/index.html %s -check-prefix=HTML-INDEX-ONE-FILE
+HTML-INDEX-ONE-FILE: <h2>Coverage Report</h2>
+HTML-INDEX-ONE-FILE: dir-with-filtering1.cpp{{.*}}100.00% (1/1){{.*}}100.00% (4/4){{.*}}100.00% (1/1)
+HTML-INDEX-ONE-FILE-NOT: dir-with-filtering2.cpp
+
+RUN: FileCheck -input-file=%t.html_one_file/coverage/tmp/dir-with-filtering1.cpp.html %s -check-prefix=HTML-FILE1
diff --git a/test/tools/llvm-cov/showLineExecutionCounts.cpp b/test/tools/llvm-cov/showLineExecutionCounts.cpp index ba974dc4db5..c4b76824aac 100644 --- a/test/tools/llvm-cov/showLineExecutionCounts.cpp +++ b/test/tools/llvm-cov/showLineExecutionCounts.cpp @@ -31,9 +31,9 @@ int main() { // TEXT: [[@LINE]]| 161|int main( // Test -output-dir. // RUN: llvm-cov show %S/Inputs/lineExecutionCounts.covmapping -o %t.dir -instr-profile %t.profdata -path-equivalence=/tmp,%S %s -// RUN: llvm-cov show %S/Inputs/lineExecutionCounts.covmapping -output-dir %t.dir -instr-profile %t.profdata -path-equivalence=/tmp,%S -name=main %s +// RUN: llvm-cov show %S/Inputs/lineExecutionCounts.covmapping -output-dir %t.filtered.dir -instr-profile %t.profdata -path-equivalence=/tmp,%S -name=main %s // RUN: FileCheck -check-prefixes=TEXT,WHOLE-FILE -input-file %t.dir/coverage/tmp/showLineExecutionCounts.cpp.txt %s -// RUN: FileCheck -check-prefixes=TEXT,FILTER -input-file %t.dir/functions.txt %s +// RUN: FileCheck -check-prefixes=TEXT,FILTER -input-file %t.filtered.dir/coverage/tmp/showLineExecutionCounts.cpp.txt %s // // RUN: llvm-cov export %S/Inputs/lineExecutionCounts.covmapping -instr-profile %t.profdata -name=main 2>/dev/null > %t.export.json // RUN: FileCheck -input-file %t.export.json %S/Inputs/lineExecutionCounts.json @@ -41,9 +41,9 @@ int main() { // TEXT: [[@LINE]]| 161|int main( // // Test html output. // RUN: llvm-cov show %S/Inputs/lineExecutionCounts.covmapping -format html -o %t.html.dir -instr-profile %t.profdata -path-equivalence=/tmp,%S %s -// RUN: llvm-cov show %S/Inputs/lineExecutionCounts.covmapping -format html -o %t.html.dir -instr-profile %t.profdata -path-equivalence=/tmp,%S -name=main %s +// RUN: llvm-cov show %S/Inputs/lineExecutionCounts.covmapping -format html -o %t.html.filtered.dir -instr-profile %t.profdata -path-equivalence=/tmp,%S -name=main %s // RUN: FileCheck -check-prefixes=HTML,HTML-WHOLE-FILE -input-file %t.html.dir/coverage/tmp/showLineExecutionCounts.cpp.html %s -// RUN: FileCheck -check-prefixes=HTML,HTML-FILTER -input-file %t.html.dir/functions.html %s +// RUN: FileCheck -check-prefixes=HTML,HTML-FILTER -input-file %t.html.filtered.dir/coverage/tmp/showLineExecutionCounts.cpp.html %s // // HTML-WHOLE-FILE: <td class='line-number'><a name='L[[@LINE-44]]' href='#L[[@LINE-44]]'><pre>[[@LINE-44]]</pre></a></td><td class='uncovered-line'></td><td class='code'><pre>// before // HTML-FILTER-NOT: <td class='line-number'><a name='L[[@LINE-45]]' href='#L[[@LINE-45]]'><pre>[[@LINE-45]]</pre></a></td><td class='uncovered-line'></td><td class='code'><pre>// before diff --git a/test/tools/llvm-cov/showTemplateInstantiations.cpp b/test/tools/llvm-cov/showTemplateInstantiations.cpp index 3053b06c0bd..428ceac7dba 100644 --- a/test/tools/llvm-cov/showTemplateInstantiations.cpp +++ b/test/tools/llvm-cov/showTemplateInstantiations.cpp @@ -41,9 +41,9 @@ int main() { // ALL: [[@LINE]]| 1|int main() { // Test html output. // RUN: llvm-cov show %S/Inputs/templateInstantiations.covmapping -instr-profile %S/Inputs/templateInstantiations.profdata -path-equivalence=/tmp,%S %s -format html -o %t.html.dir -// RUN: llvm-cov show %S/Inputs/templateInstantiations.covmapping -instr-profile %S/Inputs/templateInstantiations.profdata -path-equivalence=/tmp,%S -name=_Z4funcIbEiT_ %s -format html -o %t.html.dir +// RUN: llvm-cov show %S/Inputs/templateInstantiations.covmapping -instr-profile %S/Inputs/templateInstantiations.profdata -path-equivalence=/tmp,%S -name=_Z4funcIbEiT_ %s -format html -o %t.html.filtered.dir // RUN: FileCheck -check-prefixes=HTML-SHARED,HTML-ALL -input-file=%t.html.dir/coverage/tmp/showTemplateInstantiations.cpp.html %s -// RUN: FileCheck -check-prefixes=HTML-SHARED,HTML-FILTER -input-file=%t.html.dir/functions.html %s +// RUN: FileCheck -check-prefixes=HTML-SHARED,HTML-FILTER -input-file=%t.html.filtered.dir/coverage/tmp/showTemplateInstantiations.cpp.html %s // HTML-ALL: <td class='line-number'><a name='L[[@LINE-44]]' href='#L[[@LINE-44]]'><pre>[[@LINE-44]]</pre></a></td><td class='uncovered-line'></td><td class='code'><pre>// before // HTML-FILTER-NOT: <td class='line-number'><a name='L[[@LINE-45]]' href='#L[[@LINE-45]]'><pre>[[@LINE-45]]</pre></a></td><td class='uncovered-line'></td><td class='code'><pre>// before diff --git a/test/tools/llvm-cov/style.test b/test/tools/llvm-cov/style.test index 579189b9e03..202bc9de146 100644 --- a/test/tools/llvm-cov/style.test +++ b/test/tools/llvm-cov/style.test @@ -1,14 +1,17 @@ RUN: llvm-cov show %S/Inputs/templateInstantiations.covmapping -instr-profile %S/Inputs/templateInstantiations.profdata -path-equivalence=/tmp,%S %S/showTemplateInstantiations.cpp -format html -o %t.dir -RUN: llvm-cov show %S/Inputs/templateInstantiations.covmapping -instr-profile %S/Inputs/templateInstantiations.profdata -path-equivalence=/tmp,%S -name=_Z4funcIbEiT_ %S/showTemplateInstantiations.cpp -format html -o %t.dir +RUN: llvm-cov show %S/Inputs/templateInstantiations.covmapping -instr-profile %S/Inputs/templateInstantiations.profdata -path-equivalence=/tmp,%S -name=_Z4funcIbEiT_ %S/showTemplateInstantiations.cpp -format html -o %t.filtered.dir RUN: llvm-cov show %S/Inputs/templateInstantiations.covmapping -instr-profile %S/Inputs/templateInstantiations.profdata -path-equivalence=/tmp,%S %S/showTemplateInstantiations.cpp -format html | FileCheck %s -check-prefix=NODIR RUN: FileCheck %s -input-file=%t.dir/style.css -check-prefix=STYLE -RUN: FileCheck %s -input-file=%t.dir/functions.html -check-prefix=TOPLEVEL RUN: FileCheck %s -input-file=%t.dir/index.html -check-prefix=TOPLEVEL RUN: FileCheck %s -input-file=%t.dir/coverage/tmp/showTemplateInstantiations.cpp.html -check-prefix=FILEVIEW +RUN: FileCheck %s -input-file=%t.filtered.dir/style.css -check-prefix=STYLE +RUN: FileCheck %s -input-file=%t.filtered.dir/index.html -check-prefix=TOPLEVEL +RUN: FileCheck %s -input-file=%t.filtered.dir/coverage/tmp/showTemplateInstantiations.cpp.html -check-prefix=FILEVIEW + STYLE-DAG: .red STYLE-DAG: .cyan STYLE-DAG: .source-name-title diff --git a/tools/llvm-cov/CodeCoverage.cpp b/tools/llvm-cov/CodeCoverage.cpp index 1ea54a8cffd..811ac53e244 100644 --- a/tools/llvm-cov/CodeCoverage.cpp +++ b/tools/llvm-cov/CodeCoverage.cpp @@ -35,7 +35,9 @@ #include "llvm/Support/Threading.h" #include "llvm/Support/ThreadPool.h" #include "llvm/Support/ToolOutputFile.h" + #include <functional> +#include <map> #include <system_error> using namespace llvm; @@ -526,7 +528,8 @@ void CodeCoverageTool::writeSourceFileView(StringRef SourceFile, auto OS = std::move(OSOrErr.get()); View->print(*OS.get(), /*Wholefile=*/true, - /*ShowSourceName=*/ShowFilenames); + /*ShowSourceName=*/ShowFilenames, + /*ShowTitle=*/ViewOpts.hasOutputDirectory()); Printer->closeViewFile(std::move(OS)); } @@ -845,29 +848,54 @@ int CodeCoverageTool::show(int argc, const char **argv, auto Printer = CoveragePrinter::create(ViewOpts); - if (!Filters.empty()) { - auto OSOrErr = Printer->createViewFile("functions", /*InToplevel=*/true); - if (Error E = OSOrErr.takeError()) { - error("Could not create view file!", toString(std::move(E))); + if (SourceFiles.empty()) + // Get the source files from the function coverage mapping. + for (StringRef Filename : Coverage->getUniqueSourceFiles()) + SourceFiles.push_back(Filename); + + // Create an index out of the source files. + if (ViewOpts.hasOutputDirectory()) { + if (Error E = Printer->createIndexFile(SourceFiles, *Coverage, Filters)) { + error("Could not create index file!", toString(std::move(E))); return 1; } - auto OS = std::move(OSOrErr.get()); - - // Show functions. - for (const auto &Function : Coverage->getCoveredFunctions()) { - if (!Filters.matches(*Coverage.get(), Function)) - continue; + } - auto mainView = createFunctionView(Function, *Coverage); - if (!mainView) { - warning("Could not read coverage for '" + Function.Name + "'."); - continue; + if (!Filters.empty()) { + // Build the map of filenames to functions. + std::map<llvm::StringRef, std::vector<const FunctionRecord *>> + FilenameFunctionMap; + for (const auto &SourceFile : SourceFiles) + for (const auto &Function : Coverage->getCoveredFunctions(SourceFile)) + if (Filters.matches(*Coverage.get(), Function)) + FilenameFunctionMap[SourceFile].push_back(&Function); + + // Only print filter matching functions for each file. + for (const auto &FileFunc : FilenameFunctionMap) { + const StringRef &File = FileFunc.first; + const auto &Functions = FileFunc.second; + + auto OSOrErr = Printer->createViewFile(File, /*InToplevel=*/false); + if (Error E = OSOrErr.takeError()) { + error("Could not create view file!", toString(std::move(E))); + return 1; + } + auto OS = std::move(OSOrErr.get()); + + bool ShowTitle = true; + for (const auto *Function : Functions) { + auto FunctionView = createFunctionView(*Function, *Coverage); + if (!FunctionView) { + warning("Could not read coverage for '" + Function->Name + "'."); + continue; + } + FunctionView->print(*OS.get(), /*WholeFile=*/false, + /*ShowSourceName=*/true, ShowTitle); + ShowTitle = false; } - mainView->print(*OS.get(), /*WholeFile=*/false, /*ShowSourceName=*/true); + Printer->closeViewFile(std::move(OS)); } - - Printer->closeViewFile(std::move(OS)); return 0; } @@ -876,19 +904,6 @@ int CodeCoverageTool::show(int argc, const char **argv, (SourceFiles.size() != 1) || ViewOpts.hasOutputDirectory() || (ViewOpts.Format == CoverageViewOptions::OutputFormat::HTML); - if (SourceFiles.empty()) - // Get the source files from the function coverage mapping. - for (StringRef Filename : Coverage->getUniqueSourceFiles()) - SourceFiles.push_back(Filename); - - // Create an index out of the source files. - if (ViewOpts.hasOutputDirectory()) { - if (Error E = Printer->createIndexFile(SourceFiles, *Coverage)) { - error("Could not create index file!", toString(std::move(E))); - return 1; - } - } - // If NumThreads is not specified, auto-detect a good default. if (NumThreads == 0) NumThreads = diff --git a/tools/llvm-cov/CoverageReport.cpp b/tools/llvm-cov/CoverageReport.cpp index 4c02bbcf2a3..5c8ffe1216d 100644 --- a/tools/llvm-cov/CoverageReport.cpp +++ b/tools/llvm-cov/CoverageReport.cpp @@ -322,7 +322,8 @@ void CoverageReport::renderFunctionReports(ArrayRef<std::string> Files, std::vector<FileCoverageSummary> CoverageReport::prepareFileReports( const coverage::CoverageMapping &Coverage, FileCoverageSummary &Totals, - ArrayRef<std::string> Files, const CoverageViewOptions &Options) { + ArrayRef<std::string> Files, const CoverageViewOptions &Options, + const CoverageFilter &Filters) { std::vector<FileCoverageSummary> FileReports; unsigned LCP = getRedundantPrefixLen(Files); @@ -332,11 +333,15 @@ std::vector<FileCoverageSummary> CoverageReport::prepareFileReports( for (const auto &Group : Coverage.getInstantiationGroups(Filename)) { std::vector<FunctionCoverageSummary> InstantiationSummaries; for (const coverage::FunctionRecord *F : Group.getInstantiations()) { + if (!Filters.matches(Coverage, *F)) + continue; auto InstantiationSummary = FunctionCoverageSummary::get(Coverage, *F); Summary.addInstantiation(InstantiationSummary); Totals.addInstantiation(InstantiationSummary); InstantiationSummaries.push_back(InstantiationSummary); } + if (InstantiationSummaries.empty()) + continue; auto GroupSummary = FunctionCoverageSummary::get(Group, InstantiationSummaries); @@ -359,13 +364,15 @@ void CoverageReport::renderFileReports(raw_ostream &OS) const { std::vector<std::string> UniqueSourceFiles; for (StringRef SF : Coverage.getUniqueSourceFiles()) UniqueSourceFiles.emplace_back(SF.str()); - renderFileReports(OS, UniqueSourceFiles); + renderFileReports(OS, UniqueSourceFiles, CoverageFiltersMatchAll()); } void CoverageReport::renderFileReports(raw_ostream &OS, - ArrayRef<std::string> Files) const { + ArrayRef<std::string> Files, + const CoverageFilter &Filters) const { FileCoverageSummary Totals("TOTAL"); - auto FileReports = prepareFileReports(Coverage, Totals, Files, Options); + auto FileReports = + prepareFileReports(Coverage, Totals, Files, Options, Filters); std::vector<StringRef> Filenames; for (const FileCoverageSummary &FCS : FileReports) diff --git a/tools/llvm-cov/CoverageReport.h b/tools/llvm-cov/CoverageReport.h index 242dc7fe7ba..d78f2e4c2bd 100644 --- a/tools/llvm-cov/CoverageReport.h +++ b/tools/llvm-cov/CoverageReport.h @@ -14,6 +14,7 @@ #ifndef LLVM_COV_COVERAGEREPORT_H #define LLVM_COV_COVERAGEREPORT_H +#include "CoverageFilters.h" #include "CoverageSummaryInfo.h" #include "CoverageViewOptions.h" @@ -40,13 +41,16 @@ public: static std::vector<FileCoverageSummary> prepareFileReports(const coverage::CoverageMapping &Coverage, FileCoverageSummary &Totals, ArrayRef<std::string> Files, - const CoverageViewOptions &Options); + const CoverageViewOptions &Options, + const CoverageFilter &Filters = CoverageFiltersMatchAll()); /// Render file reports for every unique file in the coverage mapping. void renderFileReports(raw_ostream &OS) const; - /// Render file reports for the files specified in \p Files. - void renderFileReports(raw_ostream &OS, ArrayRef<std::string> Files) const; + /// Render file reports for the files specified in \p Files and the functions + /// in \p Filters. + void renderFileReports(raw_ostream &OS, ArrayRef<std::string> Files, + const CoverageFilter &Filters) const; }; } // end namespace llvm diff --git a/tools/llvm-cov/SourceCoverageView.cpp b/tools/llvm-cov/SourceCoverageView.cpp index dc00b802e38..f944dc62b9e 100644 --- a/tools/llvm-cov/SourceCoverageView.cpp +++ b/tools/llvm-cov/SourceCoverageView.cpp @@ -164,8 +164,9 @@ void SourceCoverageView::addInstantiation( } void SourceCoverageView::print(raw_ostream &OS, bool WholeFile, - bool ShowSourceName, unsigned ViewDepth) { - if (WholeFile && getOptions().hasOutputDirectory()) + bool ShowSourceName, bool ShowTitle, + unsigned ViewDepth) { + if (ShowTitle) renderTitle(OS, "Coverage Report"); renderViewHeader(OS); diff --git a/tools/llvm-cov/SourceCoverageView.h b/tools/llvm-cov/SourceCoverageView.h index 72d6866ed7d..7c7e8781364 100644 --- a/tools/llvm-cov/SourceCoverageView.h +++ b/tools/llvm-cov/SourceCoverageView.h @@ -22,6 +22,7 @@ namespace llvm { +class CoverageFilter; class SourceCoverageView; /// \brief A view that represents a macro or include expansion. @@ -111,7 +112,8 @@ public: /// \brief Create an index which lists reports for the given source files. virtual Error createIndexFile(ArrayRef<std::string> SourceFiles, - const coverage::CoverageMapping &Coverage) = 0; + const coverage::CoverageMapping &Coverage, + const CoverageFilter &Filters) = 0; /// @} }; @@ -258,7 +260,7 @@ public: /// \brief Print the code coverage information for a specific portion of a /// source file to the output stream. void print(raw_ostream &OS, bool WholeFile, bool ShowSourceName, - unsigned ViewDepth = 0); + bool ShowTitle, unsigned ViewDepth = 0); }; } // namespace llvm diff --git a/tools/llvm-cov/SourceCoverageViewHTML.cpp b/tools/llvm-cov/SourceCoverageViewHTML.cpp index 300a0162bd1..a031f184825 100644 --- a/tools/llvm-cov/SourceCoverageViewHTML.cpp +++ b/tools/llvm-cov/SourceCoverageViewHTML.cpp @@ -366,7 +366,7 @@ void CoveragePrinterHTML::emitFileSummary(raw_ostream &OS, StringRef SF, Error CoveragePrinterHTML::createIndexFile( ArrayRef<std::string> SourceFiles, - const coverage::CoverageMapping &Coverage) { + const coverage::CoverageMapping &Coverage, const CoverageFilter &Filters) { // Emit the default stylesheet. auto CSSOrErr = createOutputStream("style", "css", /*InToplevel=*/true); if (Error E = CSSOrErr.takeError()) @@ -404,8 +404,8 @@ Error CoveragePrinterHTML::createIndexFile( OSRef << BeginCenteredDiv << BeginTable; emitColumnLabelsForIndex(OSRef, Opts); FileCoverageSummary Totals("TOTALS"); - auto FileReports = - CoverageReport::prepareFileReports(Coverage, Totals, SourceFiles, Opts); + auto FileReports = CoverageReport::prepareFileReports( + Coverage, Totals, SourceFiles, Opts, Filters); bool EmptyFiles = false; for (unsigned I = 0, E = FileReports.size(); I < E; ++I) { if (FileReports[I].FunctionCoverage.getNumFunctions()) @@ -620,7 +620,7 @@ void SourceCoverageViewHTML::renderExpansionView(raw_ostream &OS, unsigned ViewDepth) { OS << BeginExpansionDiv; ESV.View->print(OS, /*WholeFile=*/false, /*ShowSourceName=*/false, - ViewDepth + 1); + /*ShowTitle=*/false, ViewDepth + 1); OS << EndExpansionDiv; } @@ -636,7 +636,7 @@ void SourceCoverageViewHTML::renderInstantiationView(raw_ostream &OS, << EndSourceNameDiv; else ISV.View->print(OS, /*WholeFile=*/false, /*ShowSourceName=*/true, - ViewDepth); + /*ShowTitle=*/false, ViewDepth); OS << EndExpansionDiv; } diff --git a/tools/llvm-cov/SourceCoverageViewHTML.h b/tools/llvm-cov/SourceCoverageViewHTML.h index 8cb73567a2e..e11111a5ad2 100644 --- a/tools/llvm-cov/SourceCoverageViewHTML.h +++ b/tools/llvm-cov/SourceCoverageViewHTML.h @@ -29,7 +29,8 @@ public: void closeViewFile(OwnedStream OS) override; Error createIndexFile(ArrayRef<std::string> SourceFiles, - const coverage::CoverageMapping &Coverage) override; + const coverage::CoverageMapping &Coverage, + const CoverageFilter &Filters) override; CoveragePrinterHTML(const CoverageViewOptions &Opts) : CoveragePrinter(Opts) {} diff --git a/tools/llvm-cov/SourceCoverageViewText.cpp b/tools/llvm-cov/SourceCoverageViewText.cpp index a78c0575cdc..b2902df185d 100644 --- a/tools/llvm-cov/SourceCoverageViewText.cpp +++ b/tools/llvm-cov/SourceCoverageViewText.cpp @@ -30,7 +30,7 @@ void CoveragePrinterText::closeViewFile(OwnedStream OS) { Error CoveragePrinterText::createIndexFile( ArrayRef<std::string> SourceFiles, - const coverage::CoverageMapping &Coverage) { + const coverage::CoverageMapping &Coverage, const CoverageFilter &Filters) { auto OSOrErr = createOutputStream("index", "txt", /*InToplevel=*/true); if (Error E = OSOrErr.takeError()) return E; @@ -38,7 +38,7 @@ Error CoveragePrinterText::createIndexFile( raw_ostream &OSRef = *OS.get(); CoverageReport Report(Opts, Coverage); - Report.renderFileReports(OSRef, SourceFiles); + Report.renderFileReports(OSRef, SourceFiles, Filters); Opts.colored_ostream(OSRef, raw_ostream::CYAN) << "\n" << Opts.getLLVMVersionString(); @@ -210,7 +210,7 @@ void SourceCoverageViewText::renderExpansionView(raw_ostream &OS, errs() << "Expansion at line " << ESV.getLine() << ", " << ESV.getStartCol() << " -> " << ESV.getEndCol() << '\n'; ESV.View->print(OS, /*WholeFile=*/false, /*ShowSourceName=*/false, - ViewDepth + 1); + /*ShowTitle=*/false, ViewDepth + 1); } void SourceCoverageViewText::renderInstantiationView(raw_ostream &OS, @@ -223,7 +223,7 @@ void SourceCoverageViewText::renderInstantiationView(raw_ostream &OS, << "Unexecuted instantiation: " << ISV.FunctionName << "\n"; else ISV.View->print(OS, /*WholeFile=*/false, /*ShowSourceName=*/true, - ViewDepth); + /*ShowTitle=*/false, ViewDepth); } void SourceCoverageViewText::renderTitle(raw_ostream &OS, StringRef Title) { diff --git a/tools/llvm-cov/SourceCoverageViewText.h b/tools/llvm-cov/SourceCoverageViewText.h index c3f20de9297..3a04070d1ac 100644 --- a/tools/llvm-cov/SourceCoverageViewText.h +++ b/tools/llvm-cov/SourceCoverageViewText.h @@ -27,7 +27,8 @@ public: void closeViewFile(OwnedStream OS) override; Error createIndexFile(ArrayRef<std::string> SourceFiles, - const coverage::CoverageMapping &Coverage) override; + const coverage::CoverageMapping &Coverage, + const CoverageFilter &Filters) override; CoveragePrinterText(const CoverageViewOptions &Opts) : CoveragePrinter(Opts) {} |