]> granicus.if.org Git - clang/commitdiff
ClangTool: strip -o from the command line
authorPavel Labath <labath@google.com>
Thu, 6 Jun 2013 11:52:19 +0000 (11:52 +0000)
committerPavel Labath <labath@google.com>
Thu, 6 Jun 2013 11:52:19 +0000 (11:52 +0000)
Summary:
This patch creates a new ArgumentsAdjuster, which removes all -o parameters from
the command line. This adjuster is inserted by default into the ClangTool pipeline.

Reviewers: klimek

CC: cfe-commits, revane
Differential Revision: http://llvm-reviews.chandlerc.com/D925

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@183398 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Tooling/ArgumentsAdjusters.h
include/clang/Tooling/Tooling.h
lib/Tooling/ArgumentsAdjusters.cpp
lib/Tooling/Tooling.cpp
test/Tooling/clang-check-strip-o.cpp [new file with mode: 0644]

index 492ddd2b0078bff9b8404de4f913606e1398d504..71acef8650fed5cc2b70c9e404379dcc48ea49c8 100644 (file)
@@ -52,6 +52,12 @@ class ClangSyntaxOnlyAdjuster : public ArgumentsAdjuster {
   virtual CommandLineArguments Adjust(const CommandLineArguments &Args);
 };
 
+/// \brief An argument adjuster which removes output-related command line
+/// arguments.
+class ClangStripOutputAdjuster : public ArgumentsAdjuster {
+  virtual CommandLineArguments Adjust(const CommandLineArguments &Args);
+};
+
 } // end namespace tooling
 } // end namespace clang
 
index dc8163e553fa044bae0177a09a90b9b67088ddc5..97bc2ab14645281ec1f7d87b9e985fe81050439a 100644 (file)
@@ -233,7 +233,7 @@ class ClangTool {
   // Contains a list of pairs (<file name>, <file content>).
   std::vector< std::pair<StringRef, StringRef> > MappedFileContents;
 
-  SmallVector<ArgumentsAdjuster *, 1> ArgsAdjusters;
+  SmallVector<ArgumentsAdjuster *, 2> ArgsAdjusters;
 };
 
 template <typename T>
index c44b20dd5a82a51c263cdd14eaf8cd1b3e52f2a9..a69971e006eba4053d68a8ffcc4609f950a46cab 100644 (file)
@@ -37,6 +37,23 @@ ClangSyntaxOnlyAdjuster::Adjust(const CommandLineArguments &Args) {
   return AdjustedArgs;
 }
 
+CommandLineArguments
+ClangStripOutputAdjuster::Adjust(const CommandLineArguments &Args) {
+  CommandLineArguments AdjustedArgs;
+  for (size_t i = 0, e = Args.size(); i < e; ++i) {
+    StringRef Arg = Args[i];
+    if(!Arg.startswith("-o"))
+      AdjustedArgs.push_back(Args[i]);
+
+    if(Arg == "-o") {
+      // Output is specified as -o foo. Skip the next argument also.
+      ++i;
+    }
+    // Else, the output is specified as -ofoo. Just do nothing.
+  }
+  return AdjustedArgs;
+}
+
 } // end namespace tooling
 } // end namespace clang
 
index cdb9bc71ee2bba0819520ce855ca4f5d62554616..a121cd0fd64363997260f493acd5476ec9c78250 100644 (file)
@@ -236,8 +236,9 @@ void ToolInvocation::addFileMappingsTo(SourceManager &Sources) {
 
 ClangTool::ClangTool(const CompilationDatabase &Compilations,
                      ArrayRef<std::string> SourcePaths)
-    : Files((FileSystemOptions())),
-      ArgsAdjusters(1, new ClangSyntaxOnlyAdjuster()) {
+    : Files((FileSystemOptions())) {
+  ArgsAdjusters.push_back(new ClangStripOutputAdjuster());
+  ArgsAdjusters.push_back(new ClangSyntaxOnlyAdjuster());
   for (unsigned I = 0, E = SourcePaths.size(); I != E; ++I) {
     SmallString<1024> File(getAbsolutePath(SourcePaths[I]));
 
diff --git a/test/Tooling/clang-check-strip-o.cpp b/test/Tooling/clang-check-strip-o.cpp
new file mode 100644 (file)
index 0000000..38f09a0
--- /dev/null
@@ -0,0 +1,11 @@
+// RUN: rm -rf %t
+// RUN: mkdir %t
+// RUN: echo '[{"directory":".","command":"clang++ -c %t/test.cpp -o foo -ofoo","file":"%t/test.cpp"}]' | sed -e 's/\\/\//g' > %t/compile_commands.json
+// RUN: cp "%s" "%t/test.cpp"
+// RUN: clang-check -p "%t" "%t/test.cpp" -extra-arg=-v 2>&1|FileCheck %s
+// FIXME: Make the above easier.
+
+// CHECK: Invocation
+// CHECK-NOT: {{ -v}}
+// CHECK: C++ requires
+invalid;