19e6882c8SChris Lattner //===- DomPrinter.cpp - DOT printer for the dominance trees    ------------===//
29e6882c8SChris Lattner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
69e6882c8SChris Lattner //
79e6882c8SChris Lattner //===----------------------------------------------------------------------===//
89e6882c8SChris Lattner //
99e6882c8SChris Lattner // This file defines '-dot-dom' and '-dot-postdom' analysis passes, which emit
109e6882c8SChris Lattner // a dom.<fnname>.dot or postdom.<fnname>.dot file for each function in the
119e6882c8SChris Lattner // program, with a graph of the dominance/postdominance tree of that
129e6882c8SChris Lattner // function.
139e6882c8SChris Lattner //
149e6882c8SChris Lattner // There are also passes available to directly call dotty ('-view-dom' or
159e6882c8SChris Lattner // '-view-postdom'). By appending '-only' like '-dot-dom-only' only the
169e6882c8SChris Lattner // names of the bbs are printed, but the content is hidden.
179e6882c8SChris Lattner //
189e6882c8SChris Lattner //===----------------------------------------------------------------------===//
199e6882c8SChris Lattner 
209e6882c8SChris Lattner #include "llvm/Analysis/DomPrinter.h"
2153da3f8dSTobias Grosser #include "llvm/Analysis/DOTGraphTraitsPass.h"
229e6882c8SChris Lattner #include "llvm/Analysis/PostDominators.h"
2305da2fe5SReid Kleckner #include "llvm/InitializePasses.h"
249e6882c8SChris Lattner 
259e6882c8SChris Lattner using namespace llvm;
269e6882c8SChris Lattner 
27524abc68SDaniil Suchkov 
viewGraph(const Twine & Name,const Twine & Title)28ebd77645SDavide Italiano void DominatorTree::viewGraph(const Twine &Name, const Twine &Title) {
29ebd77645SDavide Italiano #ifndef NDEBUG
30ebd77645SDavide Italiano   ViewGraph(this, Name, false, Title);
31ebd77645SDavide Italiano #else
32ebd77645SDavide Italiano   errs() << "DomTree dump not available, build with DEBUG\n";
33ebd77645SDavide Italiano #endif  // NDEBUG
34ebd77645SDavide Italiano }
35ebd77645SDavide Italiano 
viewGraph()36ebd77645SDavide Italiano void DominatorTree::viewGraph() {
37ebd77645SDavide Italiano #ifndef NDEBUG
38ebd77645SDavide Italiano   this->viewGraph("domtree", "Dominator Tree for function");
39ebd77645SDavide Italiano #else
40ebd77645SDavide Italiano   errs() << "DomTree dump not available, build with DEBUG\n";
41ebd77645SDavide Italiano #endif  // NDEBUG
42ebd77645SDavide Italiano }
43ebd77645SDavide Italiano 
449e6882c8SChris Lattner namespace {
45*7dce9eb6SYang Keao struct LegacyDominatorTreeWrapperPassAnalysisGraphTraits {
getGraph__anondbd8c8b70111::LegacyDominatorTreeWrapperPassAnalysisGraphTraits4673523021SChandler Carruth   static DominatorTree *getGraph(DominatorTreeWrapperPass *DTWP) {
4773523021SChandler Carruth     return &DTWP->getDomTree();
4873523021SChandler Carruth   }
4973523021SChandler Carruth };
5073523021SChandler Carruth 
51*7dce9eb6SYang Keao struct DomViewerWrapperPass
52*7dce9eb6SYang Keao     : public DOTGraphTraitsViewerWrapperPass<
5373523021SChandler Carruth           DominatorTreeWrapperPass, false, DominatorTree *,
54*7dce9eb6SYang Keao           LegacyDominatorTreeWrapperPassAnalysisGraphTraits> {
559e6882c8SChris Lattner   static char ID;
DomViewerWrapperPass__anondbd8c8b70111::DomViewerWrapperPass56*7dce9eb6SYang Keao   DomViewerWrapperPass()
57a6b399adSMichael Kruse       : DOTGraphTraitsViewerWrapperPass<
58a6b399adSMichael Kruse             DominatorTreeWrapperPass, false, DominatorTree *,
59*7dce9eb6SYang Keao             LegacyDominatorTreeWrapperPassAnalysisGraphTraits>("dom", ID) {
60*7dce9eb6SYang Keao     initializeDomViewerWrapperPassPass(*PassRegistry::getPassRegistry());
616c18d1aaSOwen Anderson   }
629e6882c8SChris Lattner };
639e6882c8SChris Lattner 
64*7dce9eb6SYang Keao struct DomOnlyViewerWrapperPass
65*7dce9eb6SYang Keao     : public DOTGraphTraitsViewerWrapperPass<
6673523021SChandler Carruth           DominatorTreeWrapperPass, true, DominatorTree *,
67*7dce9eb6SYang Keao           LegacyDominatorTreeWrapperPassAnalysisGraphTraits> {
689e6882c8SChris Lattner   static char ID;
DomOnlyViewerWrapperPass__anondbd8c8b70111::DomOnlyViewerWrapperPass69*7dce9eb6SYang Keao   DomOnlyViewerWrapperPass()
70a6b399adSMichael Kruse       : DOTGraphTraitsViewerWrapperPass<
71a6b399adSMichael Kruse             DominatorTreeWrapperPass, true, DominatorTree *,
72*7dce9eb6SYang Keao             LegacyDominatorTreeWrapperPassAnalysisGraphTraits>("domonly", ID) {
73*7dce9eb6SYang Keao     initializeDomOnlyViewerWrapperPassPass(*PassRegistry::getPassRegistry());
746c18d1aaSOwen Anderson   }
759e6882c8SChris Lattner };
769e6882c8SChris Lattner 
77*7dce9eb6SYang Keao struct LegacyPostDominatorTreeWrapperPassAnalysisGraphTraits {
getGraph__anondbd8c8b70111::LegacyPostDominatorTreeWrapperPassAnalysisGraphTraits783f978407SHongbin Zheng   static PostDominatorTree *getGraph(PostDominatorTreeWrapperPass *PDTWP) {
793f978407SHongbin Zheng     return &PDTWP->getPostDomTree();
803f978407SHongbin Zheng   }
813f978407SHongbin Zheng };
823f978407SHongbin Zheng 
83*7dce9eb6SYang Keao struct PostDomViewerWrapperPass
84a6b399adSMichael Kruse     : public DOTGraphTraitsViewerWrapperPass<
85a6b399adSMichael Kruse           PostDominatorTreeWrapperPass, false, PostDominatorTree *,
86*7dce9eb6SYang Keao           LegacyPostDominatorTreeWrapperPassAnalysisGraphTraits> {
879e6882c8SChris Lattner   static char ID;
PostDomViewerWrapperPass__anondbd8c8b70111::PostDomViewerWrapperPass88*7dce9eb6SYang Keao   PostDomViewerWrapperPass()
89a6b399adSMichael Kruse       : DOTGraphTraitsViewerWrapperPass<
90a6b399adSMichael Kruse             PostDominatorTreeWrapperPass, false, PostDominatorTree *,
91*7dce9eb6SYang Keao             LegacyPostDominatorTreeWrapperPassAnalysisGraphTraits>("postdom",
92*7dce9eb6SYang Keao                                                                    ID) {
93*7dce9eb6SYang Keao     initializePostDomViewerWrapperPassPass(*PassRegistry::getPassRegistry());
946c18d1aaSOwen Anderson   }
959e6882c8SChris Lattner };
969e6882c8SChris Lattner 
97*7dce9eb6SYang Keao struct PostDomOnlyViewerWrapperPass
98a6b399adSMichael Kruse     : public DOTGraphTraitsViewerWrapperPass<
99a6b399adSMichael Kruse           PostDominatorTreeWrapperPass, true, PostDominatorTree *,
100*7dce9eb6SYang Keao           LegacyPostDominatorTreeWrapperPassAnalysisGraphTraits> {
1019e6882c8SChris Lattner   static char ID;
PostDomOnlyViewerWrapperPass__anondbd8c8b70111::PostDomOnlyViewerWrapperPass102*7dce9eb6SYang Keao   PostDomOnlyViewerWrapperPass()
103a6b399adSMichael Kruse       : DOTGraphTraitsViewerWrapperPass<
104a6b399adSMichael Kruse             PostDominatorTreeWrapperPass, true, PostDominatorTree *,
105*7dce9eb6SYang Keao             LegacyPostDominatorTreeWrapperPassAnalysisGraphTraits>(
106*7dce9eb6SYang Keao             "postdomonly", ID) {
107*7dce9eb6SYang Keao     initializePostDomOnlyViewerWrapperPassPass(
108*7dce9eb6SYang Keao         *PassRegistry::getPassRegistry());
1096c18d1aaSOwen Anderson   }
1109e6882c8SChris Lattner };
1119e6882c8SChris Lattner } // end anonymous namespace
1129e6882c8SChris Lattner 
113*7dce9eb6SYang Keao char DomViewerWrapperPass::ID = 0;
114*7dce9eb6SYang Keao INITIALIZE_PASS(DomViewerWrapperPass, "view-dom",
115df7a4f25SOwen Anderson                 "View dominance tree of function", false, false)
1169e6882c8SChris Lattner 
117*7dce9eb6SYang Keao char DomOnlyViewerWrapperPass::ID = 0;
118*7dce9eb6SYang Keao INITIALIZE_PASS(DomOnlyViewerWrapperPass, "view-dom-only",
119a57b97e7SOwen Anderson                 "View dominance tree of function (with no function bodies)",
120df7a4f25SOwen Anderson                 false, false)
1219e6882c8SChris Lattner 
122*7dce9eb6SYang Keao char PostDomViewerWrapperPass::ID = 0;
123*7dce9eb6SYang Keao INITIALIZE_PASS(PostDomViewerWrapperPass, "view-postdom",
124df7a4f25SOwen Anderson                 "View postdominance tree of function", false, false)
1259e6882c8SChris Lattner 
126*7dce9eb6SYang Keao char PostDomOnlyViewerWrapperPass::ID = 0;
127*7dce9eb6SYang Keao INITIALIZE_PASS(PostDomOnlyViewerWrapperPass, "view-postdom-only",
1289e6882c8SChris Lattner                 "View postdominance tree of function "
129a57b97e7SOwen Anderson                 "(with no function bodies)",
130df7a4f25SOwen Anderson                 false, false)
1319e6882c8SChris Lattner 
1329e6882c8SChris Lattner namespace {
133*7dce9eb6SYang Keao struct DomPrinterWrapperPass
134*7dce9eb6SYang Keao     : public DOTGraphTraitsPrinterWrapperPass<
13573523021SChandler Carruth           DominatorTreeWrapperPass, false, DominatorTree *,
136*7dce9eb6SYang Keao           LegacyDominatorTreeWrapperPassAnalysisGraphTraits> {
1379e6882c8SChris Lattner   static char ID;
DomPrinterWrapperPass__anondbd8c8b70211::DomPrinterWrapperPass138*7dce9eb6SYang Keao   DomPrinterWrapperPass()
139a6b399adSMichael Kruse       : DOTGraphTraitsPrinterWrapperPass<
140a6b399adSMichael Kruse             DominatorTreeWrapperPass, false, DominatorTree *,
141*7dce9eb6SYang Keao             LegacyDominatorTreeWrapperPassAnalysisGraphTraits>("dom", ID) {
142*7dce9eb6SYang Keao     initializeDomPrinterWrapperPassPass(*PassRegistry::getPassRegistry());
1436c18d1aaSOwen Anderson   }
1449e6882c8SChris Lattner };
1459e6882c8SChris Lattner 
146*7dce9eb6SYang Keao struct DomOnlyPrinterWrapperPass
147*7dce9eb6SYang Keao     : public DOTGraphTraitsPrinterWrapperPass<
14873523021SChandler Carruth           DominatorTreeWrapperPass, true, DominatorTree *,
149*7dce9eb6SYang Keao           LegacyDominatorTreeWrapperPassAnalysisGraphTraits> {
1509e6882c8SChris Lattner   static char ID;
DomOnlyPrinterWrapperPass__anondbd8c8b70211::DomOnlyPrinterWrapperPass151*7dce9eb6SYang Keao   DomOnlyPrinterWrapperPass()
152a6b399adSMichael Kruse       : DOTGraphTraitsPrinterWrapperPass<
153a6b399adSMichael Kruse             DominatorTreeWrapperPass, true, DominatorTree *,
154*7dce9eb6SYang Keao             LegacyDominatorTreeWrapperPassAnalysisGraphTraits>("domonly", ID) {
155*7dce9eb6SYang Keao     initializeDomOnlyPrinterWrapperPassPass(*PassRegistry::getPassRegistry());
1566c18d1aaSOwen Anderson   }
1579e6882c8SChris Lattner };
1589e6882c8SChris Lattner 
159*7dce9eb6SYang Keao struct PostDomPrinterWrapperPass
160a6b399adSMichael Kruse     : public DOTGraphTraitsPrinterWrapperPass<
161a6b399adSMichael Kruse           PostDominatorTreeWrapperPass, false, PostDominatorTree *,
162*7dce9eb6SYang Keao           LegacyPostDominatorTreeWrapperPassAnalysisGraphTraits> {
1639e6882c8SChris Lattner   static char ID;
PostDomPrinterWrapperPass__anondbd8c8b70211::PostDomPrinterWrapperPass164*7dce9eb6SYang Keao   PostDomPrinterWrapperPass()
165a6b399adSMichael Kruse       : DOTGraphTraitsPrinterWrapperPass<
166a6b399adSMichael Kruse             PostDominatorTreeWrapperPass, false, PostDominatorTree *,
167*7dce9eb6SYang Keao             LegacyPostDominatorTreeWrapperPassAnalysisGraphTraits>("postdom",
168a6b399adSMichael Kruse                                                                    ID) {
169*7dce9eb6SYang Keao     initializePostDomPrinterWrapperPassPass(*PassRegistry::getPassRegistry());
170*7dce9eb6SYang Keao   }
171*7dce9eb6SYang Keao };
172*7dce9eb6SYang Keao 
173*7dce9eb6SYang Keao struct PostDomOnlyPrinterWrapperPass
174*7dce9eb6SYang Keao     : public DOTGraphTraitsPrinterWrapperPass<
175*7dce9eb6SYang Keao           PostDominatorTreeWrapperPass, true, PostDominatorTree *,
176*7dce9eb6SYang Keao           LegacyPostDominatorTreeWrapperPassAnalysisGraphTraits> {
177*7dce9eb6SYang Keao   static char ID;
PostDomOnlyPrinterWrapperPass__anondbd8c8b70211::PostDomOnlyPrinterWrapperPass178*7dce9eb6SYang Keao   PostDomOnlyPrinterWrapperPass()
179*7dce9eb6SYang Keao       : DOTGraphTraitsPrinterWrapperPass<
180*7dce9eb6SYang Keao             PostDominatorTreeWrapperPass, true, PostDominatorTree *,
181*7dce9eb6SYang Keao             LegacyPostDominatorTreeWrapperPassAnalysisGraphTraits>(
182*7dce9eb6SYang Keao             "postdomonly", ID) {
183*7dce9eb6SYang Keao     initializePostDomOnlyPrinterWrapperPassPass(
184*7dce9eb6SYang Keao         *PassRegistry::getPassRegistry());
1856c18d1aaSOwen Anderson   }
1869e6882c8SChris Lattner };
1879e6882c8SChris Lattner } // end anonymous namespace
1889e6882c8SChris Lattner 
189*7dce9eb6SYang Keao char DomPrinterWrapperPass::ID = 0;
190*7dce9eb6SYang Keao INITIALIZE_PASS(DomPrinterWrapperPass, "dot-dom",
191*7dce9eb6SYang Keao                 "Print dominance tree of function to 'dot' file", false, false)
1929e6882c8SChris Lattner 
193*7dce9eb6SYang Keao char DomOnlyPrinterWrapperPass::ID = 0;
194*7dce9eb6SYang Keao INITIALIZE_PASS(DomOnlyPrinterWrapperPass, "dot-dom-only",
195a57b97e7SOwen Anderson                 "Print dominance tree of function to 'dot' file "
196a57b97e7SOwen Anderson                 "(with no function bodies)",
197df7a4f25SOwen Anderson                 false, false)
1989e6882c8SChris Lattner 
199*7dce9eb6SYang Keao char PostDomPrinterWrapperPass::ID = 0;
200*7dce9eb6SYang Keao INITIALIZE_PASS(PostDomPrinterWrapperPass, "dot-postdom",
201*7dce9eb6SYang Keao                 "Print postdominance tree of function to 'dot' file", false,
202*7dce9eb6SYang Keao                 false)
2039e6882c8SChris Lattner 
204*7dce9eb6SYang Keao char PostDomOnlyPrinterWrapperPass::ID = 0;
205*7dce9eb6SYang Keao INITIALIZE_PASS(PostDomOnlyPrinterWrapperPass, "dot-postdom-only",
206a57b97e7SOwen Anderson                 "Print postdominance tree of function to 'dot' file "
207a57b97e7SOwen Anderson                 "(with no function bodies)",
208df7a4f25SOwen Anderson                 false, false)
2099e6882c8SChris Lattner 
210e2024d72SArthur Eubanks // Create methods available outside of this file, to use them
211e2024d72SArthur Eubanks // "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by
212e2024d72SArthur Eubanks // the link time optimization.
213e2024d72SArthur Eubanks 
createDomPrinterWrapperPassPass()214*7dce9eb6SYang Keao FunctionPass *llvm::createDomPrinterWrapperPassPass() {
215*7dce9eb6SYang Keao   return new DomPrinterWrapperPass();
2169e6882c8SChris Lattner }
2179e6882c8SChris Lattner 
createDomOnlyPrinterWrapperPassPass()218*7dce9eb6SYang Keao FunctionPass *llvm::createDomOnlyPrinterWrapperPassPass() {
219*7dce9eb6SYang Keao   return new DomOnlyPrinterWrapperPass();
2209e6882c8SChris Lattner }
2219e6882c8SChris Lattner 
createDomViewerWrapperPassPass()222*7dce9eb6SYang Keao FunctionPass *llvm::createDomViewerWrapperPassPass() {
223*7dce9eb6SYang Keao   return new DomViewerWrapperPass();
2249e6882c8SChris Lattner }
2259e6882c8SChris Lattner 
createDomOnlyViewerWrapperPassPass()226*7dce9eb6SYang Keao FunctionPass *llvm::createDomOnlyViewerWrapperPassPass() {
227*7dce9eb6SYang Keao   return new DomOnlyViewerWrapperPass();
2289e6882c8SChris Lattner }
2299e6882c8SChris Lattner 
createPostDomPrinterWrapperPassPass()230*7dce9eb6SYang Keao FunctionPass *llvm::createPostDomPrinterWrapperPassPass() {
231*7dce9eb6SYang Keao   return new PostDomPrinterWrapperPass();
2329e6882c8SChris Lattner }
2339e6882c8SChris Lattner 
createPostDomOnlyPrinterWrapperPassPass()234*7dce9eb6SYang Keao FunctionPass *llvm::createPostDomOnlyPrinterWrapperPassPass() {
235*7dce9eb6SYang Keao   return new PostDomOnlyPrinterWrapperPass();
2369e6882c8SChris Lattner }
2379e6882c8SChris Lattner 
createPostDomViewerWrapperPassPass()238*7dce9eb6SYang Keao FunctionPass *llvm::createPostDomViewerWrapperPassPass() {
239*7dce9eb6SYang Keao   return new PostDomViewerWrapperPass();
2409e6882c8SChris Lattner }
2419e6882c8SChris Lattner 
createPostDomOnlyViewerWrapperPassPass()242*7dce9eb6SYang Keao FunctionPass *llvm::createPostDomOnlyViewerWrapperPassPass() {
243*7dce9eb6SYang Keao   return new PostDomOnlyViewerWrapperPass();
2449e6882c8SChris Lattner }
245