DomPrinter.cpp revision 276479
1198396Srdivacky//===- DomPrinter.cpp - DOT printer for the dominance trees ------------===// 2198396Srdivacky// 3198396Srdivacky// The LLVM Compiler Infrastructure 4198396Srdivacky// 5198396Srdivacky// This file is distributed under the University of Illinois Open Source 6198396Srdivacky// License. See LICENSE.TXT for details. 7198396Srdivacky// 8198396Srdivacky//===----------------------------------------------------------------------===// 9198396Srdivacky// 10198396Srdivacky// This file defines '-dot-dom' and '-dot-postdom' analysis passes, which emit 11198396Srdivacky// a dom.<fnname>.dot or postdom.<fnname>.dot file for each function in the 12198396Srdivacky// program, with a graph of the dominance/postdominance tree of that 13198396Srdivacky// function. 14198396Srdivacky// 15198396Srdivacky// There are also passes available to directly call dotty ('-view-dom' or 16198396Srdivacky// '-view-postdom'). By appending '-only' like '-dot-dom-only' only the 17198396Srdivacky// names of the bbs are printed, but the content is hidden. 18198396Srdivacky// 19198396Srdivacky//===----------------------------------------------------------------------===// 20198396Srdivacky 21198396Srdivacky#include "llvm/Analysis/DomPrinter.h" 22202878Srdivacky#include "llvm/Analysis/DOTGraphTraitsPass.h" 23198396Srdivacky#include "llvm/Analysis/PostDominators.h" 24198396Srdivacky 25198396Srdivackyusing namespace llvm; 26198396Srdivacky 27198396Srdivackynamespace llvm { 28198396Srdivackytemplate<> 29198396Srdivackystruct DOTGraphTraits<DomTreeNode*> : public DefaultDOTGraphTraits { 30198396Srdivacky 31199989Srdivacky DOTGraphTraits (bool isSimple=false) 32199989Srdivacky : DefaultDOTGraphTraits(isSimple) {} 33199989Srdivacky 34199989Srdivacky std::string getNodeLabel(DomTreeNode *Node, DomTreeNode *Graph) { 35199989Srdivacky 36198396Srdivacky BasicBlock *BB = Node->getBlock(); 37198396Srdivacky 38198396Srdivacky if (!BB) 39198396Srdivacky return "Post dominance root node"; 40198396Srdivacky 41199989Srdivacky 42199989Srdivacky if (isSimple()) 43199989Srdivacky return DOTGraphTraits<const Function*> 44210299Sed ::getSimpleNodeLabel(BB, BB->getParent()); 45199989Srdivacky else 46199989Srdivacky return DOTGraphTraits<const Function*> 47210299Sed ::getCompleteNodeLabel(BB, BB->getParent()); 48198396Srdivacky } 49198396Srdivacky}; 50198396Srdivacky 51198396Srdivackytemplate<> 52198396Srdivackystruct DOTGraphTraits<DominatorTree*> : public DOTGraphTraits<DomTreeNode*> { 53198396Srdivacky 54199989Srdivacky DOTGraphTraits (bool isSimple=false) 55199989Srdivacky : DOTGraphTraits<DomTreeNode*>(isSimple) {} 56199989Srdivacky 57198396Srdivacky static std::string getGraphName(DominatorTree *DT) { 58198396Srdivacky return "Dominator tree"; 59198396Srdivacky } 60198396Srdivacky 61199989Srdivacky std::string getNodeLabel(DomTreeNode *Node, DominatorTree *G) { 62199989Srdivacky return DOTGraphTraits<DomTreeNode*>::getNodeLabel(Node, G->getRootNode()); 63198396Srdivacky } 64198396Srdivacky}; 65198396Srdivacky 66198396Srdivackytemplate<> 67198396Srdivackystruct DOTGraphTraits<PostDominatorTree*> 68198396Srdivacky : public DOTGraphTraits<DomTreeNode*> { 69199989Srdivacky 70199989Srdivacky DOTGraphTraits (bool isSimple=false) 71199989Srdivacky : DOTGraphTraits<DomTreeNode*>(isSimple) {} 72199989Srdivacky 73198396Srdivacky static std::string getGraphName(PostDominatorTree *DT) { 74198396Srdivacky return "Post dominator tree"; 75198396Srdivacky } 76199989Srdivacky 77199989Srdivacky std::string getNodeLabel(DomTreeNode *Node, PostDominatorTree *G ) { 78199989Srdivacky return DOTGraphTraits<DomTreeNode*>::getNodeLabel(Node, G->getRootNode()); 79198396Srdivacky } 80198396Srdivacky}; 81198396Srdivacky} 82198396Srdivacky 83198396Srdivackynamespace { 84276479Sdimstruct DominatorTreeWrapperPassAnalysisGraphTraits { 85276479Sdim static DominatorTree *getGraph(DominatorTreeWrapperPass *DTWP) { 86276479Sdim return &DTWP->getDomTree(); 87276479Sdim } 88276479Sdim}; 89276479Sdim 90276479Sdimstruct DomViewer : public DOTGraphTraitsViewer< 91276479Sdim DominatorTreeWrapperPass, false, DominatorTree *, 92276479Sdim DominatorTreeWrapperPassAnalysisGraphTraits> { 93198396Srdivacky static char ID; 94276479Sdim DomViewer() 95276479Sdim : DOTGraphTraitsViewer<DominatorTreeWrapperPass, false, DominatorTree *, 96276479Sdim DominatorTreeWrapperPassAnalysisGraphTraits>( 97276479Sdim "dom", ID) { 98218893Sdim initializeDomViewerPass(*PassRegistry::getPassRegistry()); 99218893Sdim } 100198396Srdivacky}; 101198396Srdivacky 102276479Sdimstruct DomOnlyViewer : public DOTGraphTraitsViewer< 103276479Sdim DominatorTreeWrapperPass, true, DominatorTree *, 104276479Sdim DominatorTreeWrapperPassAnalysisGraphTraits> { 105198396Srdivacky static char ID; 106276479Sdim DomOnlyViewer() 107276479Sdim : DOTGraphTraitsViewer<DominatorTreeWrapperPass, true, DominatorTree *, 108276479Sdim DominatorTreeWrapperPassAnalysisGraphTraits>( 109276479Sdim "domonly", ID) { 110218893Sdim initializeDomOnlyViewerPass(*PassRegistry::getPassRegistry()); 111218893Sdim } 112198396Srdivacky}; 113198396Srdivacky 114198396Srdivackystruct PostDomViewer 115202878Srdivacky : public DOTGraphTraitsViewer<PostDominatorTree, false> { 116198396Srdivacky static char ID; 117198396Srdivacky PostDomViewer() : 118218893Sdim DOTGraphTraitsViewer<PostDominatorTree, false>("postdom", ID){ 119218893Sdim initializePostDomViewerPass(*PassRegistry::getPassRegistry()); 120218893Sdim } 121198396Srdivacky}; 122198396Srdivacky 123198396Srdivackystruct PostDomOnlyViewer 124202878Srdivacky : public DOTGraphTraitsViewer<PostDominatorTree, true> { 125198396Srdivacky static char ID; 126198396Srdivacky PostDomOnlyViewer() : 127218893Sdim DOTGraphTraitsViewer<PostDominatorTree, true>("postdomonly", ID){ 128218893Sdim initializePostDomOnlyViewerPass(*PassRegistry::getPassRegistry()); 129218893Sdim } 130198396Srdivacky}; 131198396Srdivacky} // end anonymous namespace 132198396Srdivacky 133198396Srdivackychar DomViewer::ID = 0; 134212904SdimINITIALIZE_PASS(DomViewer, "view-dom", 135218893Sdim "View dominance tree of function", false, false) 136198396Srdivacky 137198396Srdivackychar DomOnlyViewer::ID = 0; 138212904SdimINITIALIZE_PASS(DomOnlyViewer, "view-dom-only", 139212904Sdim "View dominance tree of function (with no function bodies)", 140218893Sdim false, false) 141198396Srdivacky 142198396Srdivackychar PostDomViewer::ID = 0; 143212904SdimINITIALIZE_PASS(PostDomViewer, "view-postdom", 144218893Sdim "View postdominance tree of function", false, false) 145198396Srdivacky 146198396Srdivackychar PostDomOnlyViewer::ID = 0; 147212904SdimINITIALIZE_PASS(PostDomOnlyViewer, "view-postdom-only", 148212904Sdim "View postdominance tree of function " 149212904Sdim "(with no function bodies)", 150218893Sdim false, false) 151198396Srdivacky 152198396Srdivackynamespace { 153276479Sdimstruct DomPrinter : public DOTGraphTraitsPrinter< 154276479Sdim DominatorTreeWrapperPass, false, DominatorTree *, 155276479Sdim DominatorTreeWrapperPassAnalysisGraphTraits> { 156198396Srdivacky static char ID; 157276479Sdim DomPrinter() 158276479Sdim : DOTGraphTraitsPrinter<DominatorTreeWrapperPass, false, DominatorTree *, 159276479Sdim DominatorTreeWrapperPassAnalysisGraphTraits>( 160276479Sdim "dom", ID) { 161218893Sdim initializeDomPrinterPass(*PassRegistry::getPassRegistry()); 162218893Sdim } 163198396Srdivacky}; 164198396Srdivacky 165276479Sdimstruct DomOnlyPrinter : public DOTGraphTraitsPrinter< 166276479Sdim DominatorTreeWrapperPass, true, DominatorTree *, 167276479Sdim DominatorTreeWrapperPassAnalysisGraphTraits> { 168198396Srdivacky static char ID; 169276479Sdim DomOnlyPrinter() 170276479Sdim : DOTGraphTraitsPrinter<DominatorTreeWrapperPass, true, DominatorTree *, 171276479Sdim DominatorTreeWrapperPassAnalysisGraphTraits>( 172276479Sdim "domonly", ID) { 173218893Sdim initializeDomOnlyPrinterPass(*PassRegistry::getPassRegistry()); 174218893Sdim } 175198396Srdivacky}; 176198396Srdivacky 177198396Srdivackystruct PostDomPrinter 178202878Srdivacky : public DOTGraphTraitsPrinter<PostDominatorTree, false> { 179198396Srdivacky static char ID; 180198396Srdivacky PostDomPrinter() : 181218893Sdim DOTGraphTraitsPrinter<PostDominatorTree, false>("postdom", ID) { 182218893Sdim initializePostDomPrinterPass(*PassRegistry::getPassRegistry()); 183218893Sdim } 184198396Srdivacky}; 185198396Srdivacky 186198396Srdivackystruct PostDomOnlyPrinter 187202878Srdivacky : public DOTGraphTraitsPrinter<PostDominatorTree, true> { 188198396Srdivacky static char ID; 189198396Srdivacky PostDomOnlyPrinter() : 190218893Sdim DOTGraphTraitsPrinter<PostDominatorTree, true>("postdomonly", ID) { 191218893Sdim initializePostDomOnlyPrinterPass(*PassRegistry::getPassRegistry()); 192218893Sdim } 193198396Srdivacky}; 194198396Srdivacky} // end anonymous namespace 195198396Srdivacky 196198396Srdivacky 197198396Srdivacky 198198396Srdivackychar DomPrinter::ID = 0; 199212904SdimINITIALIZE_PASS(DomPrinter, "dot-dom", 200212904Sdim "Print dominance tree of function to 'dot' file", 201218893Sdim false, false) 202198396Srdivacky 203198396Srdivackychar DomOnlyPrinter::ID = 0; 204212904SdimINITIALIZE_PASS(DomOnlyPrinter, "dot-dom-only", 205212904Sdim "Print dominance tree of function to 'dot' file " 206212904Sdim "(with no function bodies)", 207218893Sdim false, false) 208198396Srdivacky 209198396Srdivackychar PostDomPrinter::ID = 0; 210212904SdimINITIALIZE_PASS(PostDomPrinter, "dot-postdom", 211212904Sdim "Print postdominance tree of function to 'dot' file", 212218893Sdim false, false) 213198396Srdivacky 214198396Srdivackychar PostDomOnlyPrinter::ID = 0; 215212904SdimINITIALIZE_PASS(PostDomOnlyPrinter, "dot-postdom-only", 216212904Sdim "Print postdominance tree of function to 'dot' file " 217212904Sdim "(with no function bodies)", 218218893Sdim false, false) 219198396Srdivacky 220198396Srdivacky// Create methods available outside of this file, to use them 221198396Srdivacky// "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by 222198396Srdivacky// the link time optimization. 223198396Srdivacky 224198396SrdivackyFunctionPass *llvm::createDomPrinterPass() { 225198396Srdivacky return new DomPrinter(); 226198396Srdivacky} 227198396Srdivacky 228198396SrdivackyFunctionPass *llvm::createDomOnlyPrinterPass() { 229198396Srdivacky return new DomOnlyPrinter(); 230198396Srdivacky} 231198396Srdivacky 232198396SrdivackyFunctionPass *llvm::createDomViewerPass() { 233198396Srdivacky return new DomViewer(); 234198396Srdivacky} 235198396Srdivacky 236198396SrdivackyFunctionPass *llvm::createDomOnlyViewerPass() { 237198396Srdivacky return new DomOnlyViewer(); 238198396Srdivacky} 239198396Srdivacky 240198396SrdivackyFunctionPass *llvm::createPostDomPrinterPass() { 241198396Srdivacky return new PostDomPrinter(); 242198396Srdivacky} 243198396Srdivacky 244198396SrdivackyFunctionPass *llvm::createPostDomOnlyPrinterPass() { 245198396Srdivacky return new PostDomOnlyPrinter(); 246198396Srdivacky} 247198396Srdivacky 248198396SrdivackyFunctionPass *llvm::createPostDomViewerPass() { 249198396Srdivacky return new PostDomViewer(); 250198396Srdivacky} 251198396Srdivacky 252198396SrdivackyFunctionPass *llvm::createPostDomOnlyViewerPass() { 253198396Srdivacky return new PostDomOnlyViewer(); 254198396Srdivacky} 255