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