Start using retnodes_* for iteration.
[oota-llvm.git] / lib / Analysis / DataStructure / Printer.cpp
index 67d5c275506295fbc5d387f88e727160961cf596..05fba215d51d1073658eda9c5a179f843bfda245 100644 (file)
@@ -12,6 +12,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/Analysis/DataStructure/DataStructure.h"
+#include "llvm/Analysis/DataStructure/EquivClassGraphs.h"
 #include "llvm/Analysis/DataStructure/DSGraph.h"
 #include "llvm/Analysis/DataStructure/DSGraphTraits.h"
 #include "llvm/Module.h"
@@ -43,8 +44,8 @@ static std::string getCaption(const DSNode *N, const DSGraph *G) {
   if (!G) G = N->getParentGraph();
 
   // Get the module from ONE of the functions in the graph it is available.
-  if (G && !G->getReturnNodes().empty())
-    M = G->getReturnNodes().begin()->first->getParent();
+  if (G && G->retnodes_begin() != G->retnodes_end())
+    M = G->retnodes_begin()->first->getParent();
   if (M == 0 && G) {
     // If there is a global in the graph, we can use it to find the module.
     const DSScalarMap &SM = G->getScalarMap();
@@ -125,8 +126,8 @@ struct DOTGraphTraits<const DSGraph*> : public DefaultDOTGraphTraits {
   static void addCustomGraphFeatures(const DSGraph *G,
                                      GraphWriter<const DSGraph*> &GW) {
     Module *CurMod = 0;
-    if (!G->getReturnNodes().empty())
-      CurMod = G->getReturnNodes().begin()->first->getParent();
+    if (G->retnodes_begin() != G->retnodes_end())
+      CurMod = G->retnodes_begin()->first->getParent();
     else {
       // If there is a global in the graph, we can use it to find the module.
       const DSScalarMap &SM = G->getScalarMap();
@@ -153,12 +154,11 @@ struct DOTGraphTraits<const DSGraph*> : public DefaultDOTGraphTraits {
 
 
     // Output the returned value pointer...
-    const DSGraph::ReturnNodesTy &RetNodes = G->getReturnNodes();
-    for (DSGraph::ReturnNodesTy::const_iterator I = RetNodes.begin(),
-           E = RetNodes.end(); I != E; ++I)
+    for (DSGraph::retnodes_iterator I = G->retnodes_begin(),
+           E = G->retnodes_end(); I != E; ++I)
       if (I->second.getNode()) {
         std::string Label;
-        if (RetNodes.size() == 1)
+        if (G->getReturnNodes().size() == 1)
           Label = "returning";
         else
           Label = I->first->getName() + " ret node";
@@ -174,11 +174,12 @@ struct DOTGraphTraits<const DSGraph*> : public DefaultDOTGraphTraits {
       }
 
     // Output all of the call nodes...
-    const std::vector<DSCallSite> &FCs =
+    const std::list<DSCallSite> &FCs =
       G->shouldPrintAuxCalls() ? G->getAuxFunctionCalls()
       : G->getFunctionCalls();
-    for (unsigned i = 0, e = FCs.size(); i != e; ++i) {
-      const DSCallSite &Call = FCs[i];
+    for (std::list<DSCallSite>::const_iterator I = FCs.begin(), E = FCs.end();
+         I != E; ++I) {
+      const DSCallSite &Call = *I;
       std::vector<std::string> EdgeSourceCaptions(Call.getNumPtrArgs()+2);
       EdgeSourceCaptions[0] = "r";
       if (Call.isDirectCall())
@@ -273,9 +274,15 @@ static void printCollection(const Collection &C, std::ostream &O,
         Gr.getAuxFunctionCalls().size() : Gr.getFunctionCalls().size();
 
       TotalCallNodes += NumCalls;
-      if (I->getName() == "main" || !OnlyPrintMain)
-        Gr.writeGraphToFile(O, Prefix+I->getName());
-      else {
+      if (I->getName() == "main" || !OnlyPrintMain) {
+        Function *SCCFn = Gr.retnodes_begin()->first;
+        if (&*I == SCCFn)
+          Gr.writeGraphToFile(O, Prefix+I->getName());
+        else
+          O << "Didn't write '" << Prefix+I->getName()
+            << ".dot' - Graph already emitted to '" << Prefix+SCCFn->getName()
+            << "\n";
+      } else {
         O << "Skipped Writing '" << Prefix+I->getName() << ".dot'... ["
           << Gr.getGraphSize() << "+" << NumCalls << "]\n";
       }
@@ -326,3 +333,8 @@ void CompleteBUDataStructures::print(std::ostream &O, const Module *M) const {
 }
 
 
+void EquivClassGraphs::print(std::ostream &O, const Module *M) const {
+  if (DontPrintAnything) return;
+  printCollection(*this, O, M, "eq.");
+}
+