Add DependencyOutputOptions to wrap -M... options, and propogate to
CompilerInvocation and clang-cc.

llvm-svn: 86880
diff --git a/clang/tools/clang-cc/Options.cpp b/clang/tools/clang-cc/Options.cpp
index 211f141..2428d3a 100644
--- a/clang/tools/clang-cc/Options.cpp
+++ b/clang/tools/clang-cc/Options.cpp
@@ -16,6 +16,7 @@
 #include "clang/Basic/TargetInfo.h"
 #include "clang/Frontend/AnalysisConsumer.h"
 #include "clang/Frontend/CompileOptions.h"
+#include "clang/Frontend/DependencyOutputOptions.h"
 #include "clang/Frontend/DiagnosticOptions.h"
 #include "clang/Frontend/HeaderSearchOptions.h"
 #include "clang/Frontend/PCHReader.h"
@@ -190,6 +191,31 @@
 }
 
 //===----------------------------------------------------------------------===//
+// Dependency Output Options
+//===----------------------------------------------------------------------===//
+
+namespace dependencyoutputoptions {
+
+static llvm::cl::opt<std::string>
+DependencyFile("dependency-file",
+               llvm::cl::desc("Filename (or -) to write dependency output to"));
+
+static llvm::cl::opt<bool>
+DependenciesIncludeSystemHeaders("sys-header-deps",
+                 llvm::cl::desc("Include system headers in dependency output"));
+
+static llvm::cl::list<std::string>
+DependencyTargets("MT",
+         llvm::cl::desc("Specify target for dependency"));
+
+static llvm::cl::opt<bool>
+PhonyDependencyTarget("MP",
+            llvm::cl::desc("Create phony target for each dependency "
+                           "(other than main file)"));
+
+}
+
+//===----------------------------------------------------------------------===//
 // Diagnostic Options
 //===----------------------------------------------------------------------===//
 
@@ -616,6 +642,16 @@
 #endif
 }
 
+void clang::InitializeDependencyOutputOptions(DependencyOutputOptions &Opts) {
+  using namespace dependencyoutputoptions;
+
+  Opts.OutputFile = DependencyFile;
+  Opts.Targets.insert(Opts.Targets.begin(), DependencyTargets.begin(),
+                      DependencyTargets.end());
+  Opts.IncludeSystemHeaders = DependenciesIncludeSystemHeaders;
+  Opts.UsePhonyTargets = PhonyDependencyTarget;
+}
+
 void clang::InitializeDiagnosticOptions(DiagnosticOptions &Opts) {
   using namespace diagnosticoptions;
 
diff --git a/clang/tools/clang-cc/Options.h b/clang/tools/clang-cc/Options.h
index 88acb42..6275e77 100644
--- a/clang/tools/clang-cc/Options.h
+++ b/clang/tools/clang-cc/Options.h
@@ -16,6 +16,7 @@
 
 class AnalyzerOptions;
 class CompileOptions;
+class DependencyOutputOptions;
 class DiagnosticOptions;
 class HeaderSearchOptions;
 class LangOptions;
@@ -40,6 +41,8 @@
 
 void InitializeAnalyzerOptions(AnalyzerOptions &Opts);
 
+void InitializeDependencyOutputOptions(DependencyOutputOptions &Opts);
+
 void InitializeDiagnosticOptions(DiagnosticOptions &Opts);
 
 void InitializeCompileOptions(CompileOptions &Opts,
diff --git a/clang/tools/clang-cc/clang-cc.cpp b/clang/tools/clang-cc/clang-cc.cpp
index e55deb5..85a1192 100644
--- a/clang/tools/clang-cc/clang-cc.cpp
+++ b/clang/tools/clang-cc/clang-cc.cpp
@@ -32,6 +32,7 @@
 #include "clang/Frontend/ChainedDiagnosticClient.h"
 #include "clang/Frontend/CommandLineSourceLoc.h"
 #include "clang/Frontend/CompilerInvocation.h"
+#include "clang/Frontend/DependencyOutputOptions.h"
 #include "clang/Frontend/FixItRewriter.h"
 #include "clang/Frontend/FrontendDiagnostic.h"
 #include "clang/Frontend/PCHReader.h"
@@ -455,27 +456,6 @@
 static llvm::cl::opt<bool> OptNoWarnings("w");
 
 //===----------------------------------------------------------------------===//
-// Dependency file options
-//===----------------------------------------------------------------------===//
-
-static llvm::cl::opt<std::string>
-DependencyFile("dependency-file",
-               llvm::cl::desc("Filename (or -) to write dependency output to"));
-
-static llvm::cl::opt<bool>
-DependenciesIncludeSystemHeaders("sys-header-deps",
-                 llvm::cl::desc("Include system headers in dependency output"));
-
-static llvm::cl::list<std::string>
-DependencyTargets("MT",
-         llvm::cl::desc("Specify target for dependency"));
-
-static llvm::cl::opt<bool>
-PhonyDependencyTarget("MP",
-            llvm::cl::desc("Create phony target for each dependency "
-                           "(other than main file)"));
-
-//===----------------------------------------------------------------------===//
 // -dump-build-information Stuff
 //===----------------------------------------------------------------------===//
 
@@ -646,8 +626,7 @@
 ///
 static void ProcessInputFile(const CompilerInvocation &CompOpts,
                              Preprocessor &PP, const std::string &InFile,
-                             ProgActions PA,
-                             llvm::LLVMContext& Context) {
+                             ProgActions PA, llvm::LLVMContext& Context) {
   llvm::OwningPtr<llvm::raw_ostream> OS;
   llvm::OwningPtr<ASTConsumer> Consumer;
   bool ClearSourceMgr = false;
@@ -1085,6 +1064,9 @@
     InitializeLangOptions(Opts.getLangOpts(), LK, Target,
                           Opts.getCompileOpts());
 
+  // Initialize the dependency output options (-M...).
+  InitializeDependencyOutputOptions(Opts.getDependencyOutputOpts());
+
   // Initialize the header search options.
   InitializeHeaderSearchOptions(Opts.getHeaderSearchOpts(),
                                 GetBuiltinIncludePath(Argv0),
@@ -1229,23 +1211,8 @@
                             HeaderInfo));
 
     // Handle generating dependencies, if requested.
-    if (!DependencyFile.empty()) {
-      if (DependencyTargets.empty()) {
-        Diags.Report(diag::err_fe_dependency_file_requires_MT);
-        continue;
-      }
-      std::string ErrStr;
-      llvm::raw_ostream *DependencyOS =
-          new llvm::raw_fd_ostream(DependencyFile.c_str(), ErrStr);
-      if (!ErrStr.empty()) {
-        Diags.Report(diag::err_fe_error_opening) << DependencyFile << ErrStr;
-        continue;
-      }
-
-      AttachDependencyFileGen(PP.get(), DependencyOS, DependencyTargets,
-                              DependenciesIncludeSystemHeaders,
-                              PhonyDependencyTarget);
-    }
+    if (!CompOpts.getDependencyOutputOpts().OutputFile.empty())
+      AttachDependencyFileGen(PP.get(), CompOpts.getDependencyOutputOpts());
 
     if (CompOpts.getPreprocessorOpts().getImplicitPCHInclude().empty()) {
       if (InitializeSourceManager(*PP.get(), InFile))