ReleaseNotes: -femultated-tls; by Chih-hung Hsieh
[oota-llvm.git] / tools / opt / PassPrinters.cpp
1 //===- 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
11 /// \brief Utilities to print analysis info for various kinds of passes.
12 ///
13 //===----------------------------------------------------------------------===//
14 #include "PassPrinters.h"
15 #include "llvm/Analysis/CallGraphSCCPass.h"
16 #include "llvm/Analysis/LoopPass.h"
17 #include "llvm/Analysis/RegionPass.h"
18 #include "llvm/IR/Function.h"
19 #include "llvm/Pass.h"
20 #include <string>
21
22 using namespace llvm;
23
24 namespace {
25
26 struct FunctionPassPrinter : public FunctionPass {
27   const PassInfo *PassToPrint;
28   raw_ostream &Out;
29   static char ID;
30   std::string PassName;
31   bool QuietPass;
32
33   FunctionPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet)
34       : FunctionPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) {
35     std::string PassToPrintName = PassToPrint->getPassName();
36     PassName = "FunctionPass Printer: " + PassToPrintName;
37   }
38
39   bool runOnFunction(Function &F) override {
40     if (!QuietPass)
41       Out << "Printing analysis '" << PassToPrint->getPassName()
42           << "' for function '" << F.getName() << "':\n";
43
44     // Get and print pass...
45     getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out, F.getParent());
46     return false;
47   }
48
49   const char *getPassName() const override { return PassName.c_str(); }
50
51   void getAnalysisUsage(AnalysisUsage &AU) const override {
52     AU.addRequiredID(PassToPrint->getTypeInfo());
53     AU.setPreservesAll();
54   }
55 };
56
57 char FunctionPassPrinter::ID = 0;
58
59 struct CallGraphSCCPassPrinter : public CallGraphSCCPass {
60   static char ID;
61   const PassInfo *PassToPrint;
62   raw_ostream &Out;
63   std::string PassName;
64   bool QuietPass;
65
66   CallGraphSCCPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet)
67       : CallGraphSCCPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) {
68     std::string PassToPrintName = PassToPrint->getPassName();
69     PassName = "CallGraphSCCPass Printer: " + PassToPrintName;
70   }
71
72   bool runOnSCC(CallGraphSCC &SCC) override {
73     if (!QuietPass)
74       Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
75
76     // Get and print pass...
77     for (CallGraphSCC::iterator I = SCC.begin(), E = SCC.end(); I != E; ++I) {
78       Function *F = (*I)->getFunction();
79       if (F)
80         getAnalysisID<Pass>(PassToPrint->getTypeInfo())
81             .print(Out, F->getParent());
82     }
83     return false;
84   }
85
86   const char *getPassName() const override { return PassName.c_str(); }
87
88   void getAnalysisUsage(AnalysisUsage &AU) const override {
89     AU.addRequiredID(PassToPrint->getTypeInfo());
90     AU.setPreservesAll();
91   }
92 };
93
94 char CallGraphSCCPassPrinter::ID = 0;
95
96 struct ModulePassPrinter : public ModulePass {
97   static char ID;
98   const PassInfo *PassToPrint;
99   raw_ostream &Out;
100   std::string PassName;
101   bool QuietPass;
102
103   ModulePassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet)
104       : ModulePass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) {
105     std::string PassToPrintName = PassToPrint->getPassName();
106     PassName = "ModulePass Printer: " + PassToPrintName;
107   }
108
109   bool runOnModule(Module &M) override {
110     if (!QuietPass)
111       Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
112
113     // Get and print pass...
114     getAnalysisID<Pass>(PassToPrint->getTypeInfo()).print(Out, &M);
115     return false;
116   }
117
118   const char *getPassName() const override { return PassName.c_str(); }
119
120   void getAnalysisUsage(AnalysisUsage &AU) const override {
121     AU.addRequiredID(PassToPrint->getTypeInfo());
122     AU.setPreservesAll();
123   }
124 };
125
126 char ModulePassPrinter::ID = 0;
127
128 struct LoopPassPrinter : public LoopPass {
129   static char ID;
130   const PassInfo *PassToPrint;
131   raw_ostream &Out;
132   std::string PassName;
133   bool QuietPass;
134
135   LoopPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet)
136       : LoopPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) {
137     std::string PassToPrintName = PassToPrint->getPassName();
138     PassName = "LoopPass Printer: " + PassToPrintName;
139   }
140
141   bool runOnLoop(Loop *L, LPPassManager &LPM) override {
142     if (!QuietPass)
143       Out << "Printing analysis '" << PassToPrint->getPassName() << "':\n";
144
145     // Get and print pass...
146     getAnalysisID<Pass>(PassToPrint->getTypeInfo())
147         .print(Out, L->getHeader()->getParent()->getParent());
148     return false;
149   }
150
151   const char *getPassName() const override { return PassName.c_str(); }
152
153   void getAnalysisUsage(AnalysisUsage &AU) const override {
154     AU.addRequiredID(PassToPrint->getTypeInfo());
155     AU.setPreservesAll();
156   }
157 };
158
159 char LoopPassPrinter::ID = 0;
160
161 struct RegionPassPrinter : public RegionPass {
162   static char ID;
163   const PassInfo *PassToPrint;
164   raw_ostream &Out;
165   std::string PassName;
166   bool QuietPass;
167
168   RegionPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet)
169       : RegionPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) {
170     std::string PassToPrintName = PassToPrint->getPassName();
171     PassName = "RegionPass Printer: " + PassToPrintName;
172   }
173
174   bool runOnRegion(Region *R, RGPassManager &RGM) override {
175     if (!QuietPass) {
176       Out << "Printing analysis '" << PassToPrint->getPassName() << "' for "
177           << "region: '" << R->getNameStr() << "' in function '"
178           << R->getEntry()->getParent()->getName() << "':\n";
179     }
180     // Get and print pass...
181     getAnalysisID<Pass>(PassToPrint->getTypeInfo())
182         .print(Out, R->getEntry()->getParent()->getParent());
183     return false;
184   }
185
186   const char *getPassName() const override { return PassName.c_str(); }
187
188   void getAnalysisUsage(AnalysisUsage &AU) const override {
189     AU.addRequiredID(PassToPrint->getTypeInfo());
190     AU.setPreservesAll();
191   }
192 };
193
194 char RegionPassPrinter::ID = 0;
195
196 struct BasicBlockPassPrinter : public BasicBlockPass {
197   const PassInfo *PassToPrint;
198   raw_ostream &Out;
199   static char ID;
200   std::string PassName;
201   bool QuietPass;
202
203   BasicBlockPassPrinter(const PassInfo *PI, raw_ostream &out, bool Quiet)
204       : BasicBlockPass(ID), PassToPrint(PI), Out(out), QuietPass(Quiet) {
205     std::string PassToPrintName = PassToPrint->getPassName();
206     PassName = "BasicBlockPass Printer: " + PassToPrintName;
207   }
208
209   bool runOnBasicBlock(BasicBlock &BB) override {
210     if (!QuietPass)
211       Out << "Printing Analysis info for BasicBlock '" << BB.getName()
212           << "': Pass " << PassToPrint->getPassName() << ":\n";
213
214     // Get and print pass...
215     getAnalysisID<Pass>(PassToPrint->getTypeInfo())
216         .print(Out, BB.getParent()->getParent());
217     return false;
218   }
219
220   const char *getPassName() const override { return PassName.c_str(); }
221
222   void getAnalysisUsage(AnalysisUsage &AU) const override {
223     AU.addRequiredID(PassToPrint->getTypeInfo());
224     AU.setPreservesAll();
225   }
226 };
227
228 char BasicBlockPassPrinter::ID = 0;
229 }
230
231 FunctionPass *llvm::createFunctionPassPrinter(const PassInfo *PI,
232                                               raw_ostream &OS, bool Quiet) {
233   return new FunctionPassPrinter(PI, OS, Quiet);
234 }
235
236 CallGraphSCCPass *llvm::createCallGraphPassPrinter(const PassInfo *PI,
237                                                    raw_ostream &OS,
238                                                    bool Quiet) {
239   return new CallGraphSCCPassPrinter(PI, OS, Quiet);
240 }
241
242 ModulePass *llvm::createModulePassPrinter(const PassInfo *PI, raw_ostream &OS,
243                                           bool Quiet) {
244   return new ModulePassPrinter(PI, OS, Quiet);
245 }
246
247 LoopPass *llvm::createLoopPassPrinter(const PassInfo *PI, raw_ostream &OS,
248                                       bool Quiet) {
249   return new LoopPassPrinter(PI, OS, Quiet);
250 }
251
252 RegionPass *llvm::createRegionPassPrinter(const PassInfo *PI, raw_ostream &OS,
253                                           bool Quiet) {
254   return new RegionPassPrinter(PI, OS, Quiet);
255 }
256
257 BasicBlockPass *llvm::createBasicBlockPassPrinter(const PassInfo *PI,
258                                                   raw_ostream &OS, bool Quiet) {
259   return new BasicBlockPassPrinter(PI, OS, Quiet);
260 }