LLVM 22.0.0git
DomPrinter.cpp
Go to the documentation of this file.
1//===- DomPrinter.cpp - DOT printer for the dominance trees ------------===//
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 '-dot-dom' and '-dot-postdom' analysis passes, which emit
10// a dom.<fnname>.dot or postdom.<fnname>.dot file for each function in the
11// program, with a graph of the dominance/postdominance tree of that
12// function.
13//
14// There are also passes available to directly call dotty ('-view-dom' or
15// '-view-postdom'). By appending '-only' like '-dot-dom-only' only the
16// names of the bbs are printed, but the content is hidden.
17//
18//===----------------------------------------------------------------------===//
19
24
25using namespace llvm;
26
27
28void DominatorTree::viewGraph(const Twine &Name, const Twine &Title) {
29#ifndef NDEBUG
30 ViewGraph(this, Name, false, Title);
31#else
32 errs() << "DomTree dump not available, build with DEBUG\n";
33#endif // NDEBUG
34}
35
37#ifndef NDEBUG
38 this->viewGraph("domtree", "Dominator Tree for function");
39#else
40 errs() << "DomTree dump not available, build with DEBUG\n";
41#endif // NDEBUG
42}
43
44namespace {
45struct LegacyDominatorTreeWrapperPassAnalysisGraphTraits {
46 static DominatorTree *getGraph(DominatorTreeWrapperPass *DTWP) {
47 return &DTWP->getDomTree();
48 }
49};
50
51struct DomViewerWrapperPass
53 DominatorTreeWrapperPass, false, DominatorTree *,
54 LegacyDominatorTreeWrapperPassAnalysisGraphTraits> {
55 static char ID;
56 DomViewerWrapperPass()
59 LegacyDominatorTreeWrapperPassAnalysisGraphTraits>("dom", ID) {}
60};
61
62struct DomOnlyViewerWrapperPass
64 DominatorTreeWrapperPass, true, DominatorTree *,
65 LegacyDominatorTreeWrapperPassAnalysisGraphTraits> {
66 static char ID;
67 DomOnlyViewerWrapperPass()
70 LegacyDominatorTreeWrapperPassAnalysisGraphTraits>("domonly", ID) {}
71};
72
73struct LegacyPostDominatorTreeWrapperPassAnalysisGraphTraits {
74 static PostDominatorTree *getGraph(PostDominatorTreeWrapperPass *PDTWP) {
75 return &PDTWP->getPostDomTree();
76 }
77};
78
79struct PostDomViewerWrapperPass
81 PostDominatorTreeWrapperPass, false, PostDominatorTree *,
82 LegacyPostDominatorTreeWrapperPassAnalysisGraphTraits> {
83 static char ID;
84 PostDomViewerWrapperPass()
87 LegacyPostDominatorTreeWrapperPassAnalysisGraphTraits>("postdom",
88 ID) {}
89};
90
91struct PostDomOnlyViewerWrapperPass
93 PostDominatorTreeWrapperPass, true, PostDominatorTree *,
94 LegacyPostDominatorTreeWrapperPassAnalysisGraphTraits> {
95 static char ID;
96 PostDomOnlyViewerWrapperPass()
99 LegacyPostDominatorTreeWrapperPassAnalysisGraphTraits>(
100 "postdomonly", ID) {}
101};
102} // end anonymous namespace
103
104char DomViewerWrapperPass::ID = 0;
105INITIALIZE_PASS(DomViewerWrapperPass, "view-dom",
106 "View dominance tree of function", false, false)
107
108char DomOnlyViewerWrapperPass::ID = 0;
109INITIALIZE_PASS(DomOnlyViewerWrapperPass, "view-dom-only",
110 "View dominance tree of function (with no function bodies)",
111 false, false)
112
113char PostDomViewerWrapperPass::ID = 0;
114INITIALIZE_PASS(PostDomViewerWrapperPass, "view-postdom",
115 "View postdominance tree of function", false, false)
116
117char PostDomOnlyViewerWrapperPass::ID = 0;
118INITIALIZE_PASS(PostDomOnlyViewerWrapperPass, "view-postdom-only",
119 "View postdominance tree of function "
120 "(with no function bodies)",
121 false, false)
122
123namespace {
124struct DomPrinterWrapperPass
126 DominatorTreeWrapperPass, false, DominatorTree *,
127 LegacyDominatorTreeWrapperPassAnalysisGraphTraits> {
128 static char ID;
129 DomPrinterWrapperPass()
132 LegacyDominatorTreeWrapperPassAnalysisGraphTraits>("dom", ID) {}
133};
134
135struct DomOnlyPrinterWrapperPass
137 DominatorTreeWrapperPass, true, DominatorTree *,
138 LegacyDominatorTreeWrapperPassAnalysisGraphTraits> {
139 static char ID;
140 DomOnlyPrinterWrapperPass()
143 LegacyDominatorTreeWrapperPassAnalysisGraphTraits>("domonly", ID) {}
144};
145
146struct PostDomPrinterWrapperPass
148 PostDominatorTreeWrapperPass, false, PostDominatorTree *,
149 LegacyPostDominatorTreeWrapperPassAnalysisGraphTraits> {
150 static char ID;
151 PostDomPrinterWrapperPass()
154 LegacyPostDominatorTreeWrapperPassAnalysisGraphTraits>("postdom",
155 ID) {}
156};
157
158struct PostDomOnlyPrinterWrapperPass
160 PostDominatorTreeWrapperPass, true, PostDominatorTree *,
161 LegacyPostDominatorTreeWrapperPassAnalysisGraphTraits> {
162 static char ID;
163 PostDomOnlyPrinterWrapperPass()
166 LegacyPostDominatorTreeWrapperPassAnalysisGraphTraits>(
167 "postdomonly", ID) {}
168};
169} // end anonymous namespace
170
171char DomPrinterWrapperPass::ID = 0;
172INITIALIZE_PASS(DomPrinterWrapperPass, "dot-dom",
173 "Print dominance tree of function to 'dot' file", false, false)
174
175char DomOnlyPrinterWrapperPass::ID = 0;
176INITIALIZE_PASS(DomOnlyPrinterWrapperPass, "dot-dom-only",
177 "Print dominance tree of function to 'dot' file "
178 "(with no function bodies)",
179 false, false)
180
181char PostDomPrinterWrapperPass::ID = 0;
182INITIALIZE_PASS(PostDomPrinterWrapperPass, "dot-postdom",
183 "Print postdominance tree of function to 'dot' file", false,
184 false)
185
186char PostDomOnlyPrinterWrapperPass::ID = 0;
187INITIALIZE_PASS(PostDomOnlyPrinterWrapperPass, "dot-postdom-only",
188 "Print postdominance tree of function to 'dot' file "
189 "(with no function bodies)",
190 false, false)
191
192// Create methods available outside of this file, to use them
193// "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by
194// the link time optimization.
195
197 return new DomPrinterWrapperPass();
198}
199
201 return new DomOnlyPrinterWrapperPass();
202}
203
205 return new DomViewerWrapperPass();
206}
207
209 return new DomOnlyViewerWrapperPass();
210}
211
213 return new PostDomPrinterWrapperPass();
214}
215
217 return new PostDomOnlyPrinterWrapperPass();
218}
219
221 return new PostDomViewerWrapperPass();
222}
223
225 return new PostDomOnlyViewerWrapperPass();
226}
Performs the initial survey of the specified function
std::string Name
#define INITIALIZE_PASS(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:56
dot regions only
dot regions Print regions of function to dot file(with no function bodies)"
Legacy analysis pass which computes a DominatorTree.
Definition: Dominators.h:322
DominatorTree & getDomTree()
Definition: Dominators.h:330
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Definition: Dominators.h:165
LLVM_ABI void viewGraph()
Definition: DomPrinter.cpp:36
FunctionPass class - This class is used to implement most global optimizations.
Definition: Pass.h:314
PostDominatorTree Class - Concrete subclass of DominatorTree that is used to compute the post-dominat...
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:82
TargetPassConfig.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition: CallingConv.h:24
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
LLVM_ABI FunctionPass * createDomOnlyPrinterWrapperPassPass()
Definition: DomPrinter.cpp:200
LLVM_ABI FunctionPass * createPostDomOnlyViewerWrapperPassPass()
Definition: DomPrinter.cpp:224
LLVM_ABI FunctionPass * createPostDomViewerWrapperPassPass()
Definition: DomPrinter.cpp:220
LLVM_ABI FunctionPass * createDomPrinterWrapperPassPass()
LLVM_ABI FunctionPass * createPostDomOnlyPrinterWrapperPassPass()
Definition: DomPrinter.cpp:216
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
LLVM_ABI FunctionPass * createDomOnlyViewerWrapperPassPass()
Definition: DomPrinter.cpp:208
void ViewGraph(const GraphType &G, const Twine &Name, bool ShortNames=false, const Twine &Title="", GraphProgram::Name Program=GraphProgram::DOT)
ViewGraph - Emit a dot graph, run 'dot', run gv on the postscript file, then cleanup.
Definition: GraphWriter.h:443
LLVM_ABI FunctionPass * createPostDomPrinterWrapperPassPass()
Definition: DomPrinter.cpp:212
LLVM_ABI FunctionPass * createDomViewerWrapperPassPass()
Definition: DomPrinter.cpp:204
PostDominatorTree & getPostDomTree()