diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2019-01-19 10:01:25 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2019-01-19 10:01:25 +0000 |
commit | d8e91e46262bc44006913e6796843909f1ac7bcd (patch) | |
tree | 7d0c143d9b38190e0fa0180805389da22cd834c5 /tools/llvm-cov/CodeCoverage.cpp | |
parent | b7eb8e35e481a74962664b63dfb09483b200209a (diff) |
Notes
Diffstat (limited to 'tools/llvm-cov/CodeCoverage.cpp')
-rw-r--r-- | tools/llvm-cov/CodeCoverage.cpp | 60 |
1 files changed, 44 insertions, 16 deletions
diff --git a/tools/llvm-cov/CodeCoverage.cpp b/tools/llvm-cov/CodeCoverage.cpp index e93b63d388e0..728e00e7c3c2 100644 --- a/tools/llvm-cov/CodeCoverage.cpp +++ b/tools/llvm-cov/CodeCoverage.cpp @@ -14,6 +14,7 @@ //===----------------------------------------------------------------------===// #include "CoverageExporterJson.h" +#include "CoverageExporterLcov.h" #include "CoverageFilters.h" #include "CoverageReport.h" #include "CoverageSummaryInfo.h" @@ -215,12 +216,13 @@ void CodeCoverageTool::collectPaths(const std::string &Path) { for (llvm::sys::fs::recursive_directory_iterator F(Path, EC), E; F != E; F.increment(EC)) { - if (EC) { - warning(EC.message(), F->path()); + auto Status = F->status(); + if (!Status) { + warning(Status.getError().message(), F->path()); continue; } - if (llvm::sys::fs::is_regular_file(F->path())) + if (Status->type() == llvm::sys::fs::file_type::regular_file) addCollectedPath(F->path()); } } @@ -368,12 +370,6 @@ std::unique_ptr<CoverageMapping> CodeCoverageTool::load() { << "No profile record found for '" << HashMismatch.first << "'" << " with hash = 0x" << Twine::utohexstr(HashMismatch.second) << '\n'; - - for (const auto &CounterMismatch : Coverage->getCounterMismatches()) - errs() << "counter-mismatch: " - << "Coverage mapping for " << CounterMismatch.first - << " only has " << CounterMismatch.second - << " valid counter expressions\n"; } } @@ -571,7 +567,9 @@ int CodeCoverageTool::run(Command Cmd, int argc, const char **argv) { cl::values(clEnumValN(CoverageViewOptions::OutputFormat::Text, "text", "Text output"), clEnumValN(CoverageViewOptions::OutputFormat::HTML, "html", - "HTML output")), + "HTML output"), + clEnumValN(CoverageViewOptions::OutputFormat::Lcov, "lcov", + "lcov tracefile output")), cl::init(CoverageViewOptions::OutputFormat::Text)); cl::opt<std::string> PathRemap( @@ -679,6 +677,11 @@ int CodeCoverageTool::run(Command Cmd, int argc, const char **argv) { errs() << "Color output cannot be disabled when generating html.\n"; ViewOpts.Colors = true; break; + case CoverageViewOptions::OutputFormat::Lcov: + if (UseColor == cl::BOU_TRUE) + errs() << "Color output cannot be enabled when generating lcov.\n"; + ViewOpts.Colors = false; + break; } // If path-equivalence was given and is a comma seperated pair then set @@ -688,7 +691,7 @@ int CodeCoverageTool::run(Command Cmd, int argc, const char **argv) { PathRemapping = EquivPair; // If a demangler is supplied, check if it exists and register it. - if (DemanglerOpts.size()) { + if (!DemanglerOpts.empty()) { auto DemanglerPathOrErr = sys::findProgramByName(DemanglerOpts[0]); if (!DemanglerPathOrErr) { error("Could not find the demangler!", @@ -838,6 +841,11 @@ int CodeCoverageTool::doShow(int argc, const char **argv, if (Err) return Err; + if (ViewOpts.Format == CoverageViewOptions::OutputFormat::Lcov) { + error("Lcov format should be used with 'llvm-cov export'."); + return 1; + } + ViewOpts.ShowLineNumbers = true; ViewOpts.ShowLineStats = ShowLineExecutionCounts.getNumOccurrences() != 0 || !ShowRegions || ShowBestLineRegionsCounts; @@ -969,6 +977,9 @@ int CodeCoverageTool::doReport(int argc, const char **argv, if (ViewOpts.Format == CoverageViewOptions::OutputFormat::HTML) { error("HTML output for summary reports is not yet supported."); return 1; + } else if (ViewOpts.Format == CoverageViewOptions::OutputFormat::Lcov) { + error("Lcov format should be used with 'llvm-cov export'."); + return 1; } auto Coverage = load(); @@ -1000,8 +1011,10 @@ int CodeCoverageTool::doExport(int argc, const char **argv, if (Err) return Err; - if (ViewOpts.Format != CoverageViewOptions::OutputFormat::Text) { - error("Coverage data can only be exported as textual JSON."); + if (ViewOpts.Format != CoverageViewOptions::OutputFormat::Text && + ViewOpts.Format != CoverageViewOptions::OutputFormat::Lcov) { + error("Coverage data can only be exported as textual JSON or an " + "lcov tracefile."); return 1; } @@ -1011,12 +1024,27 @@ int CodeCoverageTool::doExport(int argc, const char **argv, return 1; } - auto Exporter = CoverageExporterJson(*Coverage.get(), ViewOpts, outs()); + std::unique_ptr<CoverageExporter> Exporter; + + switch (ViewOpts.Format) { + case CoverageViewOptions::OutputFormat::Text: + Exporter = llvm::make_unique<CoverageExporterJson>(*Coverage.get(), + ViewOpts, outs()); + break; + case CoverageViewOptions::OutputFormat::HTML: + // Unreachable because we should have gracefully terminated with an error + // above. + llvm_unreachable("Export in HTML is not supported!"); + case CoverageViewOptions::OutputFormat::Lcov: + Exporter = llvm::make_unique<CoverageExporterLcov>(*Coverage.get(), + ViewOpts, outs()); + break; + } if (SourceFiles.empty()) - Exporter.renderRoot(IgnoreFilenameFilters); + Exporter->renderRoot(IgnoreFilenameFilters); else - Exporter.renderRoot(SourceFiles); + Exporter->renderRoot(SourceFiles); return 0; } |