blob: 310d491c06a520e8a8b1a73665b5b15c33c77dce [file] [log] [blame]
Eli Bendersky8ed971b2014-02-10 23:34:23 +00001//===- PassPrinters.cpp - Utilities to print analysis info for passes -----===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9///
10/// \file
Adrian Prantl26b584c2018-05-01 15:54:18 +000011/// Utilities to print analysis info for various kinds of passes.
Eli Bendersky8ed971b2014-02-10 23:34:23 +000012///
13//===----------------------------------------------------------------------===//
Eugene Zelenko046ca042017-08-31 21:56:16 +000014
Eli Bendersky8ed971b2014-02-10 23:34:23 +000015#include "PassPrinters.h"
Eugene Zelenko046ca042017-08-31 21:56:16 +000016#include "llvm/Analysis/CallGraph.h"
Eli Bendersky8ed971b2014-02-10 23:34:23 +000017#include "llvm/Analysis/CallGraphSCCPass.h"
Eugene Zelenko046ca042017-08-31 21:56:16 +000018#include "llvm/Analysis/LoopInfo.h"
Eli Bendersky8ed971b2014-02-10 23:34:23 +000019#include "llvm/Analysis/LoopPass.h"
Eugene Zelenko046ca042017-08-31 21:56:16 +000020#include "llvm/Analysis/RegionInfo.h"
Eli Bendersky8ed971b2014-02-10 23:34:23 +000021#include "llvm/Analysis/RegionPass.h"
Eugene Zelenko046ca042017-08-31 21:56:16 +000022#include "llvm/IR/BasicBlock.h"
Eli Bendersky8ed971b2014-02-10 23:34:23 +000023#include "llvm/IR/Function.h"
Chandler Carruth1decd562014-03-04 10:07:28 +000024#include "llvm/Pass.h"
Eugene Zelenko046ca042017-08-31 21:56:16 +000025#include "llvm/Support/raw_ostream.h"
Eli Bendersky8ed971b2014-02-10 23:34:23 +000026#include <string>
27
28using namespace llvm;
29
30namespace {
31
32struct FunctionPassPrinter : public FunctionPass {
33 const PassInfo *PassToPrint;
34 raw_ostream &Out;
35 static char ID;
36 std::string PassName;
37 bool QuietPass;
38
39 FunctionPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet)
40 : FunctionPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) {
41 std::string PassToPrintName = PassToPrint->getPassName();
42 PassName = "FunctionPass Printer: " + PassToPrintName;
43 }
44
Craig Topperc83e68f2014-03-08 08:27:28 +000045 bool runOnFunction(Function &F) override {
Eli Bendersky8ed971b2014-02-10 23:34:23 +000046 if (!QuietPass)
47 Out << "Printing analysis '" << PassToPrint->getPassName()
48 << "' for function '" << F.getName() << "':\n";
49
50 // Get and print pass...
51 getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out, F.getParent());
52 return false;
53 }
54
Malcolm Parsons4c127322016-11-02 16:43:50 +000055 StringRef getPassName() const override { return PassName; }
Eli Bendersky8ed971b2014-02-10 23:34:23 +000056
Craig Topperc83e68f2014-03-08 08:27:28 +000057 void getAnalysisUsage(AnalysisUsage &AU) const override {
Eli Bendersky8ed971b2014-02-10 23:34:23 +000058 AU.addRequiredID(PassToPrint->getTypeInfo());
59 AU.setPreservesAll();
60 }
61};
62
63char FunctionPassPrinter::ID = 0;
64
65struct CallGraphSCCPassPrinter : public CallGraphSCCPass {
66 static char ID;
67 const PassInfo *PassToPrint;
68 raw_ostream &Out;
69 std::string PassName;
70 bool QuietPass;
71
72 CallGraphSCCPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet)
73 : CallGraphSCCPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) {
74 std::string PassToPrintName = PassToPrint->getPassName();
75 PassName = "CallGraphSCCPass Printer: " + PassToPrintName;
76 }
77
Craig Topperc83e68f2014-03-08 08:27:28 +000078 bool runOnSCC(CallGraphSCC &SCC) override {
Eli Bendersky8ed971b2014-02-10 23:34:23 +000079 if (!QuietPass)
80 Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
81
82 // Get and print pass...
83 for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
84 Function *F = (*I)->getFunction();
85 if (F)
86 getAnalysisID<Pass>(PassToPrint->getTypeInfo())
87 .print(Out, F->getParent());
88 }
89 return false;
90 }
91
Malcolm Parsons4c127322016-11-02 16:43:50 +000092 StringRef getPassName() const override { return PassName; }
Eli Bendersky8ed971b2014-02-10 23:34:23 +000093
Craig Topperc83e68f2014-03-08 08:27:28 +000094 void getAnalysisUsage(AnalysisUsage &AU) const override {
Eli Bendersky8ed971b2014-02-10 23:34:23 +000095 AU.addRequiredID(PassToPrint->getTypeInfo());
96 AU.setPreservesAll();
97 }
98};
99
100char CallGraphSCCPassPrinter::ID = 0;
101
102struct ModulePassPrinter : public ModulePass {
103 static char ID;
104 const PassInfo *PassToPrint;
105 raw_ostream &Out;
106 std::string PassName;
107 bool QuietPass;
108
109 ModulePassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet)
110 : ModulePass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) {
111 std::string PassToPrintName = PassToPrint->getPassName();
112 PassName = "ModulePass Printer: " + PassToPrintName;
113 }
114
Craig Topperc83e68f2014-03-08 08:27:28 +0000115 bool runOnModule(Module &M) override {
Eli Bendersky8ed971b2014-02-10 23:34:23 +0000116 if (!QuietPass)
117 Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
118
119 // Get and print pass...
120 getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out, &M);
121 return false;
122 }
123
Malcolm Parsons4c127322016-11-02 16:43:50 +0000124 StringRef getPassName() const override { return PassName; }
Eli Bendersky8ed971b2014-02-10 23:34:23 +0000125
Craig Topperc83e68f2014-03-08 08:27:28 +0000126 void getAnalysisUsage(AnalysisUsage &AU) const override {
Eli Bendersky8ed971b2014-02-10 23:34:23 +0000127 AU.addRequiredID(PassToPrint->getTypeInfo());
128 AU.setPreservesAll();
129 }
130};
131
132char ModulePassPrinter::ID = 0;
133
134struct LoopPassPrinter : public LoopPass {
135 static char ID;
136 const PassInfo *PassToPrint;
137 raw_ostream &Out;
138 std::string PassName;
139 bool QuietPass;
140
141 LoopPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet)
142 : LoopPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) {
143 std::string PassToPrintName = PassToPrint->getPassName();
144 PassName = "LoopPass Printer: " + PassToPrintName;
145 }
146
Craig Topperc83e68f2014-03-08 08:27:28 +0000147 bool runOnLoop(Loop *L, LPPassManager &LPM) override {
Eli Bendersky8ed971b2014-02-10 23:34:23 +0000148 if (!QuietPass)
149 Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
150
151 // Get and print pass...
152 getAnalysisID<Pass>(PassToPrint->getTypeInfo())
153 .print(Out, L->getHeader()->getParent()->getParent());
154 return false;
155 }
156
Malcolm Parsons4c127322016-11-02 16:43:50 +0000157 StringRef getPassName() const override { return PassName; }
Eli Bendersky8ed971b2014-02-10 23:34:23 +0000158
Craig Topperc83e68f2014-03-08 08:27:28 +0000159 void getAnalysisUsage(AnalysisUsage &AU) const override {
Eli Bendersky8ed971b2014-02-10 23:34:23 +0000160 AU.addRequiredID(PassToPrint->getTypeInfo());
161 AU.setPreservesAll();
162 }
163};
164
165char LoopPassPrinter::ID = 0;
166
167struct RegionPassPrinter : public RegionPass {
168 static char ID;
169 const PassInfo *PassToPrint;
170 raw_ostream &Out;
171 std::string PassName;
172 bool QuietPass;
173
174 RegionPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet)
175 : RegionPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) {
176 std::string PassToPrintName = PassToPrint->getPassName();
177 PassName = "RegionPass Printer: " + PassToPrintName;
178 }
179
Craig Topperc83e68f2014-03-08 08:27:28 +0000180 bool runOnRegion(Region *R, RGPassManager &RGM) override {
Eli Bendersky8ed971b2014-02-10 23:34:23 +0000181 if (!QuietPass) {
182 Out << "Printing analysis '" << PassToPrint->getPassName() << "' for "
183 << "region: '" << R->getNameStr() << "' in function '"
184 << R->getEntry()->getParent()->getName() << "':\n";
185 }
186 // Get and print pass...
187 getAnalysisID<Pass>(PassToPrint->getTypeInfo())
188 .print(Out, R->getEntry()->getParent()->getParent());
189 return false;
190 }
191
Malcolm Parsons4c127322016-11-02 16:43:50 +0000192 StringRef getPassName() const override { return PassName; }
Eli Bendersky8ed971b2014-02-10 23:34:23 +0000193
Craig Topperc83e68f2014-03-08 08:27:28 +0000194 void getAnalysisUsage(AnalysisUsage &AU) const override {
Eli Bendersky8ed971b2014-02-10 23:34:23 +0000195 AU.addRequiredID(PassToPrint->getTypeInfo());
196 AU.setPreservesAll();
197 }
198};
199
200char RegionPassPrinter::ID = 0;
201
202struct BasicBlockPassPrinter : public BasicBlockPass {
203 const PassInfo *PassToPrint;
204 raw_ostream &Out;
205 static char ID;
206 std::string PassName;
207 bool QuietPass;
208
209 BasicBlockPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet)
210 : BasicBlockPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) {
211 std::string PassToPrintName = PassToPrint->getPassName();
212 PassName = "BasicBlockPass Printer: " + PassToPrintName;
213 }
214
Craig Topperc83e68f2014-03-08 08:27:28 +0000215 bool runOnBasicBlock(BasicBlock &BB) override {
Eli Bendersky8ed971b2014-02-10 23:34:23 +0000216 if (!QuietPass)
217 Out << "Printing Analysis info for BasicBlock '" << BB.getName()
218 << "': Pass " << PassToPrint->getPassName() << ":\n";
219
220 // Get and print pass...
221 getAnalysisID<Pass>(PassToPrint->getTypeInfo())
222 .print(Out, BB.getParent()->getParent());
223 return false;
224 }
225
Malcolm Parsons4c127322016-11-02 16:43:50 +0000226 StringRef getPassName() const override { return PassName; }
Eli Bendersky8ed971b2014-02-10 23:34:23 +0000227
Craig Topperc83e68f2014-03-08 08:27:28 +0000228 void getAnalysisUsage(AnalysisUsage &AU) const override {
Eli Bendersky8ed971b2014-02-10 23:34:23 +0000229 AU.addRequiredID(PassToPrint->getTypeInfo());
230 AU.setPreservesAll();
231 }
232};
233
234char BasicBlockPassPrinter::ID = 0;
Eugene Zelenko046ca042017-08-31 21:56:16 +0000235
236} // end anonymous namespace
Eli Bendersky8ed971b2014-02-10 23:34:23 +0000237
238FunctionPass *llvm::createFunctionPassPrinter(const PassInfo *PI,
239 raw_ostream &OS, bool Quiet) {
240 return new FunctionPassPrinter(PI, OS, Quiet);
241}
242
243CallGraphSCCPass *llvm::createCallGraphPassPrinter(const PassInfo *PI,
244 raw_ostream &OS,
245 bool Quiet) {
246 return new CallGraphSCCPassPrinter(PI, OS, Quiet);
247}
248
249ModulePass *llvm::createModulePassPrinter(const PassInfo *PI, raw_ostream &OS,
250 bool Quiet) {
251 return new ModulePassPrinter(PI, OS, Quiet);
252}
253
254LoopPass *llvm::createLoopPassPrinter(const PassInfo *PI, raw_ostream &OS,
255 bool Quiet) {
256 return new LoopPassPrinter(PI, OS, Quiet);
257}
258
259RegionPass *llvm::createRegionPassPrinter(const PassInfo *PI, raw_ostream &OS,
260 bool Quiet) {
261 return new RegionPassPrinter(PI, OS, Quiet);
262}
263
264BasicBlockPass *llvm::createBasicBlockPassPrinter(const PassInfo *PI,
265 raw_ostream &OS, bool Quiet) {
266 return new BasicBlockPassPrinter(PI, OS, Quiet);
267}