summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-cov
diff options
context:
space:
mode:
authorMax Moroz <mmoroz@chromium.org>2018-04-09 15:20:35 +0000
committerMax Moroz <mmoroz@chromium.org>2018-04-09 15:20:35 +0000
commit4220f89107c49e7db2247e575263ccd752cdf442 (patch)
tree2af9607851ab1d140de7fccb0507b4ffab8f0de5 /llvm/tools/llvm-cov
parentea9773ac69389c6eac82384b3cf98ceb774ff740 (diff)
downloadbcm5719-llvm-4220f89107c49e7db2247e575263ccd752cdf442.tar.gz
bcm5719-llvm-4220f89107c49e7db2247e575263ccd752cdf442.zip
[llvm-cov] Implement -ignore-filename-regex= option for excluding source files.
Summary: The option is helpful for large projects where it's not feasible to specify sources which user would like to see in the report. Instead, it allows to black-list specific sources via regular expressions (e.g. now it's possible to skip all files that have "test" in its name). This also partially fixes https://bugs.llvm.org/show_bug.cgi?id=34277 Reviewers: vsk, morehouse, liaoyuke Reviewed By: vsk Subscribers: kcc, mgorny, llvm-commits Differential Revision: https://reviews.llvm.org/D43907 llvm-svn: 329581
Diffstat (limited to 'llvm/tools/llvm-cov')
-rw-r--r--llvm/tools/llvm-cov/CodeCoverage.cpp27
-rw-r--r--llvm/tools/llvm-cov/CoverageExporter.h3
-rw-r--r--llvm/tools/llvm-cov/CoverageExporterJson.cpp13
-rw-r--r--llvm/tools/llvm-cov/CoverageExporterJson.h2
-rw-r--r--llvm/tools/llvm-cov/CoverageFilters.cpp12
-rw-r--r--llvm/tools/llvm-cov/CoverageFilters.h9
-rw-r--r--llvm/tools/llvm-cov/CoverageReport.cpp10
-rw-r--r--llvm/tools/llvm-cov/CoverageReport.h3
8 files changed, 63 insertions, 16 deletions
diff --git a/llvm/tools/llvm-cov/CodeCoverage.cpp b/llvm/tools/llvm-cov/CodeCoverage.cpp
index 2cfe02b3eb0..430cb0b50c9 100644
--- a/llvm/tools/llvm-cov/CodeCoverage.cpp
+++ b/llvm/tools/llvm-cov/CodeCoverage.cpp
@@ -126,6 +126,7 @@ private:
std::vector<StringRef> ObjectFilenames;
CoverageViewOptions ViewOpts;
CoverageFiltersMatchAll Filters;
+ CoverageFilters IgnoreFilenameFilters;
/// The path to the indexed profile.
std::string PGOFilename;
@@ -189,7 +190,8 @@ void CodeCoverageTool::addCollectedPath(const std::string &Path) {
return;
}
sys::path::remove_dots(EffectivePath, /*remove_dot_dots=*/true);
- SourceFiles.emplace_back(EffectivePath.str());
+ if (!IgnoreFilenameFilters.matchesFilename(EffectivePath))
+ SourceFiles.emplace_back(EffectivePath.str());
}
void CodeCoverageTool::collectPaths(const std::string &Path) {
@@ -597,6 +599,12 @@ int CodeCoverageTool::run(Command Cmd, int argc, const char **argv) {
"regular expression"),
cl::ZeroOrMore, cl::cat(FilteringCategory));
+ cl::list<std::string> IgnoreFilenameRegexFilters(
+ "ignore-filename-regex", cl::Optional,
+ cl::desc("Skip source code files with file paths that match the given "
+ "regular expression"),
+ cl::ZeroOrMore, cl::cat(FilteringCategory));
+
cl::opt<double> RegionCoverageLtFilter(
"region-coverage-lt", cl::Optional,
cl::desc("Show code coverage only for functions with region coverage "
@@ -714,6 +722,7 @@ int CodeCoverageTool::run(Command Cmd, int argc, const char **argv) {
llvm::make_unique<NameRegexCoverageFilter>(Regex));
Filters.push_back(std::move(NameFilterer));
}
+
if (RegionCoverageLtFilter.getNumOccurrences() ||
RegionCoverageGtFilter.getNumOccurrences() ||
LineCoverageLtFilter.getNumOccurrences() ||
@@ -734,6 +743,11 @@ int CodeCoverageTool::run(Command Cmd, int argc, const char **argv) {
Filters.push_back(std::move(StatFilterer));
}
+ // Create the ignore filename filters.
+ for (const auto &RE : IgnoreFilenameRegexFilters)
+ IgnoreFilenameFilters.push_back(
+ llvm::make_unique<NameRegexCoverageFilter>(RE));
+
if (!Arches.empty()) {
for (const std::string &Arch : Arches) {
if (Triple(Arch).getArch() == llvm::Triple::ArchType::UnknownArch) {
@@ -748,6 +762,7 @@ int CodeCoverageTool::run(Command Cmd, int argc, const char **argv) {
}
}
+ // IgnoreFilenameFilters are applied even when InputSourceFiles specified.
for (const std::string &File : InputSourceFiles)
collectPaths(File);
@@ -862,8 +877,10 @@ int CodeCoverageTool::doShow(int argc, const char **argv,
if (SourceFiles.empty())
// Get the source files from the function coverage mapping.
- for (StringRef Filename : Coverage->getUniqueSourceFiles())
- SourceFiles.push_back(Filename);
+ for (StringRef Filename : Coverage->getUniqueSourceFiles()) {
+ if (!IgnoreFilenameFilters.matchesFilename(Filename))
+ SourceFiles.push_back(Filename);
+ }
// Create an index out of the source files.
if (ViewOpts.hasOutputDirectory()) {
@@ -962,7 +979,7 @@ int CodeCoverageTool::doReport(int argc, const char **argv,
CoverageReport Report(ViewOpts, *Coverage.get());
if (!ShowFunctionSummaries) {
if (SourceFiles.empty())
- Report.renderFileReports(llvm::outs());
+ Report.renderFileReports(llvm::outs(), IgnoreFilenameFilters);
else
Report.renderFileReports(llvm::outs(), SourceFiles);
} else {
@@ -998,7 +1015,7 @@ int CodeCoverageTool::doExport(int argc, const char **argv,
auto Exporter = CoverageExporterJson(*Coverage.get(), ViewOpts, outs());
if (SourceFiles.empty())
- Exporter.renderRoot();
+ Exporter.renderRoot(IgnoreFilenameFilters);
else
Exporter.renderRoot(SourceFiles);
diff --git a/llvm/tools/llvm-cov/CoverageExporter.h b/llvm/tools/llvm-cov/CoverageExporter.h
index af9c8f062e4..898e9755652 100644
--- a/llvm/tools/llvm-cov/CoverageExporter.h
+++ b/llvm/tools/llvm-cov/CoverageExporter.h
@@ -14,6 +14,7 @@
#ifndef LLVM_COV_COVERAGEEXPORTER_H
#define LLVM_COV_COVERAGEEXPORTER_H
+#include "CoverageFilters.h"
#include "CoverageSummaryInfo.h"
#include "CoverageViewOptions.h"
#include "llvm/ProfileData/Coverage/CoverageMapping.h"
@@ -40,7 +41,7 @@ public:
virtual ~CoverageExporter(){};
/// \brief Render the CoverageMapping object.
- virtual void renderRoot() = 0;
+ virtual void renderRoot(const CoverageFilters &IgnoreFilenameFilters) = 0;
/// \brief Render the CoverageMapping object for specified source files.
virtual void renderRoot(const std::vector<std::string> &SourceFiles) = 0;
diff --git a/llvm/tools/llvm-cov/CoverageExporterJson.cpp b/llvm/tools/llvm-cov/CoverageExporterJson.cpp
index 3621f9ab97f..fc631ac6d83 100644
--- a/llvm/tools/llvm-cov/CoverageExporterJson.cpp
+++ b/llvm/tools/llvm-cov/CoverageExporterJson.cpp
@@ -117,10 +117,13 @@ void CoverageExporterJson::emitArrayEnd() {
OS << "]";
}
-void CoverageExporterJson::renderRoot() {
+void CoverageExporterJson::renderRoot(
+ const CoverageFilters &IgnoreFilenameFilters) {
std::vector<std::string> SourceFiles;
- for (StringRef SF : Coverage.getUniqueSourceFiles())
- SourceFiles.emplace_back(SF);
+ for (StringRef SF : Coverage.getUniqueSourceFiles()) {
+ if (!IgnoreFilenameFilters.matchesFilename(SF))
+ SourceFiles.emplace_back(SF);
+ }
renderRoot(SourceFiles);
}
@@ -218,11 +221,11 @@ void CoverageExporterJson::renderFiles(
void CoverageExporterJson::renderFile(const std::string &Filename,
const FileCoverageSummary &FileReport) {
- // Start File.
+ // Start File.
emitDictStart();
emitDictElement("filename", Filename);
-
+
if (!Options.ExportSummaryOnly) {
// Calculate and render detailed coverage information for given file.
auto FileCoverage = Coverage.getCoverageForFile(Filename);
diff --git a/llvm/tools/llvm-cov/CoverageExporterJson.h b/llvm/tools/llvm-cov/CoverageExporterJson.h
index 4631e94d535..afab8a89e29 100644
--- a/llvm/tools/llvm-cov/CoverageExporterJson.h
+++ b/llvm/tools/llvm-cov/CoverageExporterJson.h
@@ -101,7 +101,7 @@ public:
const CoverageViewOptions &Options, raw_ostream &OS);
/// \brief Render the CoverageMapping object.
- void renderRoot() override;
+ void renderRoot(const CoverageFilters &IgnoreFilenameFilters) override;
/// \brief Render the CoverageMapping object for specified source files.
void renderRoot(const std::vector<std::string> &SourceFiles) override;
diff --git a/llvm/tools/llvm-cov/CoverageFilters.cpp b/llvm/tools/llvm-cov/CoverageFilters.cpp
index 441179601dc..4dd0f552c7e 100644
--- a/llvm/tools/llvm-cov/CoverageFilters.cpp
+++ b/llvm/tools/llvm-cov/CoverageFilters.cpp
@@ -30,6 +30,10 @@ bool NameRegexCoverageFilter::matches(
return llvm::Regex(Regex).match(Function.Name);
}
+bool NameRegexCoverageFilter::matchesFilename(StringRef Filename) const {
+ return llvm::Regex(Regex).match(Filename);
+}
+
bool NameWhitelistCoverageFilter::matches(
const coverage::CoverageMapping &,
const coverage::FunctionRecord &Function) const {
@@ -63,6 +67,14 @@ bool CoverageFilters::matches(const coverage::CoverageMapping &CM,
return false;
}
+bool CoverageFilters::matchesFilename(StringRef Filename) const {
+ for (const auto &Filter : Filters) {
+ if (Filter->matchesFilename(Filename))
+ return true;
+ }
+ return false;
+}
+
bool CoverageFiltersMatchAll::matches(
const coverage::CoverageMapping &CM,
const coverage::FunctionRecord &Function) const {
diff --git a/llvm/tools/llvm-cov/CoverageFilters.h b/llvm/tools/llvm-cov/CoverageFilters.h
index aeaf61de173..eacc6d2d489 100644
--- a/llvm/tools/llvm-cov/CoverageFilters.h
+++ b/llvm/tools/llvm-cov/CoverageFilters.h
@@ -32,6 +32,11 @@ public:
const coverage::FunctionRecord &Function) const {
return true;
}
+
+ /// \brief Return true if the filename passes the requirements of this filter.
+ virtual bool matchesFilename(StringRef Filename) const {
+ return true;
+ }
};
/// \brief Matches functions that contain a specific string in their name.
@@ -54,6 +59,8 @@ public:
bool matches(const coverage::CoverageMapping &CM,
const coverage::FunctionRecord &Function) const override;
+
+ bool matchesFilename(StringRef Filename) const override;
};
/// \brief Matches functions whose name appears in a SpecialCaseList in the
@@ -133,6 +140,8 @@ public:
bool matches(const coverage::CoverageMapping &CM,
const coverage::FunctionRecord &Function) const override;
+
+ bool matchesFilename(StringRef Filename) const override;
};
/// \brief A collection of filters.
diff --git a/llvm/tools/llvm-cov/CoverageReport.cpp b/llvm/tools/llvm-cov/CoverageReport.cpp
index aafdc433775..5d892202f0d 100644
--- a/llvm/tools/llvm-cov/CoverageReport.cpp
+++ b/llvm/tools/llvm-cov/CoverageReport.cpp
@@ -379,10 +379,14 @@ std::vector<FileCoverageSummary> CoverageReport::prepareFileReports(
return FileReports;
}
-void CoverageReport::renderFileReports(raw_ostream &OS) const {
+void CoverageReport::renderFileReports(
+ raw_ostream &OS, const CoverageFilters &IgnoreFilenameFilters) const {
std::vector<std::string> UniqueSourceFiles;
- for (StringRef SF : Coverage.getUniqueSourceFiles())
- UniqueSourceFiles.emplace_back(SF.str());
+ for (StringRef SF : Coverage.getUniqueSourceFiles()) {
+ // Apply ignore source files filters.
+ if (!IgnoreFilenameFilters.matchesFilename(SF))
+ UniqueSourceFiles.emplace_back(SF.str());
+ }
renderFileReports(OS, UniqueSourceFiles);
}
diff --git a/llvm/tools/llvm-cov/CoverageReport.h b/llvm/tools/llvm-cov/CoverageReport.h
index f90729b910a..8864d309fe9 100644
--- a/llvm/tools/llvm-cov/CoverageReport.h
+++ b/llvm/tools/llvm-cov/CoverageReport.h
@@ -53,7 +53,8 @@ public:
const CoverageFilter *Filters);
/// Render file reports for every unique file in the coverage mapping.
- void renderFileReports(raw_ostream &OS) const;
+ void renderFileReports(raw_ostream &OS,
+ const CoverageFilters &IgnoreFilenameFilters) const;
/// Render file reports for the files specified in \p Files.
void renderFileReports(raw_ostream &OS, ArrayRef<std::string> Files) const;
OpenPOWER on IntegriCloud