blob: 35b06135a8280a1355449fa234a4e51c6c7ea148 [file] [log] [blame]
Chandler Carruth12e9d2b2014-01-09 02:39:45 +00001//===--- IRPrintingPasses.cpp - Module and Function printing passes -------===//
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +00002//
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
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +00006//
7//===----------------------------------------------------------------------===//
8//
9// PrintModulePass and PrintFunctionPass implementations.
10//
11//===----------------------------------------------------------------------===//
12
Chandler Carruthb8ddc702014-01-12 11:10:32 +000013#include "llvm/IR/IRPrintingPasses.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000014#include "llvm/IR/Function.h"
15#include "llvm/IR/Module.h"
Chandler Carruth52eef882014-01-12 12:15:39 +000016#include "llvm/IR/PassManager.h"
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +000017#include "llvm/Pass.h"
David Greene5f2433e2010-01-05 01:30:18 +000018#include "llvm/Support/Debug.h"
Daniel Dunbar81b5fa52008-10-22 03:25:22 +000019#include "llvm/Support/raw_ostream.h"
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +000020using namespace llvm;
21
Chandler Carruth52eef882014-01-12 12:15:39 +000022PrintModulePass::PrintModulePass() : OS(dbgs()) {}
Duncan P. N. Exon Smith8a74f682015-04-15 02:38:06 +000023PrintModulePass::PrintModulePass(raw_ostream &OS, const std::string &Banner,
24 bool ShouldPreserveUseListOrder)
25 : OS(OS), Banner(Banner),
26 ShouldPreserveUseListOrder(ShouldPreserveUseListOrder) {}
Chandler Carruth52eef882014-01-12 12:15:39 +000027
Sean Silvafd03ac62016-08-09 00:28:38 +000028PreservedAnalyses PrintModulePass::run(Module &M, ModuleAnalysisManager &) {
Sven van Haastregt00111142018-11-14 10:05:28 +000029 if (!Banner.empty())
30 OS << Banner << "\n";
Weiming Zhao0f1762c2016-01-06 22:55:03 +000031 if (llvm::isFunctionInPrintList("*"))
32 M.print(OS, nullptr, ShouldPreserveUseListOrder);
33 else {
34 for(const auto &F : M.functions())
35 if (llvm::isFunctionInPrintList(F.getName()))
36 F.print(OS);
37 }
Chandler Carruth52eef882014-01-12 12:15:39 +000038 return PreservedAnalyses::all();
39}
40
41PrintFunctionPass::PrintFunctionPass() : OS(dbgs()) {}
42PrintFunctionPass::PrintFunctionPass(raw_ostream &OS, const std::string &Banner)
43 : OS(OS), Banner(Banner) {}
44
Chandler Carruth164a2aa62016-06-17 00:11:01 +000045PreservedAnalyses PrintFunctionPass::run(Function &F,
Sean Silva36e0d012016-08-09 00:28:15 +000046 FunctionAnalysisManager &) {
Benjamin Kramer094ac652017-12-01 18:39:58 +000047 if (isFunctionInPrintList(F.getName())) {
Fedor Sergeev94dca7c2017-12-01 17:42:46 +000048 if (forcePrintModuleIR())
49 OS << Banner << " (function: " << F.getName() << ")\n" << *F.getParent();
50 else
51 OS << Banner << static_cast<Value &>(F);
Benjamin Kramer094ac652017-12-01 18:39:58 +000052 }
Chandler Carruth52eef882014-01-12 12:15:39 +000053 return PreservedAnalyses::all();
54}
55
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +000056namespace {
57
Chandler Carruth52eef882014-01-12 12:15:39 +000058class PrintModulePassWrapper : public ModulePass {
59 PrintModulePass P;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000060
61public:
62 static char ID;
Chandler Carruth52eef882014-01-12 12:15:39 +000063 PrintModulePassWrapper() : ModulePass(ID) {}
Duncan P. N. Exon Smith8a74f682015-04-15 02:38:06 +000064 PrintModulePassWrapper(raw_ostream &OS, const std::string &Banner,
65 bool ShouldPreserveUseListOrder)
66 : ModulePass(ID), P(OS, Banner, ShouldPreserveUseListOrder) {}
Chandler Carruth3dd261d2014-01-12 11:16:01 +000067
Craig Topperf398d7c2014-03-05 06:35:38 +000068 bool runOnModule(Module &M) override {
Chandler Carruth164a2aa62016-06-17 00:11:01 +000069 ModuleAnalysisManager DummyMAM;
70 P.run(M, DummyMAM);
Chandler Carruth3dd261d2014-01-12 11:16:01 +000071 return false;
72 }
73
Craig Topperf398d7c2014-03-05 06:35:38 +000074 void getAnalysisUsage(AnalysisUsage &AU) const override {
Chandler Carruth3dd261d2014-01-12 11:16:01 +000075 AU.setPreservesAll();
76 }
Yaron Keren1de47922017-03-10 07:09:20 +000077
Michael Krusec0a6aab2017-08-25 12:38:53 +000078 StringRef getPassName() const override { return "Print Module IR"; }
Chandler Carruth3dd261d2014-01-12 11:16:01 +000079};
80
Chandler Carruth52eef882014-01-12 12:15:39 +000081class PrintFunctionPassWrapper : public FunctionPass {
82 PrintFunctionPass P;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000083
84public:
85 static char ID;
Chandler Carruth52eef882014-01-12 12:15:39 +000086 PrintFunctionPassWrapper() : FunctionPass(ID) {}
87 PrintFunctionPassWrapper(raw_ostream &OS, const std::string &Banner)
88 : FunctionPass(ID), P(OS, Banner) {}
Chandler Carruth3dd261d2014-01-12 11:16:01 +000089
90 // This pass just prints a banner followed by the function as it's processed.
Craig Topperf398d7c2014-03-05 06:35:38 +000091 bool runOnFunction(Function &F) override {
Chandler Carruth164a2aa62016-06-17 00:11:01 +000092 FunctionAnalysisManager DummyFAM;
93 P.run(F, DummyFAM);
Chandler Carruth3dd261d2014-01-12 11:16:01 +000094 return false;
95 }
96
Craig Topperf398d7c2014-03-05 06:35:38 +000097 void getAnalysisUsage(AnalysisUsage &AU) const override {
Chandler Carruth3dd261d2014-01-12 11:16:01 +000098 AU.setPreservesAll();
99 }
Yaron Keren1de47922017-03-10 07:09:20 +0000100
Michael Krusec0a6aab2017-08-25 12:38:53 +0000101 StringRef getPassName() const override { return "Print Function IR"; }
Chandler Carruth3dd261d2014-01-12 11:16:01 +0000102};
103
104class PrintBasicBlockPass : public BasicBlockPass {
Chandler Carruthe0af6642014-01-12 11:40:03 +0000105 raw_ostream &Out;
Chandler Carruth3dd261d2014-01-12 11:16:01 +0000106 std::string Banner;
Chandler Carruth3dd261d2014-01-12 11:16:01 +0000107
108public:
109 static char ID;
Chandler Carruthe0af6642014-01-12 11:40:03 +0000110 PrintBasicBlockPass() : BasicBlockPass(ID), Out(dbgs()) {}
111 PrintBasicBlockPass(raw_ostream &Out, const std::string &Banner)
112 : BasicBlockPass(ID), Out(Out), Banner(Banner) {}
Chandler Carruth3dd261d2014-01-12 11:16:01 +0000113
Craig Topperf398d7c2014-03-05 06:35:38 +0000114 bool runOnBasicBlock(BasicBlock &BB) override {
Chandler Carruthe0af6642014-01-12 11:40:03 +0000115 Out << Banner << BB;
Chandler Carruth3dd261d2014-01-12 11:16:01 +0000116 return false;
117 }
118
Hans Wennborg12d1e242014-05-24 20:19:40 +0000119 void getAnalysisUsage(AnalysisUsage &AU) const override {
Chandler Carruth3dd261d2014-01-12 11:16:01 +0000120 AU.setPreservesAll();
121 }
Yaron Keren1de47922017-03-10 07:09:20 +0000122
123 StringRef getPassName() const override { return "Print BasicBlock IR"; }
Chandler Carruth3dd261d2014-01-12 11:16:01 +0000124};
Chandler Carruthe0af6642014-01-12 11:40:03 +0000125
Alexander Kornienkof00654e2015-06-23 09:49:53 +0000126}
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +0000127
Chandler Carruth52eef882014-01-12 12:15:39 +0000128char PrintModulePassWrapper::ID = 0;
129INITIALIZE_PASS(PrintModulePassWrapper, "print-module",
Duncan P. N. Exon Smith9f227522018-07-11 23:30:25 +0000130 "Print module to stderr", false, true)
Chandler Carruth52eef882014-01-12 12:15:39 +0000131char PrintFunctionPassWrapper::ID = 0;
132INITIALIZE_PASS(PrintFunctionPassWrapper, "print-function",
Duncan P. N. Exon Smith9f227522018-07-11 23:30:25 +0000133 "Print function to stderr", false, true)
Sergei Larincd1201b2013-02-08 23:37:41 +0000134char PrintBasicBlockPass::ID = 0;
Chandler Carruth3dd261d2014-01-12 11:16:01 +0000135INITIALIZE_PASS(PrintBasicBlockPass, "print-bb", "Print BB to stderr", false,
Duncan P. N. Exon Smith9f227522018-07-11 23:30:25 +0000136 true)
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +0000137
Chandler Carruth9d805132014-01-12 11:30:46 +0000138ModulePass *llvm::createPrintModulePass(llvm::raw_ostream &OS,
Duncan P. N. Exon Smith8a74f682015-04-15 02:38:06 +0000139 const std::string &Banner,
140 bool ShouldPreserveUseListOrder) {
141 return new PrintModulePassWrapper(OS, Banner, ShouldPreserveUseListOrder);
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +0000142}
143
Chandler Carruth9d805132014-01-12 11:30:46 +0000144FunctionPass *llvm::createPrintFunctionPass(llvm::raw_ostream &OS,
145 const std::string &Banner) {
Chandler Carruth52eef882014-01-12 12:15:39 +0000146 return new PrintFunctionPassWrapper(OS, Banner);
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +0000147}
148
Chandler Carruth9d805132014-01-12 11:30:46 +0000149BasicBlockPass *llvm::createPrintBasicBlockPass(llvm::raw_ostream &OS,
Chandler Carruth3dd261d2014-01-12 11:16:01 +0000150 const std::string &Banner) {
Chandler Carruthe0af6642014-01-12 11:40:03 +0000151 return new PrintBasicBlockPass(OS, Banner);
Sergei Larincd1201b2013-02-08 23:37:41 +0000152}
Vedant Kumar595ba1d2018-05-15 00:29:27 +0000153
154bool llvm::isIRPrintingPass(Pass *P) {
155 const char *PID = (const char*)P->getPassID();
156
157 return (PID == &PrintModulePassWrapper::ID)
158 || (PID == &PrintFunctionPassWrapper::ID)
159 || (PID == &PrintBasicBlockPass::ID);
160}