]> granicus.if.org Git - clang/commitdiff
Driver: Implement -### (hard to tell, since we don't actually
authorDaniel Dunbar <daniel@zuster.org>
Wed, 18 Mar 2009 06:49:39 +0000 (06:49 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 18 Mar 2009 06:49:39 +0000 (06:49 +0000)
construct any jobs).

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

include/clang/Driver/Compilation.h
lib/Driver/Compilation.cpp

index 91e6dc6f442a414efb3b0408827814c15c454f63..566bc5e0ca5c066e314c382ea22893dc46012e60 100644 (file)
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/SmallVector.h"
 
+namespace llvm {
+  class raw_ostream;
+}
+
 namespace clang {
 namespace driver {
   class ArgList;
@@ -80,6 +84,15 @@ public:
   /// Execute - Execute the compilation jobs and return an
   /// appropriate exit code.
   int Execute() const;
+
+private:
+  /// PrintJob - Print one job in -### format.
+  ///
+  /// OS - The stream to print on.
+  /// J - The job to print.
+  /// Terminator - A string to print at the end of the line.
+  void PrintJob(llvm::raw_ostream &OS, const Job *J, 
+                const char *Terminator) const;
 };
 
 } // end namespace driver
index 1dcb8d8f6e9520712309e0359002f058f2edf4d2..364f3281572bdd860ad17162e3ca2d9ac991e634 100644 (file)
@@ -13,6 +13,7 @@
 #include "clang/Driver/ArgList.h"
 #include "clang/Driver/ToolChain.h"
 
+#include "llvm/Support/raw_ostream.h"
 using namespace clang::driver;
 
 Compilation::Compilation(ToolChain &_DefaultToolChain,
@@ -48,6 +49,32 @@ const ArgList &Compilation::getArgsForToolChain(const ToolChain *TC) {
   return *Entry;
 }
 
+void Compilation::PrintJob(llvm::raw_ostream &OS, const Job *J, 
+                           const char *Terminator) const {
+  if (const Command *C = dyn_cast<Command>(J)) {
+    OS << " \"" << C->getExecutable() << '"';
+    for (ArgStringList::const_iterator it = C->getArguments().begin(),
+           ie = C->getArguments().end(); it != ie; ++it)
+      OS << " \"" << *it << '"';
+    OS << Terminator;
+  } else if (const PipedJob *PJ = dyn_cast<PipedJob>(J)) {
+    for (PipedJob::const_iterator 
+           it = PJ->begin(), ie = PJ->end(); it != ie; ++it)
+      PrintJob(OS, *it, (it + 1 != PJ->end()) ? " |\n" : "\n");
+  } else {
+    const JobList *Jobs = cast<JobList>(J);
+    for (JobList::const_iterator 
+           it = Jobs->begin(), ie = Jobs->end(); it != ie; ++it)
+      PrintJob(OS, *it, Terminator);
+  }
+}
+
 int Compilation::Execute() const {
+  // Just print if -### was present.
+  if (getArgs().hasArg(options::OPT__HASH_HASH_HASH)) {
+    PrintJob(llvm::errs(), &Jobs, "\n");
+    return 0;
+  }
+  
   return 0;
 }