From de2703ddfb7730fcfaf718f89b1561a539240a72 Mon Sep 17 00:00:00 2001 From: Justin Bogner Date: Wed, 23 Apr 2014 21:44:55 +0000 Subject: llvm-cov: Add support for gcov's --long-file-names option GCOV provides an option to prepend output file names with the source file name, to disambiguate between covered data that's included from multiple sources. Add a flag to llvm-cov that does the same. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207035 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/GCOV.h | 8 +++++--- lib/IR/GCOV.cpp | 14 +++++++++----- test/tools/llvm-cov/Inputs/test_long_file_names.output | 8 ++++++++ test/tools/llvm-cov/Inputs/test_long_paths.output | 8 ++++++++ test/tools/llvm-cov/llvm-cov.test | 10 ++++++++++ tools/llvm-cov/llvm-cov.cpp | 8 ++++++-- 6 files changed, 46 insertions(+), 10 deletions(-) create mode 100644 test/tools/llvm-cov/Inputs/test_long_file_names.output create mode 100644 test/tools/llvm-cov/Inputs/test_long_paths.output diff --git a/include/llvm/Support/GCOV.h b/include/llvm/Support/GCOV.h index ae7e4a969a..923affcd0b 100644 --- a/include/llvm/Support/GCOV.h +++ b/include/llvm/Support/GCOV.h @@ -37,9 +37,9 @@ namespace GCOV { /// GCOVOptions - A struct for passing gcov options between functions. struct GCOVOptions { - GCOVOptions(bool A, bool B, bool C, bool F, bool P, bool U) + GCOVOptions(bool A, bool B, bool C, bool F, bool P, bool U, bool L) : AllBlocks(A), BranchInfo(B), BranchCount(C), FuncCoverage(F), - PreservePaths(P), UncondBranch(U) {} + PreservePaths(P), UncondBranch(U), LongFileNames(L) {} bool AllBlocks; bool BranchInfo; @@ -47,6 +47,7 @@ struct GCOVOptions { bool FuncCoverage; bool PreservePaths; bool UncondBranch; + bool LongFileNames; }; /// GCOVBuffer - A wrapper around MemoryBuffer to provide GCOV specific @@ -385,7 +386,8 @@ public: } void setRunCount(uint32_t Runs) { RunCount = Runs; } void setProgramCount(uint32_t Programs) { ProgramCount = Programs; } - void print(StringRef GCNOFile, StringRef GCDAFile); + void print(StringRef MainFilename, StringRef GCNOFile, StringRef GCDAFile); + private: void printFunctionSummary(raw_fd_ostream &OS, const FunctionVector &Funcs) const; diff --git a/lib/IR/GCOV.cpp b/lib/IR/GCOV.cpp index 0e344ddfea..8f060d2ac9 100644 --- a/lib/IR/GCOV.cpp +++ b/lib/IR/GCOV.cpp @@ -424,7 +424,7 @@ static raw_ostream &operator<<(raw_ostream &OS, const formatBranchInfo &FBI) { /// translates "/" to "#", ".." to "^", and drops ".", to match gcov. static std::string mangleCoveragePath(StringRef Filename, bool PreservePaths) { if (!PreservePaths) - return (sys::path::filename(Filename) + ".gcov").str(); + return sys::path::filename(Filename).str(); // This behaviour is defined by gcov in terms of text replacements, so it's // not likely to do anything useful on filesystems with different textual @@ -452,12 +452,12 @@ static std::string mangleCoveragePath(StringRef Filename, bool PreservePaths) { if (S < I) Result.append(S, I); - Result.append(".gcov"); return Result.str(); } /// print - Print source files with collected line count information. -void FileInfo::print(StringRef GCNOFile, StringRef GCDAFile) { +void FileInfo::print(StringRef MainFilename, StringRef GCNOFile, + StringRef GCDAFile) { for (StringMap::const_iterator I = LineInfo.begin(), E = LineInfo.end(); I != E; ++I) { StringRef Filename = I->first(); @@ -468,8 +468,12 @@ void FileInfo::print(StringRef GCNOFile, StringRef GCDAFile) { } StringRef AllLines = Buff->getBuffer(); - std::string CoveragePath = mangleCoveragePath(Filename, - Options.PreservePaths); + std::string CoveragePath; + if (Options.LongFileNames && !Filename.equals(MainFilename)) + CoveragePath = + mangleCoveragePath(MainFilename, Options.PreservePaths) + "##"; + CoveragePath += + mangleCoveragePath(Filename, Options.PreservePaths) + ".gcov"; std::string ErrorInfo; raw_fd_ostream OS(CoveragePath.c_str(), ErrorInfo, sys::fs::F_Text); if (!ErrorInfo.empty()) diff --git a/test/tools/llvm-cov/Inputs/test_long_file_names.output b/test/tools/llvm-cov/Inputs/test_long_file_names.output new file mode 100644 index 0000000000..e09f4cb985 --- /dev/null +++ b/test/tools/llvm-cov/Inputs/test_long_file_names.output @@ -0,0 +1,8 @@ +File 'srcdir/./nested_dir/../test.h' +Lines executed:100.00% of 1 +srcdir/./nested_dir/../test.h:creating 'test_paths.cpp##test.h.gcov' + +File 'srcdir/./nested_dir/../test.cpp' +Lines executed:84.21% of 38 +srcdir/./nested_dir/../test.cpp:creating 'test_paths.cpp##test.cpp.gcov' + diff --git a/test/tools/llvm-cov/Inputs/test_long_paths.output b/test/tools/llvm-cov/Inputs/test_long_paths.output new file mode 100644 index 0000000000..376ee5b78d --- /dev/null +++ b/test/tools/llvm-cov/Inputs/test_long_paths.output @@ -0,0 +1,8 @@ +File 'srcdir/./nested_dir/../test.h' +Lines executed:100.00% of 1 +srcdir/./nested_dir/../test.h:creating 'srcdir#^#test_paths.cpp##srcdir#nested_dir#^#test.h.gcov' + +File 'srcdir/./nested_dir/../test.cpp' +Lines executed:84.21% of 38 +srcdir/./nested_dir/../test.cpp:creating 'srcdir#^#test_paths.cpp##srcdir#nested_dir#^#test.cpp.gcov' + diff --git a/test/tools/llvm-cov/llvm-cov.test b/test/tools/llvm-cov/llvm-cov.test index 19d3e5db18..8457aef292 100644 --- a/test/tools/llvm-cov/llvm-cov.test +++ b/test/tools/llvm-cov/llvm-cov.test @@ -43,6 +43,16 @@ RUN: llvm-cov test_paths.cpp | diff -u test_no_preserve_paths.output - RUN: diff -aub test_paths.cpp.gcov test.cpp.gcov RUN: diff -aub test_paths.h.gcov test.h.gcov +# Long file names. +RUN: llvm-cov -l test_paths.cpp | diff -u test_long_file_names.output - +RUN: diff -aub test_paths.cpp.gcov test_paths.cpp##test.cpp.gcov +RUN: diff -aub test_paths.h.gcov test_paths.cpp##test.h.gcov + +# Long file names and preserve paths. +RUN: llvm-cov -lp -gcno test_paths.gcno -gcda test_paths.gcda srcdir/../test_paths.cpp | diff -u test_long_paths.output - +RUN: diff -aub test_paths.cpp.gcov srcdir#^#test_paths.cpp##srcdir#nested_dir#^#test.cpp.gcov +RUN: diff -aub test_paths.h.gcov srcdir#^#test_paths.cpp##srcdir#nested_dir#^#test.h.gcov + # Function summaries. This changes stdout, but not the gcov files. RUN: llvm-cov test.c -f | diff -u test_-f.output - RUN: diff -aub test_no_options.cpp.gcov test.cpp.gcov diff --git a/tools/llvm-cov/llvm-cov.cpp b/tools/llvm-cov/llvm-cov.cpp index 8e2cf95153..02f4b72216 100644 --- a/tools/llvm-cov/llvm-cov.cpp +++ b/tools/llvm-cov/llvm-cov.cpp @@ -39,6 +39,10 @@ static cl::opt BranchCount("c", cl::Grouping, cl::init(false), "of percentages (requires -b)")); static cl::alias BranchCountA("branch-counts", cl::aliasopt(BranchCount)); +static cl::opt LongNames("l", cl::Grouping, cl::init(false), + cl::desc("Prefix filenames with the main file")); +static cl::alias LongNamesA("long-file-names", cl::aliasopt(LongNames)); + static cl::opt FuncSummary("f", cl::Grouping, cl::init(false), cl::desc("Show coverage for each function")); static cl::alias FuncSummaryA("function-summaries", cl::aliasopt(FuncSummary)); @@ -126,9 +130,9 @@ int main(int argc, char **argv) { GF.dump(); GCOVOptions Options(AllBlocks, BranchProb, BranchCount, FuncSummary, - PreservePaths, UncondBranch); + PreservePaths, UncondBranch, LongNames); FileInfo FI(Options); GF.collectLineCounts(FI); - FI.print(InputGCNO, InputGCDA); + FI.print(SourceFile, InputGCNO, InputGCDA); return 0; } -- cgit v1.2.3