diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2013-04-08 18:41:23 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2013-04-08 18:41:23 +0000 | 
| commit | 4a16efa3e43e35f0cc9efe3a67f620f0017c3d36 (patch) | |
| tree | 06099edc18d30894081a822b756f117cbe0b8207 /lib/Analysis/IPA/CallPrinter.cpp | |
| parent | 482e7bddf617ae804dc47133cb07eb4aa81e45de (diff) | |
Diffstat (limited to 'lib/Analysis/IPA/CallPrinter.cpp')
| -rw-r--r-- | lib/Analysis/IPA/CallPrinter.cpp | 87 | 
1 files changed, 87 insertions, 0 deletions
| diff --git a/lib/Analysis/IPA/CallPrinter.cpp b/lib/Analysis/IPA/CallPrinter.cpp new file mode 100644 index 000000000000..306ae7a4dbfb --- /dev/null +++ b/lib/Analysis/IPA/CallPrinter.cpp @@ -0,0 +1,87 @@ +//===- CallPrinter.cpp - DOT printer for call graph -----------------------===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines '-dot-callgraph', which emit a callgraph.<fnname>.dot +// containing the call graph of a module. +// +// There is also a pass available to directly call dotty ('-view-callgraph'). +// +//===----------------------------------------------------------------------===// + +#include "llvm/Analysis/CallGraph.h" +#include "llvm/Analysis/CallPrinter.h" +#include "llvm/Analysis/DOTGraphTraitsPass.h" + +using namespace llvm; + +namespace llvm { + +template<> +struct DOTGraphTraits<CallGraph*> : public DefaultDOTGraphTraits { +  DOTGraphTraits (bool isSimple=false) : DefaultDOTGraphTraits(isSimple) {} + +  static std::string getGraphName(CallGraph *Graph) { +    return "Call graph"; +  } + +  std::string getNodeLabel(CallGraphNode *Node, CallGraph *Graph) { +    if (Function *Func = Node->getFunction()) +      return Func->getName(); + +    return "external node"; +  } +}; + +} // end llvm namespace + +namespace { + +struct CallGraphViewer +  : public DOTGraphTraitsModuleViewer<CallGraph, true> { +  static char ID; + +  CallGraphViewer() +    : DOTGraphTraitsModuleViewer<CallGraph, true>("callgraph", ID) { +    initializeCallGraphViewerPass(*PassRegistry::getPassRegistry()); +  } +}; + +struct CallGraphPrinter +  : public DOTGraphTraitsModulePrinter<CallGraph, true> { +  static char ID; + +  CallGraphPrinter() +    : DOTGraphTraitsModulePrinter<CallGraph, true>("callgraph", ID) { +      initializeCallGraphPrinterPass(*PassRegistry::getPassRegistry()); +  } +}; + +} // end anonymous namespace + +char CallGraphViewer::ID = 0; +INITIALIZE_PASS(CallGraphViewer, "view-callgraph", +                "View call graph", +                false, false) + +char CallGraphPrinter::ID = 0; +INITIALIZE_PASS(CallGraphPrinter, "dot-callgraph", +                "Print call graph to 'dot' file", +                false, false) + +// Create methods available outside of this file, to use them +// "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by +// the link time optimization. + +ModulePass *llvm::createCallGraphViewerPass() { +  return new CallGraphViewer(); +} + +ModulePass *llvm::createCallGraphPrinterPass() { +  return new CallGraphPrinter(); +} | 
