From 1cfa342dc1fd6fd498652d67311c3632893512b3 Mon Sep 17 00:00:00 2001 From: Justin Bogner Date: Fri, 27 Jun 2014 20:41:25 +0000 Subject: llvm-cov: Support specifying multiple source files Make llvm-cov compatible with gcov for cases where multiple files are specified on the command line. That is, loop over each one and report coverage, and report errors on stderr only rather than via return code. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211959 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/llvm-cov/llvm-cov.cpp | 57 ++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 26 deletions(-) (limited to 'tools/llvm-cov') diff --git a/tools/llvm-cov/llvm-cov.cpp b/tools/llvm-cov/llvm-cov.cpp index 0a64d76c37..04de443105 100644 --- a/tools/llvm-cov/llvm-cov.cpp +++ b/tools/llvm-cov/llvm-cov.cpp @@ -24,8 +24,8 @@ #include using namespace llvm; -static cl::opt SourceFile(cl::Positional, cl::Required, - cl::desc("SOURCEFILE")); +static cl::list SourceFiles(cl::Positional, cl::OneOrMore, + cl::desc("SOURCEFILE")); static cl::opt AllBlocks("a", cl::Grouping, cl::init(false), cl::desc("Display all basic blocks")); @@ -76,15 +76,7 @@ static cl::opt InputGCNO("gcno", cl::cat(DebugCat), cl::init(""), static cl::opt InputGCDA("gcda", cl::cat(DebugCat), cl::init(""), cl::desc("Override inferred gcda file")); -//===----------------------------------------------------------------------===// -int main(int argc, char **argv) { - // Print a stack trace if we signal out. - sys::PrintStackTraceOnErrorSignal(); - PrettyStackTraceProgram X(argc, argv); - llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. - - cl::ParseCommandLineOptions(argc, argv, "LLVM code coverage tool\n"); - +void reportCoverage(StringRef SourceFile) { SmallString<128> CoverageFileStem(ObjectDir); if (CoverageFileStem.empty()) { // If no directory was specified with -o, look next to the source file. @@ -97,37 +89,38 @@ int main(int argc, char **argv) { // A file was given. Ignore the source file and look next to this file. sys::path::replace_extension(CoverageFileStem, ""); - if (InputGCNO.empty()) - InputGCNO = (CoverageFileStem.str() + ".gcno").str(); - if (InputGCDA.empty()) - InputGCDA = (CoverageFileStem.str() + ".gcda").str(); - + std::string GCNO = InputGCNO.empty() + ? std::string(CoverageFileStem.str()) + ".gcno" + : InputGCNO; + std::string GCDA = InputGCDA.empty() + ? std::string(CoverageFileStem.str()) + ".gcda" + : InputGCDA; GCOVFile GF; std::unique_ptr GCNO_Buff; - if (std::error_code ec = MemoryBuffer::getFileOrSTDIN(InputGCNO, GCNO_Buff)) { - errs() << InputGCNO << ": " << ec.message() << "\n"; - return 1; + if (std::error_code ec = MemoryBuffer::getFileOrSTDIN(GCNO, GCNO_Buff)) { + errs() << GCNO << ": " << ec.message() << "\n"; + return; } GCOVBuffer GCNO_GB(GCNO_Buff.get()); if (!GF.readGCNO(GCNO_GB)) { errs() << "Invalid .gcno File!\n"; - return 1; + return; } std::unique_ptr GCDA_Buff; - if (std::error_code ec = MemoryBuffer::getFileOrSTDIN(InputGCDA, GCDA_Buff)) { + if (std::error_code ec = MemoryBuffer::getFileOrSTDIN(GCDA, GCDA_Buff)) { if (ec != errc::no_such_file_or_directory) { - errs() << InputGCDA << ": " << ec.message() << "\n"; - return 1; + errs() << GCDA << ": " << ec.message() << "\n"; + return; } // Clear the filename to make it clear we didn't read anything. - InputGCDA = "-"; + GCDA = "-"; } else { GCOVBuffer GCDA_GB(GCDA_Buff.get()); if (!GF.readGCDA(GCDA_GB)) { errs() << "Invalid .gcda File!\n"; - return 1; + return; } } @@ -138,6 +131,18 @@ int main(int argc, char **argv) { PreservePaths, UncondBranch, LongNames, NoOutput); FileInfo FI(Options); GF.collectLineCounts(FI); - FI.print(SourceFile, InputGCNO, InputGCDA); + FI.print(SourceFile, GCNO, GCDA); +} + +int main(int argc, char **argv) { + // Print a stack trace if we signal out. + sys::PrintStackTraceOnErrorSignal(); + PrettyStackTraceProgram X(argc, argv); + llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. + + cl::ParseCommandLineOptions(argc, argv, "LLVM code coverage tool\n"); + + for (const auto &SourceFile : SourceFiles) + reportCoverage(SourceFile); return 0; } -- cgit v1.2.3