Serialize TargetOptions into an AST file, and make sure that we keep
target options around so they can be accessed at any point (rather
than keeping them transient).


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@166072 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp
index 6d34425..5fc3f1b 100644
--- a/lib/Frontend/CompilerInvocation.cpp
+++ b/lib/Frontend/CompilerInvocation.cpp
@@ -35,11 +35,12 @@
 //===----------------------------------------------------------------------===//
 
 CompilerInvocationBase::CompilerInvocationBase()
-  : LangOpts(new LangOptions()) {}
+  : LangOpts(new LangOptions()), TargetOpts(new TargetOptions()) {}
 
 CompilerInvocationBase::CompilerInvocationBase(const CompilerInvocationBase &X)
   : RefCountedBase<CompilerInvocation>(),
-    LangOpts(new LangOptions(*X.getLangOpts())) {}
+    LangOpts(new LangOptions(*X.getLangOpts())), 
+    TargetOpts(new TargetOptions(X.getTargetOpts())) {}
 
 //===----------------------------------------------------------------------===//
 // Utility functions.
@@ -927,8 +928,8 @@
     Res.push_back("-target-linker-version", Opts.LinkerVersion);
   if (!Opts.CXXABI.empty())
     Res.push_back("-cxx-abi", Opts.CXXABI);
-  for (unsigned i = 0, e = Opts.Features.size(); i != e; ++i)
-    Res.push_back("-target-feature", Opts.Features[i]);
+  for (unsigned i = 0, e = Opts.FeaturesAsWritten.size(); i != e; ++i)
+    Res.push_back("-target-feature", Opts.FeaturesAsWritten[i]);
 }
 
 void CompilerInvocation::toArgs(std::vector<std::string> &Res) const {
@@ -2285,7 +2286,7 @@
   Opts.ABI = Args.getLastArgValue(OPT_target_abi);
   Opts.CXXABI = Args.getLastArgValue(OPT_cxx_abi);
   Opts.CPU = Args.getLastArgValue(OPT_target_cpu);
-  Opts.Features = Args.getAllArgValues(OPT_target_feature);
+  Opts.FeaturesAsWritten = Args.getAllArgValues(OPT_target_feature);
   Opts.LinkerVersion = Args.getLastArgValue(OPT_target_linker_version);
   Opts.Triple = llvm::Triple::normalize(Args.getLastArgValue(OPT_triple));
 
@@ -2431,7 +2432,8 @@
 #include "clang/Basic/LangOptions.def"
   
   // Extend the signature with the target triple
-  llvm::Triple T(TargetOpts.Triple);
+  // FIXME: Add target options.
+  llvm::Triple T(TargetOpts->Triple);
   Signature.add((unsigned)T.getArch(), 5);
   Signature.add((unsigned)T.getVendor(), 4);
   Signature.add((unsigned)T.getOS(), 5);