diff --git a/include/llvm/Analysis/LazyCallGraph.h b/include/llvm/Analysis/LazyCallGraph.h index b0b9068de34..a7960e18614 100644 --- a/include/llvm/Analysis/LazyCallGraph.h +++ b/include/llvm/Analysis/LazyCallGraph.h @@ -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 BPA; diff --git a/lib/Analysis/LazyCallGraph.cpp b/lib/Analysis/LazyCallGraph.cpp index c8d0410c1e0..edb8531f924 100644 --- a/lib/Analysis/LazyCallGraph.cpp +++ b/lib/Analysis/LazyCallGraph.cpp @@ -542,6 +542,43 @@ void LazyCallGraph::removeEdge(Node &CallerN, Function &Callee) { return CallerN.removeEdgeInternal(Callee); } +static void printNodes(raw_ostream &OS, LazyCallGraph::Node &N, + SmallPtrSetImpl &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 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); } @@ -684,44 +721,9 @@ char LazyCallGraphAnalysis::PassID; LazyCallGraphPrinterPass::LazyCallGraphPrinterPass(raw_ostream &OS) : OS(OS) {} -static void printNodes(raw_ostream &OS, LazyCallGraph::Node &N, - SmallPtrSetImpl &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) { - LazyCallGraph &G = AM->getResult(M); - - OS << "Printing the call graph for module: " << M.getModuleIdentifier() - << "\n\n"; - - SmallPtrSet 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(M).print(OS, M); return PreservedAnalyses::all(); }