diff options
Diffstat (limited to 'contrib/llvm/tools/llvm-cov/CoverageReport.cpp')
| -rw-r--r-- | contrib/llvm/tools/llvm-cov/CoverageReport.cpp | 180 |
1 files changed, 109 insertions, 71 deletions
diff --git a/contrib/llvm/tools/llvm-cov/CoverageReport.cpp b/contrib/llvm/tools/llvm-cov/CoverageReport.cpp index c68bb9048df1..9c553a7f64c7 100644 --- a/contrib/llvm/tools/llvm-cov/CoverageReport.cpp +++ b/contrib/llvm/tools/llvm-cov/CoverageReport.cpp @@ -14,7 +14,6 @@ #include "CoverageReport.h" #include "RenderingSupport.h" #include "llvm/ADT/DenseMap.h" -#include "llvm/Support/FileSystem.h" #include "llvm/Support/Format.h" #include "llvm/Support/Path.h" #include <numeric> @@ -181,47 +180,58 @@ void CoverageReport::render(const FileCoverageSummary &File, SmallString<256> FileName = File.Name; sys::path::remove_dots(FileName, /*remove_dot_dots=*/true); sys::path::native(FileName); - OS << column(FileName, FileReportColumns[0], Column::NoTrim) - << format("%*u", FileReportColumns[1], - (unsigned)File.RegionCoverage.NumRegions); - Options.colored_ostream(OS, FileCoverageColor) << format( - "%*u", FileReportColumns[2], (unsigned)File.RegionCoverage.NotCovered); - if (File.RegionCoverage.NumRegions) + OS << column(FileName, FileReportColumns[0], Column::NoTrim); + + if (Options.ShowRegionSummary) { + OS << format("%*u", FileReportColumns[1], + (unsigned)File.RegionCoverage.getNumRegions()); Options.colored_ostream(OS, FileCoverageColor) - << format("%*.2f", FileReportColumns[3] - 1, - File.RegionCoverage.getPercentCovered()) - << '%'; - else - OS << column("-", FileReportColumns[3], Column::RightAlignment); + << format("%*u", FileReportColumns[2], + (unsigned)(File.RegionCoverage.getNumRegions() - + File.RegionCoverage.getCovered())); + if (File.RegionCoverage.getNumRegions()) + Options.colored_ostream(OS, FileCoverageColor) + << format("%*.2f", FileReportColumns[3] - 1, + File.RegionCoverage.getPercentCovered()) + << '%'; + else + OS << column("-", FileReportColumns[3], Column::RightAlignment); + } + OS << format("%*u", FileReportColumns[4], - (unsigned)File.FunctionCoverage.NumFunctions); + (unsigned)File.FunctionCoverage.getNumFunctions()); OS << format("%*u", FileReportColumns[5], - (unsigned)(File.FunctionCoverage.NumFunctions - - File.FunctionCoverage.Executed)); - if (File.FunctionCoverage.NumFunctions) + (unsigned)(File.FunctionCoverage.getNumFunctions() - + File.FunctionCoverage.getExecuted())); + if (File.FunctionCoverage.getNumFunctions()) Options.colored_ostream(OS, FuncCoverageColor) << format("%*.2f", FileReportColumns[6] - 1, File.FunctionCoverage.getPercentCovered()) << '%'; else OS << column("-", FileReportColumns[6], Column::RightAlignment); - OS << format("%*u", FileReportColumns[7], - (unsigned)File.InstantiationCoverage.NumFunctions); - OS << format("%*u", FileReportColumns[8], - (unsigned)(File.InstantiationCoverage.NumFunctions - - File.InstantiationCoverage.Executed)); - if (File.InstantiationCoverage.NumFunctions) - Options.colored_ostream(OS, InstantiationCoverageColor) - << format("%*.2f", FileReportColumns[9] - 1, - File.InstantiationCoverage.getPercentCovered()) - << '%'; - else - OS << column("-", FileReportColumns[9], Column::RightAlignment); + + if (Options.ShowInstantiationSummary) { + OS << format("%*u", FileReportColumns[7], + (unsigned)File.InstantiationCoverage.getNumFunctions()); + OS << format("%*u", FileReportColumns[8], + (unsigned)(File.InstantiationCoverage.getNumFunctions() - + File.InstantiationCoverage.getExecuted())); + if (File.InstantiationCoverage.getNumFunctions()) + Options.colored_ostream(OS, InstantiationCoverageColor) + << format("%*.2f", FileReportColumns[9] - 1, + File.InstantiationCoverage.getPercentCovered()) + << '%'; + else + OS << column("-", FileReportColumns[9], Column::RightAlignment); + } + OS << format("%*u", FileReportColumns[10], - (unsigned)File.LineCoverage.NumLines); + (unsigned)File.LineCoverage.getNumLines()); Options.colored_ostream(OS, LineCoverageColor) << format( - "%*u", FileReportColumns[11], (unsigned)File.LineCoverage.NotCovered); - if (File.LineCoverage.NumLines) + "%*u", FileReportColumns[11], (unsigned)(File.LineCoverage.getNumLines() - + File.LineCoverage.getCovered())); + if (File.LineCoverage.getNumLines()) Options.colored_ostream(OS, LineCoverageColor) << format("%*.2f", FileReportColumns[12] - 1, File.LineCoverage.getPercentCovered()) @@ -241,20 +251,22 @@ void CoverageReport::render(const FunctionCoverageSummary &Function, OS << column(DC.demangle(Function.Name), FunctionReportColumns[0], Column::RightTrim) << format("%*u", FunctionReportColumns[1], - (unsigned)Function.RegionCoverage.NumRegions); + (unsigned)Function.RegionCoverage.getNumRegions()); Options.colored_ostream(OS, FuncCoverageColor) << format("%*u", FunctionReportColumns[2], - (unsigned)Function.RegionCoverage.NotCovered); + (unsigned)(Function.RegionCoverage.getNumRegions() - + Function.RegionCoverage.getCovered())); Options.colored_ostream( OS, determineCoveragePercentageColor(Function.RegionCoverage)) << format("%*.2f", FunctionReportColumns[3] - 1, Function.RegionCoverage.getPercentCovered()) << '%'; OS << format("%*u", FunctionReportColumns[4], - (unsigned)Function.LineCoverage.NumLines); + (unsigned)Function.LineCoverage.getNumLines()); Options.colored_ostream(OS, LineCoverageColor) << format("%*u", FunctionReportColumns[5], - (unsigned)Function.LineCoverage.NotCovered); + (unsigned)(Function.LineCoverage.getNumLines() - + Function.LineCoverage.getCovered())); Options.colored_ostream( OS, determineCoveragePercentageColor(Function.LineCoverage)) << format("%*.2f", FunctionReportColumns[6] - 1, @@ -293,7 +305,7 @@ void CoverageReport::renderFunctionReports(ArrayRef<std::string> Files, OS << "\n"; FunctionCoverageSummary Totals("TOTAL"); for (const auto &F : Functions) { - FunctionCoverageSummary Function = FunctionCoverageSummary::get(F); + auto Function = FunctionCoverageSummary::get(Coverage, F); ++Totals.ExecutionCount; Totals.RegionCoverage += Function.RegionCoverage; Totals.LineCoverage += Function.LineCoverage; @@ -307,35 +319,38 @@ void CoverageReport::renderFunctionReports(ArrayRef<std::string> Files, } } -std::vector<FileCoverageSummary> -CoverageReport::prepareFileReports(const coverage::CoverageMapping &Coverage, - FileCoverageSummary &Totals, - ArrayRef<std::string> Files) { +std::vector<FileCoverageSummary> CoverageReport::prepareFileReports( + const coverage::CoverageMapping &Coverage, FileCoverageSummary &Totals, + ArrayRef<std::string> Files, const CoverageViewOptions &Options, + const CoverageFilter &Filters) { std::vector<FileCoverageSummary> FileReports; unsigned LCP = getRedundantPrefixLen(Files); for (StringRef Filename : Files) { FileCoverageSummary Summary(Filename.drop_front(LCP)); - // Map source locations to aggregate function coverage summaries. - DenseMap<std::pair<unsigned, unsigned>, FunctionCoverageSummary> Summaries; - - for (const auto &F : Coverage.getCoveredFunctions(Filename)) { - FunctionCoverageSummary Function = FunctionCoverageSummary::get(F); - auto StartLoc = F.CountedRegions[0].startLoc(); + 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 UniquedSummary = Summaries.insert({StartLoc, Function}); - if (!UniquedSummary.second) - UniquedSummary.first->second.update(Function); + auto GroupSummary = + FunctionCoverageSummary::get(Group, InstantiationSummaries); - Summary.addInstantiation(Function); - Totals.addInstantiation(Function); - } + if (Options.Debug) + outs() << "InstantiationGroup: " << GroupSummary.Name << " with " + << "size = " << Group.size() << "\n"; - for (const auto &UniquedSummary : Summaries) { - const FunctionCoverageSummary &FCS = UniquedSummary.second; - Summary.addFunction(FCS); - Totals.addFunction(FCS); + Summary.addFunction(GroupSummary); + Totals.addFunction(GroupSummary); } FileReports.push_back(Summary); @@ -351,34 +366,57 @@ void CoverageReport::renderFileReports(raw_ostream &OS) const { renderFileReports(OS, UniqueSourceFiles); } -void CoverageReport::renderFileReports(raw_ostream &OS, - ArrayRef<std::string> Files) const { +void CoverageReport::renderFileReports( + raw_ostream &OS, ArrayRef<std::string> Files) const { + renderFileReports(OS, Files, CoverageFiltersMatchAll()); +} + +void CoverageReport::renderFileReports( + raw_ostream &OS, ArrayRef<std::string> Files, + const CoverageFiltersMatchAll &Filters) const { FileCoverageSummary Totals("TOTAL"); - auto FileReports = prepareFileReports(Coverage, Totals, Files); + auto FileReports = + prepareFileReports(Coverage, Totals, Files, Options, Filters); std::vector<StringRef> Filenames; for (const FileCoverageSummary &FCS : FileReports) Filenames.emplace_back(FCS.Name); adjustColumnWidths(Filenames, {}); - OS << column("Filename", FileReportColumns[0]) - << column("Regions", FileReportColumns[1], Column::RightAlignment) - << column("Missed Regions", FileReportColumns[2], Column::RightAlignment) - << column("Cover", FileReportColumns[3], Column::RightAlignment) - << column("Functions", FileReportColumns[4], Column::RightAlignment) + OS << column("Filename", FileReportColumns[0]); + if (Options.ShowRegionSummary) + OS << column("Regions", FileReportColumns[1], Column::RightAlignment) + << column("Missed Regions", FileReportColumns[2], Column::RightAlignment) + << column("Cover", FileReportColumns[3], Column::RightAlignment); + OS << column("Functions", FileReportColumns[4], Column::RightAlignment) << column("Missed Functions", FileReportColumns[5], Column::RightAlignment) - << column("Executed", FileReportColumns[6], Column::RightAlignment) - << column("Instantiations", FileReportColumns[7], Column::RightAlignment) - << column("Missed Insts.", FileReportColumns[8], Column::RightAlignment) - << column("Executed", FileReportColumns[9], Column::RightAlignment) - << column("Lines", FileReportColumns[10], Column::RightAlignment) + << column("Executed", FileReportColumns[6], Column::RightAlignment); + if (Options.ShowInstantiationSummary) + OS << column("Instantiations", FileReportColumns[7], Column::RightAlignment) + << column("Missed Insts.", FileReportColumns[8], Column::RightAlignment) + << column("Executed", FileReportColumns[9], Column::RightAlignment); + OS << column("Lines", FileReportColumns[10], Column::RightAlignment) << column("Missed Lines", FileReportColumns[11], Column::RightAlignment) << column("Cover", FileReportColumns[12], Column::RightAlignment) << "\n"; renderDivider(FileReportColumns, OS); OS << "\n"; - for (const FileCoverageSummary &FCS : FileReports) - render(FCS, OS); + bool EmptyFiles = false; + for (const FileCoverageSummary &FCS : FileReports) { + if (FCS.FunctionCoverage.getNumFunctions()) + render(FCS, OS); + else + EmptyFiles = true; + } + + if (EmptyFiles && Filters.empty()) { + OS << "\n" + << "Files which contain no functions:\n"; + + for (const FileCoverageSummary &FCS : FileReports) + if (!FCS.FunctionCoverage.getNumFunctions()) + render(FCS, OS); + } renderDivider(FileReportColumns, OS); OS << "\n"; |
