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