mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
[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 llvm-svn: 314396
This commit is contained in:
parent
2736a46c89
commit
e5dd14d47e
BIN
test/tools/llvm-cov/Inputs/dir-with-filtering.covmapping
Normal file
BIN
test/tools/llvm-cov/Inputs/dir-with-filtering.covmapping
Normal file
Binary file not shown.
32
test/tools/llvm-cov/Inputs/dir-with-filtering.proftext
Normal file
32
test/tools/llvm-cov/Inputs/dir-with-filtering.proftext
Normal file
@ -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
|
||||
|
8
test/tools/llvm-cov/Inputs/dir-with-filtering1.cpp
Normal file
8
test/tools/llvm-cov/Inputs/dir-with-filtering1.cpp
Normal file
@ -0,0 +1,8 @@
|
||||
int f1() {
|
||||
return 1;
|
||||
}
|
||||
|
||||
int main() {
|
||||
f1();
|
||||
return 0;
|
||||
}
|
8
test/tools/llvm-cov/Inputs/dir-with-filtering2.cpp
Normal file
8
test/tools/llvm-cov/Inputs/dir-with-filtering2.cpp
Normal file
@ -0,0 +1,8 @@
|
||||
int f2() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
int f3() {
|
||||
return 3;
|
||||
}
|
||||
|
69
test/tools/llvm-cov/dir-with-filtering.test
Normal file
69
test/tools/llvm-cov/dir-with-filtering.test
Normal file
@ -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
|
@ -40,7 +40,7 @@ int main() {
|
||||
|
||||
// Test that listing multiple functions in a function view works.
|
||||
// RUN: llvm-cov show -o %t.dir %S/Inputs/report.covmapping -instr-profile=%S/Inputs/report.profdata -path-equivalence=,%S -name-regex=".*" %s
|
||||
// RUN: FileCheck -check-prefix=FUNCTIONS -input-file %t.dir/functions.txt %s
|
||||
// RUN: FileCheck -check-prefix=FUNCTIONS -input-file %t.dir/coverage/report.cpp.txt %s
|
||||
// FUNCTIONS: _Z3foob
|
||||
// FUNCTIONS: _Z3barv
|
||||
// FUNCTIONS: _Z4func
|
||||
|
@ -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
|
||||
|
@ -24,5 +24,5 @@ int main(int argc, char ** argv) {
|
||||
// RUN: llvm-cov show %S/Inputs/showProjectSummary.covmapping -format=html -o %t.dir -instr-profile %t.profdata -project-title "Test Suite" -path-equivalence=/tmp,%S %s
|
||||
// RUN: FileCheck -check-prefixes=HTML-TITLE,HTML,HTML-FILE,HTML-HEADER -input-file %t.dir/coverage/tmp/showProjectSummary.cpp.html %S/Inputs/showProjectSummary.test
|
||||
// RUN: FileCheck -check-prefixes=HTML-TITLE,HTML,HTML-FOOTER -input-file %t.dir/index.html %S/Inputs/showProjectSummary.test
|
||||
// RUN: llvm-cov show %S/Inputs/showProjectSummary.covmapping -format=html -o %t.dir -instr-profile %t.profdata -project-title "Test Suite" -path-equivalence=/tmp,%S -name=main %s
|
||||
// RUN: FileCheck -check-prefixes=HTML-FUNCTION,HTML-HEADER -input-file %t.dir/functions.html %S/Inputs/showProjectSummary.test
|
||||
// RUN: llvm-cov show %S/Inputs/showProjectSummary.covmapping -format=html -o %t.filtered.dir -instr-profile %t.profdata -project-title "Test Suite" -path-equivalence=/tmp,%S -name=main %s
|
||||
// RUN: FileCheck -check-prefixes=HTML-TITLE,HTML,HTML-FOOTER -input-file %t.filtered.dir/index.html %S/Inputs/showProjectSummary.test
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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,37 +848,6 @@ 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)));
|
||||
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;
|
||||
}
|
||||
|
||||
mainView->print(*OS.get(), /*WholeFile=*/false, /*ShowSourceName=*/true);
|
||||
}
|
||||
|
||||
Printer->closeViewFile(std::move(OS));
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Show files
|
||||
bool ShowFilenames =
|
||||
(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())
|
||||
@ -883,12 +855,55 @@ int CodeCoverageTool::show(int argc, const char **argv,
|
||||
|
||||
// Create an index out of the source files.
|
||||
if (ViewOpts.hasOutputDirectory()) {
|
||||
if (Error E = Printer->createIndexFile(SourceFiles, *Coverage)) {
|
||||
if (Error E = Printer->createIndexFile(SourceFiles, *Coverage, Filters)) {
|
||||
error("Could not create index file!", toString(std::move(E)));
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
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) {
|
||||
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;
|
||||
}
|
||||
|
||||
Printer->closeViewFile(std::move(OS));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Show files
|
||||
bool ShowFilenames =
|
||||
(SourceFiles.size() != 1) || ViewOpts.hasOutputDirectory() ||
|
||||
(ViewOpts.Format == CoverageViewOptions::OutputFormat::HTML);
|
||||
|
||||
// If NumThreads is not specified, auto-detect a good default.
|
||||
if (NumThreads == 0)
|
||||
NumThreads =
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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) {}
|
||||
|
@ -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) {
|
||||
|
@ -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) {}
|
||||
|
Loading…
x
Reference in New Issue
Block a user