diff options
author | Chris Lattner <sabre@nondot.org> | 2002-11-04 02:55:30 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-11-04 02:55:30 +0000 |
commit | f74825436c2a62ae16874465479a02b2859f216e (patch) | |
tree | 24b2501b72d6e50fe26baa567fd5fdd22c058b67 /tools/opt | |
parent | af663465d64c40e6798c0dacb9d49e9cef763a17 (diff) | |
download | external_llvm-f74825436c2a62ae16874465479a02b2859f216e.zip external_llvm-f74825436c2a62ae16874465479a02b2859f216e.tar.gz external_llvm-f74825436c2a62ae16874465479a02b2859f216e.tar.bz2 |
Implement a new -print-callgraph analysis that turns a callgraph into a dot
graph
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4524 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/opt')
-rw-r--r-- | tools/opt/GraphPrinters.cpp | 46 |
1 files changed, 45 insertions, 1 deletions
diff --git a/tools/opt/GraphPrinters.cpp b/tools/opt/GraphPrinters.cpp index 35bff56..28b18d1 100644 --- a/tools/opt/GraphPrinters.cpp +++ b/tools/opt/GraphPrinters.cpp @@ -10,10 +10,15 @@ #include "Support/GraphWriter.h" #include "llvm/Pass.h" #include "llvm/iTerminators.h" +#include "llvm/Analysis/CallGraph.h" #include "llvm/Support/CFG.h" #include <sstream> #include <fstream> +//===----------------------------------------------------------------------===// +// Control Flow Graph Printer +//===----------------------------------------------------------------------===// + template<> struct DOTGraphTraits<Function*> : public DefaultDOTGraphTraits { static std::string getGraphName(Function *F) { @@ -70,7 +75,6 @@ static void WriteGraphToFile(std::ostream &O, const std::string &GraphName, namespace { struct CFGPrinter : public FunctionPass { - Function *F; virtual bool runOnFunction(Function &Func) { WriteGraphToFile(std::cerr, "cfg."+Func.getName(), &Func); return false; @@ -86,3 +90,43 @@ namespace { RegisterAnalysis<CFGPrinter> P1("print-cfg", "Print CFG of function to 'dot' file"); }; + + + +//===----------------------------------------------------------------------===// +// Call Graph Printer +//===----------------------------------------------------------------------===// + +template<> +struct DOTGraphTraits<CallGraph*> : public DefaultDOTGraphTraits { + static std::string getGraphName(CallGraph *F) { + return "Call Graph"; + } + + static std::string getNodeLabel(CallGraphNode *Node, CallGraph *Graph) { + if (Node->getFunction()) + return Node->getFunction()->getName(); + else + return "Indirect call node"; + } +}; + + +namespace { + struct CallGraphPrinter : public Pass { + virtual bool run(Module &M) { + WriteGraphToFile(std::cerr, "callgraph", &getAnalysis<CallGraph>()); + return false; + } + + void print(std::ostream &OS) const {} + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.addRequired<CallGraph>(); + AU.setPreservesAll(); + } + }; + + RegisterAnalysis<CallGraphPrinter> P2("print-callgraph", + "Print Call Graph to 'dot' file"); +}; |