1*9880d681SAndroid Build Coastguard Worker //===--- IRPrintingPasses.cpp - Module and Function printing passes -------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // PrintModulePass and PrintFunctionPass implementations.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/IRPrintingPasses.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Function.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/PassManager.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/Pass.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Debug.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
21*9880d681SAndroid Build Coastguard Worker using namespace llvm;
22*9880d681SAndroid Build Coastguard Worker
PrintModulePass()23*9880d681SAndroid Build Coastguard Worker PrintModulePass::PrintModulePass() : OS(dbgs()) {}
PrintModulePass(raw_ostream & OS,const std::string & Banner,bool ShouldPreserveUseListOrder)24*9880d681SAndroid Build Coastguard Worker PrintModulePass::PrintModulePass(raw_ostream &OS, const std::string &Banner,
25*9880d681SAndroid Build Coastguard Worker bool ShouldPreserveUseListOrder)
26*9880d681SAndroid Build Coastguard Worker : OS(OS), Banner(Banner),
27*9880d681SAndroid Build Coastguard Worker ShouldPreserveUseListOrder(ShouldPreserveUseListOrder) {}
28*9880d681SAndroid Build Coastguard Worker
run(Module & M,AnalysisManager<Module> &)29*9880d681SAndroid Build Coastguard Worker PreservedAnalyses PrintModulePass::run(Module &M, AnalysisManager<Module> &) {
30*9880d681SAndroid Build Coastguard Worker OS << Banner;
31*9880d681SAndroid Build Coastguard Worker if (llvm::isFunctionInPrintList("*"))
32*9880d681SAndroid Build Coastguard Worker M.print(OS, nullptr, ShouldPreserveUseListOrder);
33*9880d681SAndroid Build Coastguard Worker else {
34*9880d681SAndroid Build Coastguard Worker for(const auto &F : M.functions())
35*9880d681SAndroid Build Coastguard Worker if (llvm::isFunctionInPrintList(F.getName()))
36*9880d681SAndroid Build Coastguard Worker F.print(OS);
37*9880d681SAndroid Build Coastguard Worker }
38*9880d681SAndroid Build Coastguard Worker return PreservedAnalyses::all();
39*9880d681SAndroid Build Coastguard Worker }
40*9880d681SAndroid Build Coastguard Worker
PrintFunctionPass()41*9880d681SAndroid Build Coastguard Worker PrintFunctionPass::PrintFunctionPass() : OS(dbgs()) {}
PrintFunctionPass(raw_ostream & OS,const std::string & Banner)42*9880d681SAndroid Build Coastguard Worker PrintFunctionPass::PrintFunctionPass(raw_ostream &OS, const std::string &Banner)
43*9880d681SAndroid Build Coastguard Worker : OS(OS), Banner(Banner) {}
44*9880d681SAndroid Build Coastguard Worker
run(Function & F,AnalysisManager<Function> &)45*9880d681SAndroid Build Coastguard Worker PreservedAnalyses PrintFunctionPass::run(Function &F,
46*9880d681SAndroid Build Coastguard Worker AnalysisManager<Function> &) {
47*9880d681SAndroid Build Coastguard Worker if (isFunctionInPrintList(F.getName()))
48*9880d681SAndroid Build Coastguard Worker OS << Banner << static_cast<Value &>(F);
49*9880d681SAndroid Build Coastguard Worker return PreservedAnalyses::all();
50*9880d681SAndroid Build Coastguard Worker }
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker namespace {
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Worker class PrintModulePassWrapper : public ModulePass {
55*9880d681SAndroid Build Coastguard Worker PrintModulePass P;
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker public:
58*9880d681SAndroid Build Coastguard Worker static char ID;
PrintModulePassWrapper()59*9880d681SAndroid Build Coastguard Worker PrintModulePassWrapper() : ModulePass(ID) {}
PrintModulePassWrapper(raw_ostream & OS,const std::string & Banner,bool ShouldPreserveUseListOrder)60*9880d681SAndroid Build Coastguard Worker PrintModulePassWrapper(raw_ostream &OS, const std::string &Banner,
61*9880d681SAndroid Build Coastguard Worker bool ShouldPreserveUseListOrder)
62*9880d681SAndroid Build Coastguard Worker : ModulePass(ID), P(OS, Banner, ShouldPreserveUseListOrder) {}
63*9880d681SAndroid Build Coastguard Worker
runOnModule(Module & M)64*9880d681SAndroid Build Coastguard Worker bool runOnModule(Module &M) override {
65*9880d681SAndroid Build Coastguard Worker ModuleAnalysisManager DummyMAM;
66*9880d681SAndroid Build Coastguard Worker P.run(M, DummyMAM);
67*9880d681SAndroid Build Coastguard Worker return false;
68*9880d681SAndroid Build Coastguard Worker }
69*9880d681SAndroid Build Coastguard Worker
getAnalysisUsage(AnalysisUsage & AU) const70*9880d681SAndroid Build Coastguard Worker void getAnalysisUsage(AnalysisUsage &AU) const override {
71*9880d681SAndroid Build Coastguard Worker AU.setPreservesAll();
72*9880d681SAndroid Build Coastguard Worker }
73*9880d681SAndroid Build Coastguard Worker };
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker class PrintFunctionPassWrapper : public FunctionPass {
76*9880d681SAndroid Build Coastguard Worker PrintFunctionPass P;
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker public:
79*9880d681SAndroid Build Coastguard Worker static char ID;
PrintFunctionPassWrapper()80*9880d681SAndroid Build Coastguard Worker PrintFunctionPassWrapper() : FunctionPass(ID) {}
PrintFunctionPassWrapper(raw_ostream & OS,const std::string & Banner)81*9880d681SAndroid Build Coastguard Worker PrintFunctionPassWrapper(raw_ostream &OS, const std::string &Banner)
82*9880d681SAndroid Build Coastguard Worker : FunctionPass(ID), P(OS, Banner) {}
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker // This pass just prints a banner followed by the function as it's processed.
runOnFunction(Function & F)85*9880d681SAndroid Build Coastguard Worker bool runOnFunction(Function &F) override {
86*9880d681SAndroid Build Coastguard Worker FunctionAnalysisManager DummyFAM;
87*9880d681SAndroid Build Coastguard Worker P.run(F, DummyFAM);
88*9880d681SAndroid Build Coastguard Worker return false;
89*9880d681SAndroid Build Coastguard Worker }
90*9880d681SAndroid Build Coastguard Worker
getAnalysisUsage(AnalysisUsage & AU) const91*9880d681SAndroid Build Coastguard Worker void getAnalysisUsage(AnalysisUsage &AU) const override {
92*9880d681SAndroid Build Coastguard Worker AU.setPreservesAll();
93*9880d681SAndroid Build Coastguard Worker }
94*9880d681SAndroid Build Coastguard Worker };
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker class PrintBasicBlockPass : public BasicBlockPass {
97*9880d681SAndroid Build Coastguard Worker raw_ostream &Out;
98*9880d681SAndroid Build Coastguard Worker std::string Banner;
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker public:
101*9880d681SAndroid Build Coastguard Worker static char ID;
PrintBasicBlockPass()102*9880d681SAndroid Build Coastguard Worker PrintBasicBlockPass() : BasicBlockPass(ID), Out(dbgs()) {}
PrintBasicBlockPass(raw_ostream & Out,const std::string & Banner)103*9880d681SAndroid Build Coastguard Worker PrintBasicBlockPass(raw_ostream &Out, const std::string &Banner)
104*9880d681SAndroid Build Coastguard Worker : BasicBlockPass(ID), Out(Out), Banner(Banner) {}
105*9880d681SAndroid Build Coastguard Worker
runOnBasicBlock(BasicBlock & BB)106*9880d681SAndroid Build Coastguard Worker bool runOnBasicBlock(BasicBlock &BB) override {
107*9880d681SAndroid Build Coastguard Worker Out << Banner << BB;
108*9880d681SAndroid Build Coastguard Worker return false;
109*9880d681SAndroid Build Coastguard Worker }
110*9880d681SAndroid Build Coastguard Worker
getAnalysisUsage(AnalysisUsage & AU) const111*9880d681SAndroid Build Coastguard Worker void getAnalysisUsage(AnalysisUsage &AU) const override {
112*9880d681SAndroid Build Coastguard Worker AU.setPreservesAll();
113*9880d681SAndroid Build Coastguard Worker }
114*9880d681SAndroid Build Coastguard Worker };
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker }
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Worker char PrintModulePassWrapper::ID = 0;
119*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS(PrintModulePassWrapper, "print-module",
120*9880d681SAndroid Build Coastguard Worker "Print module to stderr", false, false)
121*9880d681SAndroid Build Coastguard Worker char PrintFunctionPassWrapper::ID = 0;
122*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS(PrintFunctionPassWrapper, "print-function",
123*9880d681SAndroid Build Coastguard Worker "Print function to stderr", false, false)
124*9880d681SAndroid Build Coastguard Worker char PrintBasicBlockPass::ID = 0;
125*9880d681SAndroid Build Coastguard Worker INITIALIZE_PASS(PrintBasicBlockPass, "print-bb", "Print BB to stderr", false,
126*9880d681SAndroid Build Coastguard Worker false)
127*9880d681SAndroid Build Coastguard Worker
createPrintModulePass(llvm::raw_ostream & OS,const std::string & Banner,bool ShouldPreserveUseListOrder)128*9880d681SAndroid Build Coastguard Worker ModulePass *llvm::createPrintModulePass(llvm::raw_ostream &OS,
129*9880d681SAndroid Build Coastguard Worker const std::string &Banner,
130*9880d681SAndroid Build Coastguard Worker bool ShouldPreserveUseListOrder) {
131*9880d681SAndroid Build Coastguard Worker return new PrintModulePassWrapper(OS, Banner, ShouldPreserveUseListOrder);
132*9880d681SAndroid Build Coastguard Worker }
133*9880d681SAndroid Build Coastguard Worker
createPrintFunctionPass(llvm::raw_ostream & OS,const std::string & Banner)134*9880d681SAndroid Build Coastguard Worker FunctionPass *llvm::createPrintFunctionPass(llvm::raw_ostream &OS,
135*9880d681SAndroid Build Coastguard Worker const std::string &Banner) {
136*9880d681SAndroid Build Coastguard Worker return new PrintFunctionPassWrapper(OS, Banner);
137*9880d681SAndroid Build Coastguard Worker }
138*9880d681SAndroid Build Coastguard Worker
createPrintBasicBlockPass(llvm::raw_ostream & OS,const std::string & Banner)139*9880d681SAndroid Build Coastguard Worker BasicBlockPass *llvm::createPrintBasicBlockPass(llvm::raw_ostream &OS,
140*9880d681SAndroid Build Coastguard Worker const std::string &Banner) {
141*9880d681SAndroid Build Coastguard Worker return new PrintBasicBlockPass(OS, Banner);
142*9880d681SAndroid Build Coastguard Worker }
143