diff --git a/llvm/tools/llvm-cov/CodeCoverage.cpp b/llvm/tools/llvm-cov/CodeCoverage.cpp --- a/llvm/tools/llvm-cov/CodeCoverage.cpp +++ b/llvm/tools/llvm-cov/CodeCoverage.cpp @@ -973,6 +973,11 @@ "project-title", cl::Optional, cl::desc("Set project title for the coverage report")); + cl::opt CovWatermark( + "coverage-watermark", cl::Optional, + cl::desc(", value indicate thresholds for medium and low" + "coverage watermark")); + auto Err = commandLineParser(argc, argv); if (Err) return Err; @@ -982,6 +987,37 @@ return 1; } + ViewOpts.MediumCovWatermark = 100.0; + ViewOpts.LowCovWatermark = 80.0; + if (!CovWatermark.empty()) { + auto WaterMarkPair = StringRef(CovWatermark).split(','); + if (WaterMarkPair.first.empty() || WaterMarkPair.second.empty()) { + error("invalid argument '" + CovWatermark + + "', must be in format 'medium,low'", + "-coverage-watermark"); + return 1; + } + + char *EndPointer = nullptr; + ViewOpts.MediumCovWatermark = + strtod(WaterMarkPair.first.begin(), &EndPointer); + if (EndPointer != WaterMarkPair.first.end()) { + error("invalid argument '" + WaterMarkPair.first + + "', invalid value for 'medium'", + "-coverage-watermark"); + return 1; + } + + ViewOpts.LowCovWatermark = + strtod(WaterMarkPair.second.begin(), &EndPointer); + if (EndPointer != WaterMarkPair.second.end()) { + error("invalid argument '" + WaterMarkPair.second + + "', invalid value for 'second'", + "-coverage-watermark"); + return 1; + } + } + ViewOpts.ShowLineNumbers = true; ViewOpts.ShowLineStats = ShowLineExecutionCounts.getNumOccurrences() != 0 || !ShowRegions || ShowBestLineRegionsCounts; diff --git a/llvm/tools/llvm-cov/CoverageViewOptions.h b/llvm/tools/llvm-cov/CoverageViewOptions.h --- a/llvm/tools/llvm-cov/CoverageViewOptions.h +++ b/llvm/tools/llvm-cov/CoverageViewOptions.h @@ -50,6 +50,8 @@ std::string CreatedTimeStr; unsigned NumThreads; std::string CompilationDirectory; + float MediumCovWatermark; + float LowCovWatermark; /// Change the output's stream color if the colors are enabled. ColoredRawOstream colored_ostream(raw_ostream &OS, diff --git a/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp b/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp --- a/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp +++ b/llvm/tools/llvm-cov/SourceCoverageViewHTML.cpp @@ -338,24 +338,24 @@ SmallVector Columns; // Format a coverage triple and add the result to the list of columns. - auto AddCoverageTripleToColumn = [&Columns](unsigned Hit, unsigned Total, - float Pctg) { - std::string S; - { - raw_string_ostream RSO{S}; - if (Total) - RSO << format("%*.2f", 7, Pctg) << "% "; - else - RSO << "- "; - RSO << '(' << Hit << '/' << Total << ')'; - } - const char *CellClass = "column-entry-yellow"; - if (Hit == Total) - CellClass = "column-entry-green"; - else if (Pctg < 80.0) - CellClass = "column-entry-red"; - Columns.emplace_back(tag("td", tag("pre", S), CellClass)); - }; + auto AddCoverageTripleToColumn = + [&Columns, this](unsigned Hit, unsigned Total, float Pctg) { + std::string S; + { + raw_string_ostream RSO{S}; + if (Total) + RSO << format("%*.2f", 7, Pctg) << "% "; + else + RSO << "- "; + RSO << '(' << Hit << '/' << Total << ')'; + } + const char *CellClass = "column-entry-yellow"; + if (Pctg >= Opts.MediumCovWatermark) + CellClass = "column-entry-green"; + else if (Pctg < Opts.LowCovWatermark) + CellClass = "column-entry-red"; + Columns.emplace_back(tag("td", tag("pre", S), CellClass)); + }; // Simplify the display file path, and wrap it in a link if requested. std::string Filename;