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(Node: BB, nullptr);
38
39 return DOTGraphTraits<DOTFuncInfo *>::getCompleteNodeLabel(Node: 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 Graph: 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, Graph: 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

source code of llvm/include/llvm/Analysis/DomPrinter.h