diff options
Diffstat (limited to 'contrib/llvm-project/llvm/tools/llvm-cov/CodeCoverage.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/tools/llvm-cov/CodeCoverage.cpp | 68 |
1 files changed, 58 insertions, 10 deletions
diff --git a/contrib/llvm-project/llvm/tools/llvm-cov/CodeCoverage.cpp b/contrib/llvm-project/llvm/tools/llvm-cov/CodeCoverage.cpp index ef801287c1be..6932e9b5bd31 100644 --- a/contrib/llvm-project/llvm/tools/llvm-cov/CodeCoverage.cpp +++ b/contrib/llvm-project/llvm/tools/llvm-cov/CodeCoverage.cpp @@ -265,8 +265,7 @@ bool CodeCoverageTool::isEquivalentFile(StringRef FilePath1, StringRef FilePath2) { auto Status1 = getFileStatus(FilePath1); auto Status2 = getFileStatus(FilePath2); - return Status1.hasValue() && Status2.hasValue() && - sys::fs::equivalent(Status1.getValue(), Status2.getValue()); + return Status1 && Status2 && sys::fs::equivalent(*Status1, *Status2); } ErrorOr<const MemoryBuffer &> @@ -621,14 +620,14 @@ int CodeCoverageTool::run(Command Cmd, int argc, const char **argv) { cl::Positional, cl::desc("Covered executable or object file.")); cl::list<std::string> CovFilenames( - "object", cl::desc("Coverage executable or object file"), cl::ZeroOrMore); + "object", cl::desc("Coverage executable or object file")); cl::opt<bool> DebugDumpCollectedObjects( "dump-collected-objects", cl::Optional, cl::Hidden, cl::desc("Show the collected coverage object files")); - cl::list<std::string> InputSourceFiles( - cl::Positional, cl::desc("<Source files>"), cl::ZeroOrMore); + cl::list<std::string> InputSourceFiles(cl::Positional, + cl::desc("<Source files>")); cl::opt<bool> DebugDumpCollectedPaths( "dump-collected-paths", cl::Optional, cl::Hidden, @@ -665,32 +664,32 @@ int CodeCoverageTool::run(Command Cmd, int argc, const char **argv) { cl::list<std::string> NameFilters( "name", cl::Optional, cl::desc("Show code coverage only for functions with the given name"), - cl::ZeroOrMore, cl::cat(FilteringCategory)); + cl::cat(FilteringCategory)); cl::list<std::string> NameFilterFiles( "name-allowlist", cl::Optional, cl::desc("Show code coverage only for functions listed in the given " "file"), - cl::ZeroOrMore, cl::cat(FilteringCategory)); + cl::cat(FilteringCategory)); // Allow for accepting previous option name. cl::list<std::string> NameFilterFilesDeprecated( "name-whitelist", cl::Optional, cl::Hidden, cl::desc("Show code coverage only for functions listed in the given " "file. Deprecated, use -name-allowlist instead"), - cl::ZeroOrMore, cl::cat(FilteringCategory)); + cl::cat(FilteringCategory)); cl::list<std::string> NameRegexFilters( "name-regex", cl::Optional, cl::desc("Show code coverage only for functions that match the given " "regular expression"), - cl::ZeroOrMore, cl::cat(FilteringCategory)); + 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::cat(FilteringCategory)); cl::opt<double> RegionCoverageLtFilter( "region-coverage-lt", cl::Optional, @@ -883,6 +882,9 @@ int CodeCoverageTool::run(Command Cmd, int argc, const char **argv) { } CoverageArches.emplace_back(Arch); } + if (CoverageArches.size() == 1) + CoverageArches.insert(CoverageArches.end(), ObjectFilenames.size() - 1, + CoverageArches[0]); if (CoverageArches.size() != ObjectFilenames.size()) { error("Number of architectures doesn't match the number of objects"); return 1; @@ -973,6 +975,11 @@ int CodeCoverageTool::doShow(int argc, const char **argv, "project-title", cl::Optional, cl::desc("Set project title for the coverage report")); + cl::opt<std::string> CovWatermark( + "coverage-watermark", cl::Optional, + cl::desc("<high>,<low> value indicate thresholds for high and low" + "coverage watermark")); + auto Err = commandLineParser(argc, argv); if (Err) return Err; @@ -982,6 +989,47 @@ int CodeCoverageTool::doShow(int argc, const char **argv, return 1; } + ViewOpts.HighCovWatermark = 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 'high,low'", + "-coverage-watermark"); + return 1; + } + + char *EndPointer = nullptr; + ViewOpts.HighCovWatermark = + strtod(WaterMarkPair.first.begin(), &EndPointer); + if (EndPointer != WaterMarkPair.first.end()) { + error("invalid number '" + WaterMarkPair.first + + "', invalid value for 'high'", + "-coverage-watermark"); + return 1; + } + + ViewOpts.LowCovWatermark = + strtod(WaterMarkPair.second.begin(), &EndPointer); + if (EndPointer != WaterMarkPair.second.end()) { + error("invalid number '" + WaterMarkPair.second + + "', invalid value for 'low'", + "-coverage-watermark"); + return 1; + } + + if (ViewOpts.HighCovWatermark > 100 || ViewOpts.LowCovWatermark < 0 || + ViewOpts.HighCovWatermark <= ViewOpts.LowCovWatermark) { + error( + "invalid number range '" + CovWatermark + + "', must be both high and low should be between 0-100, and high " + "> low", + "-coverage-watermark"); + return 1; + } + } + ViewOpts.ShowLineNumbers = true; ViewOpts.ShowLineStats = ShowLineExecutionCounts.getNumOccurrences() != 0 || !ShowRegions || ShowBestLineRegionsCounts; |