1b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner//===- DomPrinter.cpp - DOT printer for the dominance trees    ------------===//
2b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner//
3b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner//                     The LLVM Compiler Infrastructure
4b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner//
5b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner// This file is distributed under the University of Illinois Open Source
6b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner// License. See LICENSE.TXT for details.
7b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner//
8b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner//===----------------------------------------------------------------------===//
9b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner//
10b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner// This file defines '-dot-dom' and '-dot-postdom' analysis passes, which emit
11b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner// a dom.<fnname>.dot or postdom.<fnname>.dot file for each function in the
12b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner// program, with a graph of the dominance/postdominance tree of that
13b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner// function.
14b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner//
15b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner// There are also passes available to directly call dotty ('-view-dom' or
16b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner// '-view-postdom'). By appending '-only' like '-dot-dom-only' only the
17b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner// names of the bbs are printed, but the content is hidden.
18b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner//
19b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner//===----------------------------------------------------------------------===//
20b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
21b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner#include "llvm/Analysis/DomPrinter.h"
2223279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser#include "llvm/Analysis/DOTGraphTraitsPass.h"
23b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner#include "llvm/Analysis/PostDominators.h"
24b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
25b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattnerusing namespace llvm;
26b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
27b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattnernamespace llvm {
28b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattnertemplate<>
29b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattnerstruct DOTGraphTraits<DomTreeNode*> : public DefaultDOTGraphTraits {
30a10d598602308549d87d2c5d9848f5a72fda2b43Tobias Grosser
3156f4ef3232850e29c4635d0923910acce8887bd0Tobias Grosser  DOTGraphTraits (bool isSimple=false)
3256f4ef3232850e29c4635d0923910acce8887bd0Tobias Grosser    : DefaultDOTGraphTraits(isSimple) {}
33a10d598602308549d87d2c5d9848f5a72fda2b43Tobias Grosser
3456f4ef3232850e29c4635d0923910acce8887bd0Tobias Grosser  std::string getNodeLabel(DomTreeNode *Node, DomTreeNode *Graph) {
35b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
36b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner    BasicBlock *BB = Node->getBlock();
37b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
38b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner    if (!BB)
39b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner      return "Post dominance root node";
40b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
4156f4ef3232850e29c4635d0923910acce8887bd0Tobias Grosser
4256f4ef3232850e29c4635d0923910acce8887bd0Tobias Grosser    if (isSimple())
4356f4ef3232850e29c4635d0923910acce8887bd0Tobias Grosser      return DOTGraphTraits<const Function*>
443472766f9eb7d66f234c390ce1b3a8b76f0ee9ceDuncan Sands        ::getSimpleNodeLabel(BB, BB->getParent());
4556f4ef3232850e29c4635d0923910acce8887bd0Tobias Grosser    else
4656f4ef3232850e29c4635d0923910acce8887bd0Tobias Grosser      return DOTGraphTraits<const Function*>
473472766f9eb7d66f234c390ce1b3a8b76f0ee9ceDuncan Sands        ::getCompleteNodeLabel(BB, BB->getParent());
48b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  }
49b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner};
50b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
51b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattnertemplate<>
52b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattnerstruct DOTGraphTraits<DominatorTree*> : public DOTGraphTraits<DomTreeNode*> {
53b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
54a10d598602308549d87d2c5d9848f5a72fda2b43Tobias Grosser  DOTGraphTraits (bool isSimple=false)
55a10d598602308549d87d2c5d9848f5a72fda2b43Tobias Grosser    : DOTGraphTraits<DomTreeNode*>(isSimple) {}
56a10d598602308549d87d2c5d9848f5a72fda2b43Tobias Grosser
57b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  static std::string getGraphName(DominatorTree *DT) {
58b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner    return "Dominator tree";
59b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  }
60b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
6156f4ef3232850e29c4635d0923910acce8887bd0Tobias Grosser  std::string getNodeLabel(DomTreeNode *Node, DominatorTree *G) {
6256f4ef3232850e29c4635d0923910acce8887bd0Tobias Grosser    return DOTGraphTraits<DomTreeNode*>::getNodeLabel(Node, G->getRootNode());
63b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  }
64b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner};
65b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
66b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattnertemplate<>
67b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattnerstruct DOTGraphTraits<PostDominatorTree*>
68b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  : public DOTGraphTraits<DomTreeNode*> {
69a10d598602308549d87d2c5d9848f5a72fda2b43Tobias Grosser
70a10d598602308549d87d2c5d9848f5a72fda2b43Tobias Grosser  DOTGraphTraits (bool isSimple=false)
71a10d598602308549d87d2c5d9848f5a72fda2b43Tobias Grosser    : DOTGraphTraits<DomTreeNode*>(isSimple) {}
72a10d598602308549d87d2c5d9848f5a72fda2b43Tobias Grosser
73b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  static std::string getGraphName(PostDominatorTree *DT) {
74b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner    return "Post dominator tree";
75b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  }
7656f4ef3232850e29c4635d0923910acce8887bd0Tobias Grosser
7756f4ef3232850e29c4635d0923910acce8887bd0Tobias Grosser  std::string getNodeLabel(DomTreeNode *Node, PostDominatorTree *G ) {
7856f4ef3232850e29c4635d0923910acce8887bd0Tobias Grosser    return DOTGraphTraits<DomTreeNode*>::getNodeLabel(Node, G->getRootNode());
79b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  }
80b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner};
81b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner}
82b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
83b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattnernamespace {
8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct DominatorTreeWrapperPassAnalysisGraphTraits {
8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  static DominatorTree *getGraph(DominatorTreeWrapperPass *DTWP) {
8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines    return &DTWP->getDomTree();
8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  }
8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines};
8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct DomViewer : public DOTGraphTraitsViewer<
9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                       DominatorTreeWrapperPass, false, DominatorTree *,
9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                       DominatorTreeWrapperPassAnalysisGraphTraits> {
93b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  static char ID;
9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DomViewer()
9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      : DOTGraphTraitsViewer<DominatorTreeWrapperPass, false, DominatorTree *,
9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                             DominatorTreeWrapperPassAnalysisGraphTraits>(
9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines            "dom", ID) {
98081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson    initializeDomViewerPass(*PassRegistry::getPassRegistry());
99081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  }
100b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner};
101b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct DomOnlyViewer : public DOTGraphTraitsViewer<
10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                           DominatorTreeWrapperPass, true, DominatorTree *,
10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                           DominatorTreeWrapperPassAnalysisGraphTraits> {
105b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  static char ID;
10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DomOnlyViewer()
10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      : DOTGraphTraitsViewer<DominatorTreeWrapperPass, true, DominatorTree *,
10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                             DominatorTreeWrapperPassAnalysisGraphTraits>(
10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines            "domonly", ID) {
110081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson    initializeDomOnlyViewerPass(*PassRegistry::getPassRegistry());
111081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  }
112b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner};
113b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
114b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattnerstruct PostDomViewer
11523279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser  : public DOTGraphTraitsViewer<PostDominatorTree, false> {
116b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  static char ID;
117b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  PostDomViewer() :
118081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson    DOTGraphTraitsViewer<PostDominatorTree, false>("postdom", ID){
119081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson      initializePostDomViewerPass(*PassRegistry::getPassRegistry());
120081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson    }
121b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner};
122b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
123b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattnerstruct PostDomOnlyViewer
12423279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser  : public DOTGraphTraitsViewer<PostDominatorTree, true> {
125b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  static char ID;
126b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  PostDomOnlyViewer() :
127081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson    DOTGraphTraitsViewer<PostDominatorTree, true>("postdomonly", ID){
128081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson      initializePostDomOnlyViewerPass(*PassRegistry::getPassRegistry());
129081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson    }
130b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner};
131b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner} // end anonymous namespace
132b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
133b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattnerchar DomViewer::ID = 0;
134d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(DomViewer, "view-dom",
135ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson                "View dominance tree of function", false, false)
136b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
137b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattnerchar DomOnlyViewer::ID = 0;
138d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(DomOnlyViewer, "view-dom-only",
139d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen Anderson                "View dominance tree of function (with no function bodies)",
140ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson                false, false)
141b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
142b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattnerchar PostDomViewer::ID = 0;
143d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(PostDomViewer, "view-postdom",
144ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson                "View postdominance tree of function", false, false)
145b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
146b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattnerchar PostDomOnlyViewer::ID = 0;
147d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(PostDomOnlyViewer, "view-postdom-only",
148d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen Anderson                "View postdominance tree of function "
149d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen Anderson                "(with no function bodies)",
150ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson                false, false)
151b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
152b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattnernamespace {
15336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct DomPrinter : public DOTGraphTraitsPrinter<
15436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        DominatorTreeWrapperPass, false, DominatorTree *,
15536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                        DominatorTreeWrapperPassAnalysisGraphTraits> {
156b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  static char ID;
15736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DomPrinter()
15836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      : DOTGraphTraitsPrinter<DominatorTreeWrapperPass, false, DominatorTree *,
15936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                              DominatorTreeWrapperPassAnalysisGraphTraits>(
16036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines            "dom", ID) {
161081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson    initializeDomPrinterPass(*PassRegistry::getPassRegistry());
162081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  }
163b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner};
164b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
16536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct DomOnlyPrinter : public DOTGraphTraitsPrinter<
16636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                            DominatorTreeWrapperPass, true, DominatorTree *,
16736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                            DominatorTreeWrapperPassAnalysisGraphTraits> {
168b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  static char ID;
16936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  DomOnlyPrinter()
17036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines      : DOTGraphTraitsPrinter<DominatorTreeWrapperPass, true, DominatorTree *,
17136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines                              DominatorTreeWrapperPassAnalysisGraphTraits>(
17236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines            "domonly", ID) {
173081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson    initializeDomOnlyPrinterPass(*PassRegistry::getPassRegistry());
174081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson  }
175b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner};
176b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
177b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattnerstruct PostDomPrinter
17823279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser  : public DOTGraphTraitsPrinter<PostDominatorTree, false> {
179b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  static char ID;
180b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  PostDomPrinter() :
181081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson    DOTGraphTraitsPrinter<PostDominatorTree, false>("postdom", ID) {
182081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson      initializePostDomPrinterPass(*PassRegistry::getPassRegistry());
183081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson    }
184b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner};
185b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
186b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattnerstruct PostDomOnlyPrinter
18723279f18a9759d94579de7e79be61c7aa790b8baTobias Grosser  : public DOTGraphTraitsPrinter<PostDominatorTree, true> {
188b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  static char ID;
189b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  PostDomOnlyPrinter() :
190081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson    DOTGraphTraitsPrinter<PostDominatorTree, true>("postdomonly", ID) {
191081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson      initializePostDomOnlyPrinterPass(*PassRegistry::getPassRegistry());
192081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson    }
193b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner};
194b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner} // end anonymous namespace
195b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
196b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
197b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
198b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattnerchar DomPrinter::ID = 0;
199d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(DomPrinter, "dot-dom",
200d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen Anderson                "Print dominance tree of function to 'dot' file",
201ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson                false, false)
202b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
203b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattnerchar DomOnlyPrinter::ID = 0;
204d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(DomOnlyPrinter, "dot-dom-only",
205d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen Anderson                "Print dominance tree of function to 'dot' file "
206d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen Anderson                "(with no function bodies)",
207ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson                false, false)
208b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
209b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattnerchar PostDomPrinter::ID = 0;
210d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(PostDomPrinter, "dot-postdom",
211d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen Anderson                "Print postdominance tree of function to 'dot' file",
212ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson                false, false)
213b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
214b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattnerchar PostDomOnlyPrinter::ID = 0;
215d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen AndersonINITIALIZE_PASS(PostDomOnlyPrinter, "dot-postdom-only",
216d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen Anderson                "Print postdominance tree of function to 'dot' file "
217d13db2c59cc94162d6cf0a04187d408bfef6d4a7Owen Anderson                "(with no function bodies)",
218ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson                false, false)
219b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
220b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner// Create methods available outside of this file, to use them
221b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner// "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by
222b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner// the link time optimization.
223b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
224b839c5577d8ecb884ffb6874a14782797faec9c4Chris LattnerFunctionPass *llvm::createDomPrinterPass() {
225b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  return new DomPrinter();
226b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner}
227b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
228b839c5577d8ecb884ffb6874a14782797faec9c4Chris LattnerFunctionPass *llvm::createDomOnlyPrinterPass() {
229b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  return new DomOnlyPrinter();
230b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner}
231b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
232b839c5577d8ecb884ffb6874a14782797faec9c4Chris LattnerFunctionPass *llvm::createDomViewerPass() {
233b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  return new DomViewer();
234b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner}
235b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
236b839c5577d8ecb884ffb6874a14782797faec9c4Chris LattnerFunctionPass *llvm::createDomOnlyViewerPass() {
237b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  return new DomOnlyViewer();
238b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner}
239b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
240b839c5577d8ecb884ffb6874a14782797faec9c4Chris LattnerFunctionPass *llvm::createPostDomPrinterPass() {
241b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  return new PostDomPrinter();
242b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner}
243b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
244b839c5577d8ecb884ffb6874a14782797faec9c4Chris LattnerFunctionPass *llvm::createPostDomOnlyPrinterPass() {
245b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  return new PostDomOnlyPrinter();
246b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner}
247b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
248b839c5577d8ecb884ffb6874a14782797faec9c4Chris LattnerFunctionPass *llvm::createPostDomViewerPass() {
249b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  return new PostDomViewer();
250b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner}
251b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner
252b839c5577d8ecb884ffb6874a14782797faec9c4Chris LattnerFunctionPass *llvm::createPostDomOnlyViewerPass() {
253b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner  return new PostDomOnlyViewer();
254b839c5577d8ecb884ffb6874a14782797faec9c4Chris Lattner}
255