119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===- DomPrinter.cpp - DOT printer for the dominance trees    ------------===//
219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//                     The LLVM Compiler Infrastructure
419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file is distributed under the University of Illinois Open Source
619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// License. See LICENSE.TXT for details.
719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
1019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// This file defines '-dot-dom' and '-dot-postdom' analysis passes, which emit
1119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// a dom.<fnname>.dot or postdom.<fnname>.dot file for each function in the
1219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// program, with a graph of the dominance/postdominance tree of that
1319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// function.
1419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
1519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// There are also passes available to directly call dotty ('-view-dom' or
1619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// '-view-postdom'). By appending '-only' like '-dot-dom-only' only the
1719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// names of the bbs are printed, but the content is hidden.
1819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//
1919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman//===----------------------------------------------------------------------===//
2019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
2119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Analysis/DomPrinter.h"
2219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Analysis/DOTGraphTraitsPass.h"
2319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman#include "llvm/Analysis/PostDominators.h"
2419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
2519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanusing namespace llvm;
2619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
2719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumannamespace llvm {
2819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumantemplate<>
2919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstruct DOTGraphTraits<DomTreeNode*> : public DefaultDOTGraphTraits {
3019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
3119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DOTGraphTraits (bool isSimple=false)
3219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    : DefaultDOTGraphTraits(isSimple) {}
3319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
3419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  std::string getNodeLabel(DomTreeNode *Node, DomTreeNode *Graph) {
3519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
3619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    BasicBlock *BB = Node->getBlock();
3719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
3819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (!BB)
3919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return "Post dominance root node";
4019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
4119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
4219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    if (isSimple())
4319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return DOTGraphTraits<const Function*>
4419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        ::getSimpleNodeLabel(BB, BB->getParent());
4519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    else
4619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      return DOTGraphTraits<const Function*>
4719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman        ::getCompleteNodeLabel(BB, BB->getParent());
4819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
4919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman};
5019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
5119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumantemplate<>
5219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstruct DOTGraphTraits<DominatorTree*> : public DOTGraphTraits<DomTreeNode*> {
5319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
5419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DOTGraphTraits (bool isSimple=false)
5519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    : DOTGraphTraits<DomTreeNode*>(isSimple) {}
5619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
5719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  static std::string getGraphName(DominatorTree *DT) {
5819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return "Dominator tree";
5919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
6019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
6119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  std::string getNodeLabel(DomTreeNode *Node, DominatorTree *G) {
6219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return DOTGraphTraits<DomTreeNode*>::getNodeLabel(Node, G->getRootNode());
6319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
6419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman};
6519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
6619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumantemplate<>
6719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstruct DOTGraphTraits<PostDominatorTree*>
6819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  : public DOTGraphTraits<DomTreeNode*> {
6919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
7019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DOTGraphTraits (bool isSimple=false)
7119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    : DOTGraphTraits<DomTreeNode*>(isSimple) {}
7219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
7319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  static std::string getGraphName(PostDominatorTree *DT) {
7419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return "Post dominator tree";
7519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
7619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
7719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  std::string getNodeLabel(DomTreeNode *Node, PostDominatorTree *G ) {
7819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    return DOTGraphTraits<DomTreeNode*>::getNodeLabel(Node, G->getRootNode());
7919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
8019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman};
8119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
8219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
8319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumannamespace {
8419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstruct DomViewer
8519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  : public DOTGraphTraitsViewer<DominatorTree, false> {
8619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  static char ID;
8719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DomViewer() : DOTGraphTraitsViewer<DominatorTree, false>("dom", ID){
8819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    initializeDomViewerPass(*PassRegistry::getPassRegistry());
8919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
9019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman};
9119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
9219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstruct DomOnlyViewer
9319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  : public DOTGraphTraitsViewer<DominatorTree, true> {
9419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  static char ID;
9519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DomOnlyViewer() : DOTGraphTraitsViewer<DominatorTree, true>("domonly", ID){
9619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    initializeDomOnlyViewerPass(*PassRegistry::getPassRegistry());
9719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
9819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman};
9919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
10019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstruct PostDomViewer
10119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  : public DOTGraphTraitsViewer<PostDominatorTree, false> {
10219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  static char ID;
10319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  PostDomViewer() :
10419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    DOTGraphTraitsViewer<PostDominatorTree, false>("postdom", ID){
10519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      initializePostDomViewerPass(*PassRegistry::getPassRegistry());
10619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
10719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman};
10819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
10919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstruct PostDomOnlyViewer
11019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  : public DOTGraphTraitsViewer<PostDominatorTree, true> {
11119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  static char ID;
11219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  PostDomOnlyViewer() :
11319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    DOTGraphTraitsViewer<PostDominatorTree, true>("postdomonly", ID){
11419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      initializePostDomOnlyViewerPass(*PassRegistry::getPassRegistry());
11519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
11619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman};
11719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} // end anonymous namespace
11819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
11919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanchar DomViewer::ID = 0;
12019bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanINITIALIZE_PASS(DomViewer, "view-dom",
12119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                "View dominance tree of function", false, false)
12219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
12319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanchar DomOnlyViewer::ID = 0;
12419bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanINITIALIZE_PASS(DomOnlyViewer, "view-dom-only",
12519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                "View dominance tree of function (with no function bodies)",
12619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                false, false)
12719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
12819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanchar PostDomViewer::ID = 0;
12919bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanINITIALIZE_PASS(PostDomViewer, "view-postdom",
13019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                "View postdominance tree of function", false, false)
13119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
13219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanchar PostDomOnlyViewer::ID = 0;
13319bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanINITIALIZE_PASS(PostDomOnlyViewer, "view-postdom-only",
13419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                "View postdominance tree of function "
13519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                "(with no function bodies)",
13619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                false, false)
13719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
13819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumannamespace {
13919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstruct DomPrinter
14019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  : public DOTGraphTraitsPrinter<DominatorTree, false> {
14119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  static char ID;
14219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DomPrinter() : DOTGraphTraitsPrinter<DominatorTree, false>("dom", ID) {
14319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    initializeDomPrinterPass(*PassRegistry::getPassRegistry());
14419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
14519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman};
14619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
14719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstruct DomOnlyPrinter
14819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  : public DOTGraphTraitsPrinter<DominatorTree, true> {
14919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  static char ID;
15019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  DomOnlyPrinter() : DOTGraphTraitsPrinter<DominatorTree, true>("domonly", ID) {
15119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    initializeDomOnlyPrinterPass(*PassRegistry::getPassRegistry());
15219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  }
15319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman};
15419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
15519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstruct PostDomPrinter
15619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  : public DOTGraphTraitsPrinter<PostDominatorTree, false> {
15719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  static char ID;
15819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  PostDomPrinter() :
15919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    DOTGraphTraitsPrinter<PostDominatorTree, false>("postdom", ID) {
16019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      initializePostDomPrinterPass(*PassRegistry::getPassRegistry());
16119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
16219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman};
16319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
16419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanstruct PostDomOnlyPrinter
16519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  : public DOTGraphTraitsPrinter<PostDominatorTree, true> {
16619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  static char ID;
16719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  PostDomOnlyPrinter() :
16819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    DOTGraphTraitsPrinter<PostDominatorTree, true>("postdomonly", ID) {
16919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman      initializePostDomOnlyPrinterPass(*PassRegistry::getPassRegistry());
17019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman    }
17119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman};
17219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman} // end anonymous namespace
17319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
17419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
17519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
17619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanchar DomPrinter::ID = 0;
17719bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanINITIALIZE_PASS(DomPrinter, "dot-dom",
17819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                "Print dominance tree of function to 'dot' file",
17919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                false, false)
18019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
18119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanchar DomOnlyPrinter::ID = 0;
18219bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanINITIALIZE_PASS(DomOnlyPrinter, "dot-dom-only",
18319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                "Print dominance tree of function to 'dot' file "
18419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                "(with no function bodies)",
18519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                false, false)
18619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
18719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanchar PostDomPrinter::ID = 0;
18819bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanINITIALIZE_PASS(PostDomPrinter, "dot-postdom",
18919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                "Print postdominance tree of function to 'dot' file",
19019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                false, false)
19119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
19219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Baumanchar PostDomOnlyPrinter::ID = 0;
19319bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanINITIALIZE_PASS(PostDomOnlyPrinter, "dot-postdom-only",
19419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                "Print postdominance tree of function to 'dot' file "
19519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                "(with no function bodies)",
19619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman                false, false)
19719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
19819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// Create methods available outside of this file, to use them
19919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by
20019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman// the link time optimization.
20119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
20219bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanFunctionPass *llvm::createDomPrinterPass() {
20319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return new DomPrinter();
20419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
20519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
20619bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanFunctionPass *llvm::createDomOnlyPrinterPass() {
20719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return new DomOnlyPrinter();
20819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
20919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
21019bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanFunctionPass *llvm::createDomViewerPass() {
21119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return new DomViewer();
21219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
21319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
21419bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanFunctionPass *llvm::createDomOnlyViewerPass() {
21519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return new DomOnlyViewer();
21619bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
21719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
21819bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanFunctionPass *llvm::createPostDomPrinterPass() {
21919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return new PostDomPrinter();
22019bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
22119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
22219bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanFunctionPass *llvm::createPostDomOnlyPrinterPass() {
22319bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return new PostDomOnlyPrinter();
22419bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
22519bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
22619bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanFunctionPass *llvm::createPostDomViewerPass() {
22719bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return new PostDomViewer();
22819bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
22919bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman
23019bac1e08be200c31efd26f0f5fd144c9b3eefd3John BaumanFunctionPass *llvm::createPostDomOnlyViewerPass() {
23119bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman  return new PostDomOnlyViewer();
23219bac1e08be200c31efd26f0f5fd144c9b3eefd3John Bauman}
233