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,34 @@ 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,7 +338,7 @@ SmallVector Columns; // Format a coverage triple and add the result to the list of columns. - auto AddCoverageTripleToColumn = [&Columns](unsigned Hit, unsigned Total, + auto AddCoverageTripleToColumn = [&Columns, this](unsigned Hit, unsigned Total, float Pctg) { std::string S; { @@ -350,9 +350,9 @@ RSO << '(' << Hit << '/' << Total << ')'; } const char *CellClass = "column-entry-yellow"; - if (Hit == Total) + if (Pctg >= Opts.MediumCovWatermark) CellClass = "column-entry-green"; - else if (Pctg < 80.0) + else if (Pctg < Opts.LowCovWatermark) CellClass = "column-entry-red"; Columns.emplace_back(tag("td", tag("pre", S), CellClass)); };