[llvm] r201555 - llvm-cov: Support gcov's extermely lenient treatment of -o

Justin Bogner mail at justinbogner.com
Tue Feb 18 01:19:49 PST 2014


Author: bogner
Date: Tue Feb 18 03:19:48 2014
New Revision: 201555

URL: http://llvm.org/viewvc/llvm-project?rev=201555&view=rev
Log:
llvm-cov: Support gcov's extermely lenient treatment of -o

In gcov, the -o flag can accept either a directory or a file name.
When given a directory, the gcda and gcno files are expected to be in
that directory. When given a file, the gcda and gcno files are
expected to be named based on the stem of that file. Non-existent
paths are treated as files.

This implements compatible behaviour.

Modified:
    llvm/trunk/test/tools/llvm-cov/llvm-cov.test
    llvm/trunk/tools/llvm-cov/llvm-cov.cpp

Modified: llvm/trunk/test/tools/llvm-cov/llvm-cov.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-cov/llvm-cov.test?rev=201555&r1=201554&r2=201555&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-cov/llvm-cov.test (original)
+++ llvm/trunk/test/tools/llvm-cov/llvm-cov.test Tue Feb 18 03:19:48 2014
@@ -21,6 +21,16 @@ RUN: llvm-cov -o objdir test.c | diff -u
 RUN: diff -aub test_objdir.cpp.gcov test.cpp.gcov
 RUN: diff -aub test_objdir.h.gcov test.h.gcov
 
+# Specifying an object file
+RUN: llvm-cov -o objdir/test.o test.c | diff -u test_no_options.output -
+RUN: diff -aub test_objdir.cpp.gcov test.cpp.gcov
+RUN: diff -aub test_objdir.h.gcov test.h.gcov
+
+# Specifying an object file that could be ambiguous with a directory
+RUN: llvm-cov -o objdir/test test.c | diff -u test_no_options.output -
+RUN: diff -aub test_objdir.cpp.gcov test.cpp.gcov
+RUN: diff -aub test_objdir.h.gcov test.h.gcov
+
 # Preserve paths. This mangles the output filenames.
 RUN: mkdir -p %t/srcdir/nested_dir
 RUN: cp test.cpp test.h %t/srcdir

Modified: llvm/trunk/tools/llvm-cov/llvm-cov.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-cov/llvm-cov.cpp?rev=201555&r1=201554&r2=201555&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-cov/llvm-cov.cpp (original)
+++ llvm/trunk/tools/llvm-cov/llvm-cov.cpp Tue Feb 18 03:19:48 2014
@@ -14,6 +14,7 @@
 #include "llvm/ADT/OwningPtr.h"
 #include "llvm/ADT/SmallString.h"
 #include "llvm/Support/CommandLine.h"
+#include "llvm/Support/FileSystem.h"
 #include "llvm/Support/GCOV.h"
 #include "llvm/Support/ManagedStatic.h"
 #include "llvm/Support/MemoryObject.h"
@@ -43,9 +44,11 @@ static cl::opt<bool> FuncSummary("f", cl
                                  cl::desc("Show coverage for each function"));
 static cl::alias FuncSummaryA("function-summaries", cl::aliasopt(FuncSummary));
 
-static cl::opt<std::string> ObjectDir("o", cl::value_desc("DIR"), cl::init(""),
-                                      cl::desc("Search for objects in DIR"));
+static cl::opt<std::string>
+ObjectDir("o", cl::value_desc("DIR|FILE"), cl::init(""),
+          cl::desc("Find objects in DIR or based on FILE's path"));
 static cl::alias ObjectDirA("object-directory", cl::aliasopt(ObjectDir));
+static cl::alias ObjectDirB("object-file", cl::aliasopt(ObjectDir));
 
 static cl::opt<bool> PreservePaths("p", cl::init(false),
                                    cl::desc("Preserve path components"));
@@ -75,9 +78,16 @@ int main(int argc, char **argv) {
   cl::ParseCommandLineOptions(argc, argv, "LLVM code coverage tool\n");
 
   SmallString<128> CoverageFileStem(ObjectDir);
-  if (CoverageFileStem.empty())
+  if (CoverageFileStem.empty()) {
+    // If no directory was specified with -o, look next to the source file.
     CoverageFileStem = sys::path::parent_path(SourceFile);
-  sys::path::append(CoverageFileStem, sys::path::stem(SourceFile));
+    sys::path::append(CoverageFileStem, sys::path::stem(SourceFile));
+  } else if (sys::fs::is_directory(ObjectDir))
+    // A directory name was given. Use it and the source file name.
+    sys::path::append(CoverageFileStem, sys::path::stem(SourceFile));
+  else
+    // 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();





More information about the llvm-commits mailing list