Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 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 | |||
22 | namespace llvm { |
||
23 | |||
24 | template <> |
||
25 | struct 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 | |||
43 | template <> |
||
44 | struct 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 | |||
60 | template<> |
||
61 | struct 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 | |||
77 | struct DomViewer final : DOTGraphTraitsViewer<DominatorTreeAnalysis, false> { |
||
78 | DomViewer() : DOTGraphTraitsViewer<DominatorTreeAnalysis, false>("dom") {} |
||
79 | }; |
||
80 | |||
81 | struct DomOnlyViewer final : DOTGraphTraitsViewer<DominatorTreeAnalysis, true> { |
||
82 | DomOnlyViewer() |
||
83 | : DOTGraphTraitsViewer<DominatorTreeAnalysis, true>("domonly") {} |
||
84 | }; |
||
85 | |||
86 | struct PostDomViewer final |
||
87 | : DOTGraphTraitsViewer<PostDominatorTreeAnalysis, false> { |
||
88 | PostDomViewer() |
||
89 | : DOTGraphTraitsViewer<PostDominatorTreeAnalysis, false>("postdom") {} |
||
90 | }; |
||
91 | |||
92 | struct PostDomOnlyViewer final |
||
93 | : DOTGraphTraitsViewer<PostDominatorTreeAnalysis, true> { |
||
94 | PostDomOnlyViewer() |
||
95 | : DOTGraphTraitsViewer<PostDominatorTreeAnalysis, true>("postdomonly") {} |
||
96 | }; |
||
97 | |||
98 | struct DomPrinter final : DOTGraphTraitsPrinter<DominatorTreeAnalysis, false> { |
||
99 | DomPrinter() : DOTGraphTraitsPrinter<DominatorTreeAnalysis, false>("dom") {} |
||
100 | }; |
||
101 | |||
102 | struct DomOnlyPrinter final |
||
103 | : DOTGraphTraitsPrinter<DominatorTreeAnalysis, true> { |
||
104 | DomOnlyPrinter() |
||
105 | : DOTGraphTraitsPrinter<DominatorTreeAnalysis, true>("domonly") {} |
||
106 | }; |
||
107 | |||
108 | struct PostDomPrinter final |
||
109 | : DOTGraphTraitsPrinter<PostDominatorTreeAnalysis, false> { |
||
110 | PostDomPrinter() |
||
111 | : DOTGraphTraitsPrinter<PostDominatorTreeAnalysis, false>("postdom") {} |
||
112 | }; |
||
113 | |||
114 | struct PostDomOnlyPrinter final |
||
115 | : DOTGraphTraitsPrinter<PostDominatorTreeAnalysis, true> { |
||
116 | PostDomOnlyPrinter() |
||
117 | : DOTGraphTraitsPrinter<PostDominatorTreeAnalysis, true>("postdomonly") {} |
||
118 | }; |
||
119 | } // namespace llvm |
||
120 | |||
121 | namespace 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 |