[PM] Move the LazyCallGraph printing functionality to a print method.
authorChandler Carruth <chandlerc@gmail.com>
Tue, 13 Jan 2015 23:53:50 +0000 (23:53 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Tue, 13 Jan 2015 23:53:50 +0000 (23:53 +0000)
I'm adding generic analysis printing utility pass support which will
require such a method (or a specialization) so this will let the
existing printing logic satisfy that.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@225854 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/LazyCallGraph.h
lib/Analysis/LazyCallGraph.cpp

index b0b9068de34bf7a2d90f39053ecc94fcd8ed22a3..a7960e186142f94fbb56fb7e1cf610c0ce3a4825 100644 (file)
@@ -462,6 +462,12 @@ public:
 
   ///@}
 
 
   ///@}
 
+  /// \brief Print out the CFG to the provided stream.
+  ///
+  /// This will fully traverse the call graph (and so is non-const) and print
+  /// it out to the provided stream.
+  void print(raw_ostream &OS, Module &M);
+
 private:
   /// \brief Allocator that holds all the call graph nodes.
   SpecificBumpPtrAllocator<Node> BPA;
 private:
   /// \brief Allocator that holds all the call graph nodes.
   SpecificBumpPtrAllocator<Node> BPA;
index c8d0410c1e0f1b36b53d405901227f36688565b4..edb8531f924dc11c02793726130b8de699319fe9 100644 (file)
@@ -542,6 +542,43 @@ void LazyCallGraph::removeEdge(Node &CallerN, Function &Callee) {
   return CallerN.removeEdgeInternal(Callee);
 }
 
   return CallerN.removeEdgeInternal(Callee);
 }
 
+static void printNodes(raw_ostream &OS, LazyCallGraph::Node &N,
+                       SmallPtrSetImpl<LazyCallGraph::Node *> &Printed) {
+  // Recurse depth first through the nodes.
+  for (LazyCallGraph::Node &ChildN : N)
+    if (Printed.insert(&ChildN).second)
+      printNodes(OS, ChildN, Printed);
+
+  OS << "  Call edges in function: " << N.getFunction().getName() << "\n";
+  for (LazyCallGraph::iterator I = N.begin(), E = N.end(); I != E; ++I)
+    OS << "    -> " << I->getFunction().getName() << "\n";
+
+  OS << "\n";
+}
+
+static void printSCC(raw_ostream &OS, LazyCallGraph::SCC &SCC) {
+  ptrdiff_t SCCSize = std::distance(SCC.begin(), SCC.end());
+  OS << "  SCC with " << SCCSize << " functions:\n";
+
+  for (LazyCallGraph::Node *N : SCC)
+    OS << "    " << N->getFunction().getName() << "\n";
+
+  OS << "\n";
+}
+
+void LazyCallGraph::print(raw_ostream &OS, Module &M) {
+  OS << "Printing the call graph for module: " << M.getModuleIdentifier()
+     << "\n\n";
+
+  SmallPtrSet<LazyCallGraph::Node *, 16> Printed;
+  for (LazyCallGraph::Node &N : *this)
+    if (Printed.insert(&N).second)
+      printNodes(OS, N, Printed);
+
+  for (LazyCallGraph::SCC &SCC : this->postorder_sccs())
+    printSCC(OS, SCC);
+}
+
 LazyCallGraph::Node &LazyCallGraph::insertInto(Function &F, Node *&MappedN) {
   return *new (MappedN = BPA.Allocate()) Node(*this, F);
 }
 LazyCallGraph::Node &LazyCallGraph::insertInto(Function &F, Node *&MappedN) {
   return *new (MappedN = BPA.Allocate()) Node(*this, F);
 }
@@ -684,44 +721,9 @@ char LazyCallGraphAnalysis::PassID;
 
 LazyCallGraphPrinterPass::LazyCallGraphPrinterPass(raw_ostream &OS) : OS(OS) {}
 
 
 LazyCallGraphPrinterPass::LazyCallGraphPrinterPass(raw_ostream &OS) : OS(OS) {}
 
-static void printNodes(raw_ostream &OS, LazyCallGraph::Node &N,
-                       SmallPtrSetImpl<LazyCallGraph::Node *> &Printed) {
-  // Recurse depth first through the nodes.
-  for (LazyCallGraph::Node &ChildN : N)
-    if (Printed.insert(&ChildN).second)
-      printNodes(OS, ChildN, Printed);
-
-  OS << "  Call edges in function: " << N.getFunction().getName() << "\n";
-  for (LazyCallGraph::iterator I = N.begin(), E = N.end(); I != E; ++I)
-    OS << "    -> " << I->getFunction().getName() << "\n";
-
-  OS << "\n";
-}
-
-static void printSCC(raw_ostream &OS, LazyCallGraph::SCC &SCC) {
-  ptrdiff_t SCCSize = std::distance(SCC.begin(), SCC.end());
-  OS << "  SCC with " << SCCSize << " functions:\n";
-
-  for (LazyCallGraph::Node *N : SCC)
-    OS << "    " << N->getFunction().getName() << "\n";
-
-  OS << "\n";
-}
-
 PreservedAnalyses LazyCallGraphPrinterPass::run(Module &M,
                                                 ModuleAnalysisManager *AM) {
 PreservedAnalyses LazyCallGraphPrinterPass::run(Module &M,
                                                 ModuleAnalysisManager *AM) {
-  LazyCallGraph &G = AM->getResult<LazyCallGraphAnalysis>(M);
-
-  OS << "Printing the call graph for module: " << M.getModuleIdentifier()
-     << "\n\n";
-
-  SmallPtrSet<LazyCallGraph::Node *, 16> Printed;
-  for (LazyCallGraph::Node &N : G)
-    if (Printed.insert(&N).second)
-      printNodes(OS, N, Printed);
-
-  for (LazyCallGraph::SCC &SCC : G.postorder_sccs())
-    printSCC(OS, SCC);
+  AM->getResult<LazyCallGraphAnalysis>(M).print(OS, M);
 
   return PreservedAnalyses::all();
 }
 
   return PreservedAnalyses::all();
 }