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 { 84198396Srdivackystruct DomViewer 85202878Srdivacky : public DOTGraphTraitsViewer<DominatorTree, false> { 86198396Srdivacky static char ID; 87218893Sdim DomViewer() : DOTGraphTraitsViewer<DominatorTree, false>("dom", ID){ 88218893Sdim initializeDomViewerPass(*PassRegistry::getPassRegistry()); 89218893Sdim } 90198396Srdivacky}; 91198396Srdivacky 92198396Srdivackystruct DomOnlyViewer 93202878Srdivacky : public DOTGraphTraitsViewer<DominatorTree, true> { 94198396Srdivacky static char ID; 95218893Sdim DomOnlyViewer() : DOTGraphTraitsViewer<DominatorTree, true>("domonly", ID){ 96218893Sdim initializeDomOnlyViewerPass(*PassRegistry::getPassRegistry()); 97218893Sdim } 98198396Srdivacky}; 99198396Srdivacky 100198396Srdivackystruct PostDomViewer 101202878Srdivacky : public DOTGraphTraitsViewer<PostDominatorTree, false> { 102198396Srdivacky static char ID; 103198396Srdivacky PostDomViewer() : 104218893Sdim DOTGraphTraitsViewer<PostDominatorTree, false>("postdom", ID){ 105218893Sdim initializePostDomViewerPass(*PassRegistry::getPassRegistry()); 106218893Sdim } 107198396Srdivacky}; 108198396Srdivacky 109198396Srdivackystruct PostDomOnlyViewer 110202878Srdivacky : public DOTGraphTraitsViewer<PostDominatorTree, true> { 111198396Srdivacky static char ID; 112198396Srdivacky PostDomOnlyViewer() : 113218893Sdim DOTGraphTraitsViewer<PostDominatorTree, true>("postdomonly", ID){ 114218893Sdim initializePostDomOnlyViewerPass(*PassRegistry::getPassRegistry()); 115218893Sdim } 116198396Srdivacky}; 117198396Srdivacky} // end anonymous namespace 118198396Srdivacky 119198396Srdivackychar DomViewer::ID = 0; 120212904SdimINITIALIZE_PASS(DomViewer, "view-dom", 121218893Sdim "View dominance tree of function", false, false) 122198396Srdivacky 123198396Srdivackychar DomOnlyViewer::ID = 0; 124212904SdimINITIALIZE_PASS(DomOnlyViewer, "view-dom-only", 125212904Sdim "View dominance tree of function (with no function bodies)", 126218893Sdim false, false) 127198396Srdivacky 128198396Srdivackychar PostDomViewer::ID = 0; 129212904SdimINITIALIZE_PASS(PostDomViewer, "view-postdom", 130218893Sdim "View postdominance tree of function", false, false) 131198396Srdivacky 132198396Srdivackychar PostDomOnlyViewer::ID = 0; 133212904SdimINITIALIZE_PASS(PostDomOnlyViewer, "view-postdom-only", 134212904Sdim "View postdominance tree of function " 135212904Sdim "(with no function bodies)", 136218893Sdim false, false) 137198396Srdivacky 138198396Srdivackynamespace { 139198396Srdivackystruct DomPrinter 140202878Srdivacky : public DOTGraphTraitsPrinter<DominatorTree, false> { 141198396Srdivacky static char ID; 142218893Sdim DomPrinter() : DOTGraphTraitsPrinter<DominatorTree, false>("dom", ID) { 143218893Sdim initializeDomPrinterPass(*PassRegistry::getPassRegistry()); 144218893Sdim } 145198396Srdivacky}; 146198396Srdivacky 147198396Srdivackystruct DomOnlyPrinter 148202878Srdivacky : public DOTGraphTraitsPrinter<DominatorTree, true> { 149198396Srdivacky static char ID; 150218893Sdim DomOnlyPrinter() : DOTGraphTraitsPrinter<DominatorTree, true>("domonly", ID) { 151218893Sdim initializeDomOnlyPrinterPass(*PassRegistry::getPassRegistry()); 152218893Sdim } 153198396Srdivacky}; 154198396Srdivacky 155198396Srdivackystruct PostDomPrinter 156202878Srdivacky : public DOTGraphTraitsPrinter<PostDominatorTree, false> { 157198396Srdivacky static char ID; 158198396Srdivacky PostDomPrinter() : 159218893Sdim DOTGraphTraitsPrinter<PostDominatorTree, false>("postdom", ID) { 160218893Sdim initializePostDomPrinterPass(*PassRegistry::getPassRegistry()); 161218893Sdim } 162198396Srdivacky}; 163198396Srdivacky 164198396Srdivackystruct PostDomOnlyPrinter 165202878Srdivacky : public DOTGraphTraitsPrinter<PostDominatorTree, true> { 166198396Srdivacky static char ID; 167198396Srdivacky PostDomOnlyPrinter() : 168218893Sdim DOTGraphTraitsPrinter<PostDominatorTree, true>("postdomonly", ID) { 169218893Sdim initializePostDomOnlyPrinterPass(*PassRegistry::getPassRegistry()); 170218893Sdim } 171198396Srdivacky}; 172198396Srdivacky} // end anonymous namespace 173198396Srdivacky 174198396Srdivacky 175198396Srdivacky 176198396Srdivackychar DomPrinter::ID = 0; 177212904SdimINITIALIZE_PASS(DomPrinter, "dot-dom", 178212904Sdim "Print dominance tree of function to 'dot' file", 179218893Sdim false, false) 180198396Srdivacky 181198396Srdivackychar DomOnlyPrinter::ID = 0; 182212904SdimINITIALIZE_PASS(DomOnlyPrinter, "dot-dom-only", 183212904Sdim "Print dominance tree of function to 'dot' file " 184212904Sdim "(with no function bodies)", 185218893Sdim false, false) 186198396Srdivacky 187198396Srdivackychar PostDomPrinter::ID = 0; 188212904SdimINITIALIZE_PASS(PostDomPrinter, "dot-postdom", 189212904Sdim "Print postdominance tree of function to 'dot' file", 190218893Sdim false, false) 191198396Srdivacky 192198396Srdivackychar PostDomOnlyPrinter::ID = 0; 193212904SdimINITIALIZE_PASS(PostDomOnlyPrinter, "dot-postdom-only", 194212904Sdim "Print postdominance tree of function to 'dot' file " 195212904Sdim "(with no function bodies)", 196218893Sdim false, false) 197198396Srdivacky 198198396Srdivacky// Create methods available outside of this file, to use them 199198396Srdivacky// "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by 200198396Srdivacky// the link time optimization. 201198396Srdivacky 202198396SrdivackyFunctionPass *llvm::createDomPrinterPass() { 203198396Srdivacky return new DomPrinter(); 204198396Srdivacky} 205198396Srdivacky 206198396SrdivackyFunctionPass *llvm::createDomOnlyPrinterPass() { 207198396Srdivacky return new DomOnlyPrinter(); 208198396Srdivacky} 209198396Srdivacky 210198396SrdivackyFunctionPass *llvm::createDomViewerPass() { 211198396Srdivacky return new DomViewer(); 212198396Srdivacky} 213198396Srdivacky 214198396SrdivackyFunctionPass *llvm::createDomOnlyViewerPass() { 215198396Srdivacky return new DomOnlyViewer(); 216198396Srdivacky} 217198396Srdivacky 218198396SrdivackyFunctionPass *llvm::createPostDomPrinterPass() { 219198396Srdivacky return new PostDomPrinter(); 220198396Srdivacky} 221198396Srdivacky 222198396SrdivackyFunctionPass *llvm::createPostDomOnlyPrinterPass() { 223198396Srdivacky return new PostDomOnlyPrinter(); 224198396Srdivacky} 225198396Srdivacky 226198396SrdivackyFunctionPass *llvm::createPostDomViewerPass() { 227198396Srdivacky return new PostDomViewer(); 228198396Srdivacky} 229198396Srdivacky 230198396SrdivackyFunctionPass *llvm::createPostDomOnlyViewerPass() { 231198396Srdivacky return new PostDomOnlyViewer(); 232198396Srdivacky} 233