blob: ed4fc1a8174bc88bc09c1e07b909992b859e0bb1 [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) {
Benjamin Krameradcd0262020-01-28 20:23:46 +010040 std::string PassToPrintName = std::string(PassToPrint->getPassName());
Eli Benderskyb60f8382014-02-10 23:34:23 +000041 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) {
Benjamin Krameradcd0262020-01-28 20:23:46 +010073 std::string PassToPrintName = std::string(PassToPrint->getPassName());
Eli Benderskyb60f8382014-02-10 23:34:23 +000074 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) {
Benjamin Krameradcd0262020-01-28 20:23:46 +0100110 std::string PassToPrintName = std::string(PassToPrint->getPassName());
Eli Benderskyb60f8382014-02-10 23:34:23 +0000111 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) {
Benjamin Krameradcd0262020-01-28 20:23:46 +0100142 std::string PassToPrintName = std::string(PassToPrint->getPassName());
Eli Benderskyb60f8382014-02-10 23:34:23 +0000143 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) {
Benjamin Krameradcd0262020-01-28 20:23:46 +0100175 std::string PassToPrintName = std::string(PassToPrint->getPassName());
Eli Benderskyb60f8382014-02-10 23:34:23 +0000176 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
Eugene Zelenkofa6434b2017-08-31 21:56:16 +0000201} // end anonymous namespace
Eli Benderskyb60f8382014-02-10 23:34:23 +0000202
203FunctionPass *llvm::createFunctionPassPrinter(const PassInfo *PI,
204 raw_ostream &OS, bool Quiet) {
205 return new FunctionPassPrinter(PI, OS, Quiet);
206}
207
208CallGraphSCCPass *llvm::createCallGraphPassPrinter(const PassInfo *PI,
209 raw_ostream &OS,
210 bool Quiet) {
211 return new CallGraphSCCPassPrinter(PI, OS, Quiet);
212}
213
214ModulePass *llvm::createModulePassPrinter(const PassInfo *PI, raw_ostream &OS,
215 bool Quiet) {
216 return new ModulePassPrinter(PI, OS, Quiet);
217}
218
219LoopPass *llvm::createLoopPassPrinter(const PassInfo *PI, raw_ostream &OS,
220 bool Quiet) {
221 return new LoopPassPrinter(PI, OS, Quiet);
222}
223
224RegionPass *llvm::createRegionPassPrinter(const PassInfo *PI, raw_ostream &OS,
225 bool Quiet) {
226 return new RegionPassPrinter(PI, OS, Quiet);
227}
228