Code reorg


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50722 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/llvmc2/CompilationGraph.cpp b/tools/llvmc2/CompilationGraph.cpp
new file mode 100644
index 0000000..36e5fc7
--- /dev/null
+++ b/tools/llvmc2/CompilationGraph.cpp
@@ -0,0 +1,88 @@
+//===--- CompilationGraph.cpp - The LLVM Compiler Driver --------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open
+// Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+//  Compilation graph - implementation.
+//
+//===----------------------------------------------------------------------===//
+
+#include "CompilationGraph.h"
+
+#include "llvm/Support/CommandLine.h"
+#include "llvm/ADT/STLExtras.h"
+
+#include <stdexcept>
+
+using namespace llvm;
+
+extern cl::list<std::string> InputFilenames;
+extern cl::opt<std::string> OutputFilename;
+
+int llvmcc::CompilationGraph::Build (const sys::Path& tempDir) const {
+  sys::Path In(InputFilenames.at(0)), Out;
+
+  // Find out which language corresponds to the suffix of the first input file
+  LanguageMap::const_iterator Lang = ExtsToLangs.find(In.getSuffix());
+  if (Lang == ExtsToLangs.end())
+    throw std::runtime_error("Unknown suffix!");
+
+  // Find the toolchain corresponding to this language
+  ToolChainMap::const_iterator ToolsIt = ToolChains.find(Lang->second);
+  if (ToolsIt == ToolChains.end())
+    throw std::runtime_error("Unknown language!");
+  ToolChain Tools = ToolsIt->second;
+
+  PathVector JoinList;
+
+  for (cl::list<std::string>::const_iterator B = InputFilenames.begin(),
+        E = InputFilenames.end(); B != E; ++B) {
+    In = sys::Path(*B);
+
+    // Pass input file through the toolchain
+    for (ToolChain::const_iterator B = Tools.begin(), E = Tools.end();
+         B != E; ++B) {
+
+      const Tool* CurTool = B->getPtr();
+
+      // Is this the last step in the chain?
+      if (llvm::next(B) == E || CurTool->IsLast()) {
+        JoinList.push_back(In);
+        break;
+      }
+      else {
+        Out = tempDir;
+        Out.appendComponent(In.getBasename());
+        Out.appendSuffix(CurTool->OutputSuffix());
+        Out.makeUnique(true, NULL);
+        Out.eraseFromDisk();
+      }
+
+      if (CurTool->GenerateAction(In, Out).Execute() != 0)
+        throw std::runtime_error("Tool returned error code!");
+
+      In = Out; Out.clear();
+    }
+  }
+
+  // Pass .o files to linker
+  const Tool* JoinNode = (--Tools.end())->getPtr();
+
+  // If the final output name is empty, set it to "a.out"
+  if (!OutputFilename.empty()) {
+    Out = sys::Path(OutputFilename);
+  }
+  else {
+    Out = sys::Path("a");
+    Out.appendSuffix(JoinNode->OutputSuffix());
+  }
+
+  if (JoinNode->GenerateAction(JoinList, Out).Execute() != 0)
+    throw std::runtime_error("Tool returned error code!");
+
+  return 0;
+}