1//===-- DomPrinter.h - Dom printer external interface ------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file defines external functions that can be called to explicitly
10// instantiate the dominance tree printer.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_ANALYSIS_DOMPRINTER_H
15#define LLVM_ANALYSIS_DOMPRINTER_H
16
17#include "llvm/Analysis/DOTGraphTraitsPass.h"
18#include "llvm/Analysis/PostDominators.h"
19#include "llvm/IR/Dominators.h"
20#include "llvm/IR/PassManager.h"
21
22namespace llvm {
23
24template <>
25struct DOTGraphTraits<DomTreeNode *> : public DefaultDOTGraphTraits {
26
27  DOTGraphTraits(bool isSimple = false) : DefaultDOTGraphTraits(isSimple) {}
28
29  std::string getNodeLabel(DomTreeNode *Node, DomTreeNode *Graph) {
30
31    BasicBlock *BB = Node->getBlock();
32
33    if (!BB)
34      return "Post dominance root node";
35
36    if (isSimple())
37      return DOTGraphTraits<DOTFuncInfo *>::getSimpleNodeLabel(BB, nullptr);
38
39    return DOTGraphTraits<DOTFuncInfo *>::getCompleteNodeLabel(BB, nullptr);
40  }
41};
42
43template <>
44struct DOTGraphTraits<DominatorTree *>
45    : public DOTGraphTraits<DomTreeNode *> {
46
47  DOTGraphTraits(bool isSimple = false)
48      : DOTGraphTraits<DomTreeNode *>(isSimple) {}
49
50  static std::string getGraphName(DominatorTree *DT) {
51    return "Dominator tree";
52  }
53
54  std::string getNodeLabel(DomTreeNode *Node, DominatorTree *G) {
55    return DOTGraphTraits<DomTreeNode *>::getNodeLabel(Node,
56                                                             G->getRootNode());
57  }
58};
59
60template<>
61struct DOTGraphTraits<PostDominatorTree *>
62  : public DOTGraphTraits<DomTreeNode*> {
63
64  DOTGraphTraits (bool isSimple=false)
65    : DOTGraphTraits<DomTreeNode*>(isSimple) {}
66
67  static std::string getGraphName(PostDominatorTree *DT) {
68    return "Post dominator tree";
69  }
70
71  std::string getNodeLabel(DomTreeNode *Node,
72                           PostDominatorTree *G) {
73    return DOTGraphTraits<DomTreeNode*>::getNodeLabel(Node, G->getRootNode());
74  }
75};
76
77struct DomViewer final : DOTGraphTraitsViewer<DominatorTreeAnalysis, false> {
78  DomViewer() : DOTGraphTraitsViewer<DominatorTreeAnalysis, false>("dom") {}
79};
80
81struct DomOnlyViewer final : DOTGraphTraitsViewer<DominatorTreeAnalysis, true> {
82  DomOnlyViewer()
83      : DOTGraphTraitsViewer<DominatorTreeAnalysis, true>("domonly") {}
84};
85
86struct PostDomViewer final
87    : DOTGraphTraitsViewer<PostDominatorTreeAnalysis, false> {
88  PostDomViewer()
89      : DOTGraphTraitsViewer<PostDominatorTreeAnalysis, false>("postdom") {}
90};
91
92struct PostDomOnlyViewer final
93    : DOTGraphTraitsViewer<PostDominatorTreeAnalysis, true> {
94  PostDomOnlyViewer()
95      : DOTGraphTraitsViewer<PostDominatorTreeAnalysis, true>("postdomonly") {}
96};
97
98struct DomPrinter final : DOTGraphTraitsPrinter<DominatorTreeAnalysis, false> {
99  DomPrinter() : DOTGraphTraitsPrinter<DominatorTreeAnalysis, false>("dom") {}
100};
101
102struct DomOnlyPrinter final
103    : DOTGraphTraitsPrinter<DominatorTreeAnalysis, true> {
104  DomOnlyPrinter()
105      : DOTGraphTraitsPrinter<DominatorTreeAnalysis, true>("domonly") {}
106};
107
108struct PostDomPrinter final
109    : DOTGraphTraitsPrinter<PostDominatorTreeAnalysis, false> {
110  PostDomPrinter()
111      : DOTGraphTraitsPrinter<PostDominatorTreeAnalysis, false>("postdom") {}
112};
113
114struct PostDomOnlyPrinter final
115    : DOTGraphTraitsPrinter<PostDominatorTreeAnalysis, true> {
116  PostDomOnlyPrinter()
117      : DOTGraphTraitsPrinter<PostDominatorTreeAnalysis, true>("postdomonly") {}
118};
119} // namespace llvm
120
121namespace llvm {
122  class FunctionPass;
123  FunctionPass *createDomPrinterWrapperPassPass();
124  FunctionPass *createDomOnlyPrinterWrapperPassPass();
125  FunctionPass *createDomViewerWrapperPassPass();
126  FunctionPass *createDomOnlyViewerWrapperPassPass();
127  FunctionPass *createPostDomPrinterWrapperPassPass();
128  FunctionPass *createPostDomOnlyPrinterWrapperPassPass();
129  FunctionPass *createPostDomViewerWrapperPassPass();
130  FunctionPass *createPostDomOnlyViewerWrapperPassPass();
131} // End llvm namespace
132
133#endif
134