blob: 70da6a43f8d997366473b12c3b6ba64f4d6b2fcb [file] [log] [blame]
Eli Benderskyb60f8382014-02-10 23:34:23 +00001//===- PassPrinters.cpp - Utilities to print analysis info for passes -----===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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
Eli Benderskyb60f8382014-02-10 23:34:23 +00006//
7//===----------------------------------------------------------------------===//
8///
9/// \file
Adrian Prantl5f8f34e42018-05-01 15:54:18 +000010/// Utilities to print analysis info for various kinds of passes.
Eli Benderskyb60f8382014-02-10 23:34:23 +000011///
12//===----------------------------------------------------------------------===//
Eugene Zelenkofa6434b2017-08-31 21:56:16 +000013
Eli Benderskyb60f8382014-02-10 23:34:23 +000014#include "PassPrinters.h"
Eugene Zelenkofa6434b2017-08-31 21:56:16 +000015#include "llvm/Analysis/CallGraph.h"
Eli Benderskyb60f8382014-02-10 23:34:23 +000016#include "llvm/Analysis/CallGraphSCCPass.h"
Eugene Zelenkofa6434b2017-08-31 21:56:16 +000017#include "llvm/Analysis/LoopInfo.h"
Eli Benderskyb60f8382014-02-10 23:34:23 +000018#include "llvm/Analysis/LoopPass.h"
Eugene Zelenkofa6434b2017-08-31 21:56:16 +000019#include "llvm/Analysis/RegionInfo.h"
Eli Benderskyb60f8382014-02-10 23:34:23 +000020#include "llvm/Analysis/RegionPass.h"
Eugene Zelenkofa6434b2017-08-31 21:56:16 +000021#include "llvm/IR/BasicBlock.h"
Eli Benderskyb60f8382014-02-10 23:34:23 +000022#include "llvm/IR/Function.h"
Chandler Carruth442f7842014-03-04 10:07:28 +000023#include "llvm/Pass.h"
Eugene Zelenkofa6434b2017-08-31 21:56:16 +000024#include "llvm/Support/raw_ostream.h"
Eli Benderskyb60f8382014-02-10 23:34:23 +000025#include <string>
26
27using namespace llvm;
28
29namespace {
30
31struct FunctionPassPrinter : public FunctionPass {
32 const PassInfo *PassToPrint;
33 raw_ostream &Out;
34 static char ID;
35 std::string PassName;
36 bool QuietPass;
37
38 FunctionPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet)
39 : FunctionPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) {
40 std::string PassToPrintName = PassToPrint->getPassName();
41 PassName = "FunctionPass Printer: " + PassToPrintName;
42 }
43
Craig Toppere56917c2014-03-08 08:27:28 +000044 bool runOnFunction(Function &F) override {
Eli Benderskyb60f8382014-02-10 23:34:23 +000045 if (!QuietPass)
46 Out << "Printing analysis '" << PassToPrint->getPassName()
47 << "' for function '" << F.getName() << "':\n";
48
49 // Get and print pass...
50 getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out, F.getParent());
51 return false;
52 }
53
Malcolm Parsons06ac79c2016-11-02 16:43:50 +000054 StringRef getPassName() const override { return PassName; }
Eli Benderskyb60f8382014-02-10 23:34:23 +000055
Craig Toppere56917c2014-03-08 08:27:28 +000056 void getAnalysisUsage(AnalysisUsage &AU) const override {
Eli Benderskyb60f8382014-02-10 23:34:23 +000057 AU.addRequiredID(PassToPrint->getTypeInfo());
58 AU.setPreservesAll();
59 }
60};
61
62char FunctionPassPrinter::ID = 0;
63
64struct CallGraphSCCPassPrinter : public CallGraphSCCPass {
65 static char ID;
66 const PassInfo *PassToPrint;
67 raw_ostream &Out;
68 std::string PassName;
69 bool QuietPass;
70
71 CallGraphSCCPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet)
72 : CallGraphSCCPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) {
73 std::string PassToPrintName = PassToPrint->getPassName();
74 PassName = "CallGraphSCCPass Printer: " + PassToPrintName;
75 }
76
Craig Toppere56917c2014-03-08 08:27:28 +000077 bool runOnSCC(CallGraphSCC &SCC) override {
Eli Benderskyb60f8382014-02-10 23:34:23 +000078 if (!QuietPass)
79 Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
80
81 // Get and print pass...
82 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
83 Function *F = (*I)->getFunction();
84 if (F)
85 getAnalysisID<Pass>(PassToPrint->getTypeInfo())
86 .print(Out, F->getParent());
87 }
88 return false;
89 }
90
Malcolm Parsons06ac79c2016-11-02 16:43:50 +000091 StringRef getPassName() const override { return PassName; }
Eli Benderskyb60f8382014-02-10 23:34:23 +000092
Craig Toppere56917c2014-03-08 08:27:28 +000093 void getAnalysisUsage(AnalysisUsage &AU) const override {
Eli Benderskyb60f8382014-02-10 23:34:23 +000094 AU.addRequiredID(PassToPrint->getTypeInfo());
95 AU.setPreservesAll();
96 }
97};
98
99char CallGraphSCCPassPrinter::ID = 0;
100
101struct ModulePassPrinter : public ModulePass {
102 static char ID;
103 const PassInfo *PassToPrint;
104 raw_ostream &Out;
105 std::string PassName;
106 bool QuietPass;
107
108 ModulePassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet)
109 : ModulePass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) {
110 std::string PassToPrintName = PassToPrint->getPassName();
111 PassName = "ModulePass Printer: " + PassToPrintName;
112 }
113
Craig Toppere56917c2014-03-08 08:27:28 +0000114 bool runOnModule(Module &M) override {
Eli Benderskyb60f8382014-02-10 23:34:23 +0000115 if (!QuietPass)
116 Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
117
118 // Get and print pass...
119 getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out, &M);
120 return false;
121 }
122
Malcolm Parsons06ac79c2016-11-02 16:43:50 +0000123 StringRef getPassName() const override { return PassName; }
Eli Benderskyb60f8382014-02-10 23:34:23 +0000124
Craig Toppere56917c2014-03-08 08:27:28 +0000125 void getAnalysisUsage(AnalysisUsage &AU) const override {
Eli Benderskyb60f8382014-02-10 23:34:23 +0000126 AU.addRequiredID(PassToPrint->getTypeInfo());
127 AU.setPreservesAll();
128 }
129};
130
131char ModulePassPrinter::ID = 0;
132
133struct LoopPassPrinter : public LoopPass {
134 static char ID;
135 const PassInfo *PassToPrint;
136 raw_ostream &Out;
137 std::string PassName;
138 bool QuietPass;
139
140 LoopPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet)
141 : LoopPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) {
142 std::string PassToPrintName = PassToPrint->getPassName();
143 PassName = "LoopPass Printer: " + PassToPrintName;
144 }
145
Craig Toppere56917c2014-03-08 08:27:28 +0000146 bool runOnLoop(Loop *L, LPPassManager &LPM) override {
Eli Benderskyb60f8382014-02-10 23:34:23 +0000147 if (!QuietPass)
148 Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
149
150 // Get and print pass...
151 getAnalysisID<Pass>(PassToPrint->getTypeInfo())
152 .print(Out, L->getHeader()->getParent()->getParent());
153 return false;
154 }
155
Malcolm Parsons06ac79c2016-11-02 16:43:50 +0000156 StringRef getPassName() const override { return PassName; }
Eli Benderskyb60f8382014-02-10 23:34:23 +0000157
Craig Toppere56917c2014-03-08 08:27:28 +0000158 void getAnalysisUsage(AnalysisUsage &AU) const override {
Eli Benderskyb60f8382014-02-10 23:34:23 +0000159 AU.addRequiredID(PassToPrint->getTypeInfo());
160 AU.setPreservesAll();
161 }
162};
163
164char LoopPassPrinter::ID = 0;
165
166struct RegionPassPrinter : public RegionPass {
167 static char ID;
168 const PassInfo *PassToPrint;
169 raw_ostream &Out;
170 std::string PassName;
171 bool QuietPass;
172
173 RegionPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet)
174 : RegionPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) {
175 std::string PassToPrintName = PassToPrint->getPassName();
176 PassName = "RegionPass Printer: " + PassToPrintName;
177 }
178
Craig Toppere56917c2014-03-08 08:27:28 +0000179 bool runOnRegion(Region *R, RGPassManager &RGM) override {
Eli Benderskyb60f8382014-02-10 23:34:23 +0000180 if (!QuietPass) {
181 Out << "Printing analysis '" << PassToPrint->getPassName() << "' for "
182 << "region: '" << R->getNameStr() << "' in function '"
183 << R->getEntry()->getParent()->getName() << "':\n";
184 }
185 // Get and print pass...
186 getAnalysisID<Pass>(PassToPrint->getTypeInfo())
187 .print(Out, R->getEntry()->getParent()->getParent());
188 return false;
189 }
190
Malcolm Parsons06ac79c2016-11-02 16:43:50 +0000191 StringRef getPassName() const override { return PassName; }
Eli Benderskyb60f8382014-02-10 23:34:23 +0000192
Craig Toppere56917c2014-03-08 08:27:28 +0000193 void getAnalysisUsage(AnalysisUsage &AU) const override {
Eli Benderskyb60f8382014-02-10 23:34:23 +0000194 AU.addRequiredID(PassToPrint->getTypeInfo());
195 AU.setPreservesAll();
196 }
197};
198
199char RegionPassPrinter::ID = 0;
200
201struct BasicBlockPassPrinter : public BasicBlockPass {
202 const PassInfo *PassToPrint;
203 raw_ostream &Out;
204 static char ID;
205 std::string PassName;
206 bool QuietPass;
207
208 BasicBlockPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet)
209 : BasicBlockPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) {
210 std::string PassToPrintName = PassToPrint->getPassName();
211 PassName = "BasicBlockPass Printer: " + PassToPrintName;
212 }
213
Craig Toppere56917c2014-03-08 08:27:28 +0000214 bool runOnBasicBlock(BasicBlock &BB) override {
Eli Benderskyb60f8382014-02-10 23:34:23 +0000215 if (!QuietPass)
216 Out << "Printing Analysis info for BasicBlock '" << BB.getName()
217 << "': Pass " << PassToPrint->getPassName() << ":\n";
218
219 // Get and print pass...
220 getAnalysisID<Pass>(PassToPrint->getTypeInfo())
221 .print(Out, BB.getParent()->getParent());
222 return false;
223 }
224
Malcolm Parsons06ac79c2016-11-02 16:43:50 +0000225 StringRef getPassName() const override { return PassName; }
Eli Benderskyb60f8382014-02-10 23:34:23 +0000226
Craig Toppere56917c2014-03-08 08:27:28 +0000227 void getAnalysisUsage(AnalysisUsage &AU) const override {
Eli Benderskyb60f8382014-02-10 23:34:23 +0000228 AU.addRequiredID(PassToPrint->getTypeInfo());
229 AU.setPreservesAll();
230 }
231};
232
233char BasicBlockPassPrinter::ID = 0;
Eugene Zelenkofa6434b2017-08-31 21:56:16 +0000234
235} // end anonymous namespace
Eli Benderskyb60f8382014-02-10 23:34:23 +0000236
237FunctionPass *llvm::createFunctionPassPrinter(const PassInfo *PI,
238 raw_ostream &OS, bool Quiet) {
239 return new FunctionPassPrinter(PI, OS, Quiet);
240}
241
242CallGraphSCCPass *llvm::createCallGraphPassPrinter(const PassInfo *PI,
243 raw_ostream &OS,
244 bool Quiet) {
245 return new CallGraphSCCPassPrinter(PI, OS, Quiet);
246}
247
248ModulePass *llvm::createModulePassPrinter(const PassInfo *PI, raw_ostream &OS,
249 bool Quiet) {
250 return new ModulePassPrinter(PI, OS, Quiet);
251}
252
253LoopPass *llvm::createLoopPassPrinter(const PassInfo *PI, raw_ostream &OS,
254 bool Quiet) {
255 return new LoopPassPrinter(PI, OS, Quiet);
256}
257
258RegionPass *llvm::createRegionPassPrinter(const PassInfo *PI, raw_ostream &OS,
259 bool Quiet) {
260 return new RegionPassPrinter(PI, OS, Quiet);
261}
262
263BasicBlockPass *llvm::createBasicBlockPassPrinter(const PassInfo *PI,
264 raw_ostream &OS, bool Quiet) {
265 return new BasicBlockPassPrinter(PI, OS, Quiet);
266}