blob: 43010220b9f3cac88bfbf46d4552a4d82eb97b44 [file] [log] [blame]
Chandler Carruth41d9e922014-01-09 02:39:45 +00001//===--- IRPrintingPasses.cpp - Module and Function printing passes -------===//
Daniel Dunbarf4db3a52008-10-21 23:33:38 +00002//
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// PrintModulePass and PrintFunctionPass implementations.
11//
12//===----------------------------------------------------------------------===//
13
Chandler Carruth8a5351f2014-01-12 11:10:32 +000014#include "llvm/IR/IRPrintingPasses.h"
Chandler Carruth0b8c9a82013-01-02 11:36:10 +000015#include "llvm/IR/Function.h"
16#include "llvm/IR/Module.h"
Chandler Carrutha5952572014-01-12 12:15:39 +000017#include "llvm/IR/PassManager.h"
Daniel Dunbarf4db3a52008-10-21 23:33:38 +000018#include "llvm/Pass.h"
David Greene9a6c9402010-01-05 01:30:18 +000019#include "llvm/Support/Debug.h"
Daniel Dunbar3b0da262008-10-22 03:25:22 +000020#include "llvm/Support/raw_ostream.h"
Daniel Dunbarf4db3a52008-10-21 23:33:38 +000021using namespace llvm;
22
Chandler Carrutha5952572014-01-12 12:15:39 +000023PrintModulePass::PrintModulePass() : OS(dbgs()) {}
Duncan P. N. Exon Smith2c7f24d2015-04-15 02:38:06 +000024PrintModulePass::PrintModulePass(raw_ostream &OS, const std::string &Banner,
25 bool ShouldPreserveUseListOrder)
26 : OS(OS), Banner(Banner),
27 ShouldPreserveUseListOrder(ShouldPreserveUseListOrder) {}
Chandler Carrutha5952572014-01-12 12:15:39 +000028
Sean Silva2fb9a982016-08-09 00:28:38 +000029PreservedAnalyses PrintModulePass::run(Module &M, ModuleAnalysisManager &) {
Sven van Haastregt71e19582018-11-14 10:05:28 +000030 if (!Banner.empty())
31 OS << Banner << "\n";
Weiming Zhaob85410e2016-01-06 22:55:03 +000032 if (llvm::isFunctionInPrintList("*"))
33 M.print(OS, nullptr, ShouldPreserveUseListOrder);
34 else {
35 for(const auto &F : M.functions())
36 if (llvm::isFunctionInPrintList(F.getName()))
37 F.print(OS);
38 }
Chandler Carrutha5952572014-01-12 12:15:39 +000039 return PreservedAnalyses::all();
40}
41
42PrintFunctionPass::PrintFunctionPass() : OS(dbgs()) {}
43PrintFunctionPass::PrintFunctionPass(raw_ostream &OS, const std::string &Banner)
44 : OS(OS), Banner(Banner) {}
45
Chandler Carruth04d0fe92016-06-17 00:11:01 +000046PreservedAnalyses PrintFunctionPass::run(Function &F,
Sean Silva20b343c2016-08-09 00:28:15 +000047 FunctionAnalysisManager &) {
Benjamin Kramer79df7df2017-12-01 18:39:58 +000048 if (isFunctionInPrintList(F.getName())) {
Fedor Sergeev7d160f72017-12-01 17:42:46 +000049 if (forcePrintModuleIR())
50 OS << Banner << " (function: " << F.getName() << ")\n" << *F.getParent();
51 else
52 OS << Banner << static_cast<Value &>(F);
Benjamin Kramer79df7df2017-12-01 18:39:58 +000053 }
Chandler Carrutha5952572014-01-12 12:15:39 +000054 return PreservedAnalyses::all();
55}
56
Daniel Dunbarf4db3a52008-10-21 23:33:38 +000057namespace {
58
Chandler Carrutha5952572014-01-12 12:15:39 +000059class PrintModulePassWrapper : public ModulePass {
60 PrintModulePass P;
Chandler Carruth2ad3b872014-01-12 11:16:01 +000061
62public:
63 static char ID;
Chandler Carrutha5952572014-01-12 12:15:39 +000064 PrintModulePassWrapper() : ModulePass(ID) {}
Duncan P. N. Exon Smith2c7f24d2015-04-15 02:38:06 +000065 PrintModulePassWrapper(raw_ostream &OS, const std::string &Banner,
66 bool ShouldPreserveUseListOrder)
67 : ModulePass(ID), P(OS, Banner, ShouldPreserveUseListOrder) {}
Chandler Carruth2ad3b872014-01-12 11:16:01 +000068
Craig Topper98f54c02014-03-05 06:35:38 +000069 bool runOnModule(Module &M) override {
Chandler Carruth04d0fe92016-06-17 00:11:01 +000070 ModuleAnalysisManager DummyMAM;
71 P.run(M, DummyMAM);
Chandler Carruth2ad3b872014-01-12 11:16:01 +000072 return false;
73 }
74
Craig Topper98f54c02014-03-05 06:35:38 +000075 void getAnalysisUsage(AnalysisUsage &AU) const override {
Chandler Carruth2ad3b872014-01-12 11:16:01 +000076 AU.setPreservesAll();
77 }
Yaron Kerenea563682017-03-10 07:09:20 +000078
Michael Krusef29303d2017-08-25 12:38:53 +000079 StringRef getPassName() const override { return "Print Module IR"; }
Chandler Carruth2ad3b872014-01-12 11:16:01 +000080};
81
Chandler Carrutha5952572014-01-12 12:15:39 +000082class PrintFunctionPassWrapper : public FunctionPass {
83 PrintFunctionPass P;
Chandler Carruth2ad3b872014-01-12 11:16:01 +000084
85public:
86 static char ID;
Chandler Carrutha5952572014-01-12 12:15:39 +000087 PrintFunctionPassWrapper() : FunctionPass(ID) {}
88 PrintFunctionPassWrapper(raw_ostream &OS, const std::string &Banner)
89 : FunctionPass(ID), P(OS, Banner) {}
Chandler Carruth2ad3b872014-01-12 11:16:01 +000090
91 // This pass just prints a banner followed by the function as it's processed.
Craig Topper98f54c02014-03-05 06:35:38 +000092 bool runOnFunction(Function &F) override {
Chandler Carruth04d0fe92016-06-17 00:11:01 +000093 FunctionAnalysisManager DummyFAM;
94 P.run(F, DummyFAM);
Chandler Carruth2ad3b872014-01-12 11:16:01 +000095 return false;
96 }
97
Craig Topper98f54c02014-03-05 06:35:38 +000098 void getAnalysisUsage(AnalysisUsage &AU) const override {
Chandler Carruth2ad3b872014-01-12 11:16:01 +000099 AU.setPreservesAll();
100 }
Yaron Kerenea563682017-03-10 07:09:20 +0000101
Michael Krusef29303d2017-08-25 12:38:53 +0000102 StringRef getPassName() const override { return "Print Function IR"; }
Chandler Carruth2ad3b872014-01-12 11:16:01 +0000103};
104
105class PrintBasicBlockPass : public BasicBlockPass {
Chandler Carruth313e3992014-01-12 11:40:03 +0000106 raw_ostream &Out;
Chandler Carruth2ad3b872014-01-12 11:16:01 +0000107 std::string Banner;
Chandler Carruth2ad3b872014-01-12 11:16:01 +0000108
109public:
110 static char ID;
Chandler Carruth313e3992014-01-12 11:40:03 +0000111 PrintBasicBlockPass() : BasicBlockPass(ID), Out(dbgs()) {}
112 PrintBasicBlockPass(raw_ostream &Out, const std::string &Banner)
113 : BasicBlockPass(ID), Out(Out), Banner(Banner) {}
Chandler Carruth2ad3b872014-01-12 11:16:01 +0000114
Craig Topper98f54c02014-03-05 06:35:38 +0000115 bool runOnBasicBlock(BasicBlock &BB) override {
Chandler Carruth313e3992014-01-12 11:40:03 +0000116 Out << Banner << BB;
Chandler Carruth2ad3b872014-01-12 11:16:01 +0000117 return false;
118 }
119
Hans Wennborg68b0d1d2014-05-24 20:19:40 +0000120 void getAnalysisUsage(AnalysisUsage &AU) const override {
Chandler Carruth2ad3b872014-01-12 11:16:01 +0000121 AU.setPreservesAll();
122 }
Yaron Kerenea563682017-03-10 07:09:20 +0000123
124 StringRef getPassName() const override { return "Print BasicBlock IR"; }
Chandler Carruth2ad3b872014-01-12 11:16:01 +0000125};
Chandler Carruth313e3992014-01-12 11:40:03 +0000126
Alexander Kornienkocd52a7a2015-06-23 09:49:53 +0000127}
Daniel Dunbarf4db3a52008-10-21 23:33:38 +0000128
Chandler Carrutha5952572014-01-12 12:15:39 +0000129char PrintModulePassWrapper::ID = 0;
130INITIALIZE_PASS(PrintModulePassWrapper, "print-module",
Duncan P. N. Exon Smith15753b02018-07-11 23:30:25 +0000131 "Print module to stderr", false, true)
Chandler Carrutha5952572014-01-12 12:15:39 +0000132char PrintFunctionPassWrapper::ID = 0;
133INITIALIZE_PASS(PrintFunctionPassWrapper, "print-function",
Duncan P. N. Exon Smith15753b02018-07-11 23:30:25 +0000134 "Print function to stderr", false, true)
Sergei Larin68b2faf2013-02-08 23:37:41 +0000135char PrintBasicBlockPass::ID = 0;
Chandler Carruth2ad3b872014-01-12 11:16:01 +0000136INITIALIZE_PASS(PrintBasicBlockPass, "print-bb", "Print BB to stderr", false,
Duncan P. N. Exon Smith15753b02018-07-11 23:30:25 +0000137 true)
Daniel Dunbarf4db3a52008-10-21 23:33:38 +0000138
Chandler Carrutha5ced5e2014-01-12 11:30:46 +0000139ModulePass *llvm::createPrintModulePass(llvm::raw_ostream &OS,
Duncan P. N. Exon Smith2c7f24d2015-04-15 02:38:06 +0000140 const std::string &Banner,
141 bool ShouldPreserveUseListOrder) {
142 return new PrintModulePassWrapper(OS, Banner, ShouldPreserveUseListOrder);
Daniel Dunbarf4db3a52008-10-21 23:33:38 +0000143}
144
Chandler Carrutha5ced5e2014-01-12 11:30:46 +0000145FunctionPass *llvm::createPrintFunctionPass(llvm::raw_ostream &OS,
146 const std::string &Banner) {
Chandler Carrutha5952572014-01-12 12:15:39 +0000147 return new PrintFunctionPassWrapper(OS, Banner);
Daniel Dunbarf4db3a52008-10-21 23:33:38 +0000148}
149
Chandler Carrutha5ced5e2014-01-12 11:30:46 +0000150BasicBlockPass *llvm::createPrintBasicBlockPass(llvm::raw_ostream &OS,
Chandler Carruth2ad3b872014-01-12 11:16:01 +0000151 const std::string &Banner) {
Chandler Carruth313e3992014-01-12 11:40:03 +0000152 return new PrintBasicBlockPass(OS, Banner);
Sergei Larin68b2faf2013-02-08 23:37:41 +0000153}
Vedant Kumarb12dd1f2018-05-15 00:29:27 +0000154
155bool llvm::isIRPrintingPass(Pass *P) {
156 const char *PID = (const char*)P->getPassID();
157
158 return (PID == &PrintModulePassWrapper::ID)
159 || (PID == &PrintFunctionPassWrapper::ID)
160 || (PID == &PrintBasicBlockPass::ID);
161}