Driver: Ditch Driver::DefaultToolChain, this can vary between compilations.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@67162 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp
index f60271c..84f3428 100644
--- a/lib/Driver/Driver.cpp
+++ b/lib/Driver/Driver.cpp
@@ -162,12 +162,9 @@
   ArgList *Args = ParseArgStrings(Start, End);
 
   Host = GetHostInfo(HostTriple);
-  // FIXME: This shouldn't live inside Driver, the default tool chain
-  // is part of the compilation (it is arg dependent).
-  DefaultToolChain = Host->getToolChain(*Args);
 
   // The compilation takes ownership of Args.
-  Compilation *C = new Compilation(*DefaultToolChain, Args);
+  Compilation *C = new Compilation(*Host->getToolChain(*Args), Args);
 
   // FIXME: This behavior shouldn't be here.
   if (CCCPrintOptions) {
@@ -188,7 +185,7 @@
     BuildActions(C->getArgs(), C->getActions());
 
   if (CCCPrintActions) {
-    PrintActions(C->getArgs(), C->getActions());
+    PrintActions(*C);
     return C;
   }
 
@@ -255,7 +252,7 @@
   return true;
 }
 
-static unsigned PrintActions1(const ArgList &Args,
+static unsigned PrintActions1(const Compilation &C,
                               Action *A, 
                               std::map<Action*, unsigned> &Ids) {
   if (Ids.count(A))
@@ -266,14 +263,15 @@
   
   os << Action::getClassName(A->getKind()) << ", ";
   if (InputAction *IA = dyn_cast<InputAction>(A)) {    
-    os << "\"" << IA->getInputArg().getValue(Args) << "\"";
+    os << "\"" << IA->getInputArg().getValue(C.getArgs()) << "\"";
   } else if (BindArchAction *BIA = dyn_cast<BindArchAction>(A)) {
-    os << "\"" << BIA->getArchName() << "\", "
-       << "{" << PrintActions1(Args, *BIA->begin(), Ids) << "}";
+    os << '"' << (BIA->getArchName() ? BIA->getArchName() : 
+                  C.getDefaultToolChain().getArchName()) << '"'
+       << ", {" << PrintActions1(C, *BIA->begin(), Ids) << "}";
   } else {
     os << "{";
     for (Action::iterator it = A->begin(), ie = A->end(); it != ie;) {
-      os << PrintActions1(Args, *it, Ids);
+      os << PrintActions1(C, *it, Ids);
       ++it;
       if (it != ie)
         os << ", ";
@@ -289,12 +287,11 @@
   return Id;
 }
 
-void Driver::PrintActions(const ArgList &Args, 
-                          const ActionList &Actions) const {
+void Driver::PrintActions(const Compilation &C) const {
   std::map<Action*, unsigned> Ids;
-  for (ActionList::const_iterator it = Actions.begin(), ie = Actions.end(); 
-       it != ie; ++it)
-    PrintActions1(Args, *it, Ids);
+  for (ActionList::const_iterator it = C.getActions().begin(), 
+         ie = C.getActions().end(); it != ie; ++it)
+    PrintActions1(C, *it, Ids);
 }
 
 void Driver::BuildUniversalActions(const ArgList &Args, 
@@ -319,12 +316,11 @@
     }
   }
 
-  // When there is no explicit arch for this platform, get one from
-  // the host so that -Xarch_ is handled correctly.
-  if (!Archs.size()) {
-    const char *Arch = DefaultToolChain->getArchName().c_str();
-    Archs.push_back(Arch);
-  }
+  // When there is no explicit arch for this platform, make sure we
+  // still bind the architecture (to the default) so that -Xarch_ is
+  // handled correctly.
+  if (!Archs.size())
+    Archs.push_back(0);
 
   // FIXME: We killed off some others but these aren't yet detected in
   // a functional manner. If we added information to jobs about which
@@ -641,8 +637,7 @@
     }
 
     InputInfo II;
-    BuildJobsForAction(C, 
-                       A, DefaultToolChain, 
+    BuildJobsForAction(C, A, &C.getDefaultToolChain(), 
                        /*CanAcceptPipe*/ true,
                        /*AtTopLevel*/ true,
                        /*LinkingOutput*/ LinkingOutput,
@@ -679,6 +674,8 @@
 
   if (const BindArchAction *BAA = dyn_cast<BindArchAction>(A)) {
     const char *ArchName = BAA->getArchName();
+    if (!ArchName)
+      ArchName = C.getDefaultToolChain().getArchName().c_str();
     BuildJobsForAction(C,
                        *BAA->begin(), 
                        Host->getToolChain(C.getArgs(), ArchName),