diff options
author | Mikhail Glushenkov <foldr@codedgers.com> | 2008-05-06 18:07:48 +0000 |
---|---|---|
committer | Mikhail Glushenkov <foldr@codedgers.com> | 2008-05-06 18:07:48 +0000 |
commit | dfdb36a2c330dbef2df397541aa35741737b4870 (patch) | |
tree | 1c87c314870cb6694c59aa332e0248d09e21903f | |
parent | 520e5311feb8c7bd243f44f0a613926cfde7d996 (diff) | |
download | external_llvm-dfdb36a2c330dbef2df397541aa35741737b4870.zip external_llvm-dfdb36a2c330dbef2df397541aa35741737b4870.tar.gz external_llvm-dfdb36a2c330dbef2df397541aa35741737b4870.tar.bz2 |
Utilize topological sort in CompilationGraph::Build().
This makes more interesting graph topologies possible. Currently all tests pass,
but more testing is needed.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50744 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | tools/llvmc2/CompilationGraph.cpp | 36 | ||||
-rw-r--r-- | tools/llvmc2/Tool.h | 11 | ||||
-rw-r--r-- | tools/llvmc2/llvmc.cpp | 6 |
3 files changed, 44 insertions, 9 deletions
diff --git a/tools/llvmc2/CompilationGraph.cpp b/tools/llvmc2/CompilationGraph.cpp index 8f3918f..a130ee5 100644 --- a/tools/llvmc2/CompilationGraph.cpp +++ b/tools/llvmc2/CompilationGraph.cpp @@ -234,6 +234,40 @@ int CompilationGraph::Build (const sys::Path& TempDir) { // For all join nodes in topological order: for (std::vector<const Node*>::iterator B = JTV.begin(), E = JTV.end(); B != E; ++B) { + // TOFIX: more testing, merge some parts with PassThroughGraph. + sys::Path Out; + const Node* CurNode = *B; + JoinTool* JT = &dynamic_cast<JoinTool&>(*CurNode->ToolPtr.getPtr()); + bool IsLast = false; + + if (JT->JoinListEmpty()) + continue; + + if (!CurNode->HasChildren() || JT->IsLast()) { + if (OutputFilename.empty()) { + Out.set("a"); + Out.appendSuffix(JT->OutputSuffix()); + } + else + Out.set(OutputFilename); + IsLast = true; + } + else { + Out = TempDir; + Out.appendComponent("tmp"); + Out.appendSuffix(JT->OutputSuffix()); + Out.makeUnique(true, NULL); + Out.eraseFromDisk(); + } + + if (JT->GenerateAction(Out).Execute() != 0) + throw std::runtime_error("Tool returned error code!"); + + if (!IsLast) { + const Node* NextNode = &getNode(ChooseEdge(CurNode->OutEdges, + CurNode->Name())->ToolName()); + PassThroughGraph(Out, NextNode, TempDir); + } } return 0; @@ -276,7 +310,7 @@ void CompilationGraph::writeGraph() { std::ofstream O("CompilationGraph.dot"); if (O.good()) { - llvm::WriteGraph(this, "CompilationGraph"); + llvm::WriteGraph(this, "compilation-graph"); O.close(); } else { diff --git a/tools/llvmc2/Tool.h b/tools/llvmc2/Tool.h index 5136468..b4478f9 100644 --- a/tools/llvmc2/Tool.h +++ b/tools/llvmc2/Tool.h @@ -55,16 +55,17 @@ namespace llvmcc { // Join tools have an input file list associated with them. class JoinTool : public Tool { public: - void AddToJoinList(const llvm::sys::Path& P) { JoinList.push_back(P); } - void ClearJoinList() { JoinList.clear(); } + void AddToJoinList(const llvm::sys::Path& P) { JoinList_.push_back(P); } + void ClearJoinList() { JoinList_.clear(); } + bool JoinListEmpty() const { return JoinList_.empty(); } Action GenerateAction(const llvm::sys::Path& outFile) const - { return GenerateAction(JoinList, outFile); } - // We shouldn't shadow GenerateAction from the base class. + { return GenerateAction(JoinList_, outFile); } + // We shouldn't shadow base class's version of GenerateAction. using Tool::GenerateAction; private: - PathVector JoinList; + PathVector JoinList_; }; } diff --git a/tools/llvmc2/llvmc.cpp b/tools/llvmc2/llvmc.cpp index aeb8b33..87c0e41 100644 --- a/tools/llvmc2/llvmc.cpp +++ b/tools/llvmc2/llvmc.cpp @@ -38,7 +38,7 @@ cl::opt<std::string> OutputFilename("o", cl::desc("Output file name"), cl::opt<bool> VerboseMode("v", cl::desc("Enable verbose mode")); cl::opt<bool> WriteGraph("write-graph", - cl::desc("Write CompilationGraph.dot file"), + cl::desc("Write compilation-graph.dot file"), cl::Hidden); cl::opt<bool> ViewGraph("view-graph", cl::desc("Show compilation graph in GhostView"), @@ -72,7 +72,8 @@ int main(int argc, char** argv) { if (WriteGraph) { graph.writeGraph(); - return 0; + if (!ViewGraph) + return 0; } if (ViewGraph) { @@ -80,7 +81,6 @@ int main(int argc, char** argv) { return 0; } - if (InputFilenames.empty()) { std::cerr << "No input files.\n"; return 1; |