xref: /aosp_15_r20/external/llvm/lib/IR/IRPrintingPasses.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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