blob: 822dbeb08b3305d146d182a182ff4565a12dce12 [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//
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 Carruthb8ddc702014-01-12 11:10:32 +000014#include "llvm/IR/IRPrintingPasses.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000015#include "llvm/IR/Function.h"
16#include "llvm/IR/Module.h"
Chandler Carruth52eef882014-01-12 12:15:39 +000017#include "llvm/IR/PassManager.h"
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +000018#include "llvm/Pass.h"
David Greene5f2433e2010-01-05 01:30:18 +000019#include "llvm/Support/Debug.h"
Daniel Dunbar81b5fa52008-10-22 03:25:22 +000020#include "llvm/Support/raw_ostream.h"
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +000021using namespace llvm;
22
Chandler Carruth52eef882014-01-12 12:15:39 +000023PrintModulePass::PrintModulePass() : OS(dbgs()) {}
Duncan P. N. Exon Smith8a74f682015-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 Carruth52eef882014-01-12 12:15:39 +000028
Chandler Carruthd174ce42015-01-05 02:47:05 +000029PreservedAnalyses PrintModulePass::run(Module &M) {
Weiming Zhaob243c952016-01-06 18:31:44 +000030 OS << Banner;
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 Carruthd174ce42015-01-05 02:47:05 +000045PreservedAnalyses PrintFunctionPass::run(Function &F) {
Weiming Zhao0f1762c2016-01-06 22:55:03 +000046 if (isFunctionInPrintList(F.getName()))
47 OS << Banner << static_cast<Value &>(F);
Chandler Carruth52eef882014-01-12 12:15:39 +000048 return PreservedAnalyses::all();
49}
50
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +000051namespace {
52
Chandler Carruth52eef882014-01-12 12:15:39 +000053class PrintModulePassWrapper : public ModulePass {
54 PrintModulePass P;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000055
56public:
57 static char ID;
Chandler Carruth52eef882014-01-12 12:15:39 +000058 PrintModulePassWrapper() : ModulePass(ID) {}
Duncan P. N. Exon Smith8a74f682015-04-15 02:38:06 +000059 PrintModulePassWrapper(raw_ostream &OS, const std::string &Banner,
60 bool ShouldPreserveUseListOrder)
61 : ModulePass(ID), P(OS, Banner, ShouldPreserveUseListOrder) {}
Chandler Carruth3dd261d2014-01-12 11:16:01 +000062
Craig Topperf398d7c2014-03-05 06:35:38 +000063 bool runOnModule(Module &M) override {
Chandler Carruthd174ce42015-01-05 02:47:05 +000064 P.run(M);
Chandler Carruth3dd261d2014-01-12 11:16:01 +000065 return false;
66 }
67
Craig Topperf398d7c2014-03-05 06:35:38 +000068 void getAnalysisUsage(AnalysisUsage &AU) const override {
Chandler Carruth3dd261d2014-01-12 11:16:01 +000069 AU.setPreservesAll();
70 }
71};
72
Chandler Carruth52eef882014-01-12 12:15:39 +000073class PrintFunctionPassWrapper : public FunctionPass {
74 PrintFunctionPass P;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000075
76public:
77 static char ID;
Chandler Carruth52eef882014-01-12 12:15:39 +000078 PrintFunctionPassWrapper() : FunctionPass(ID) {}
79 PrintFunctionPassWrapper(raw_ostream &OS, const std::string &Banner)
80 : FunctionPass(ID), P(OS, Banner) {}
Chandler Carruth3dd261d2014-01-12 11:16:01 +000081
82 // This pass just prints a banner followed by the function as it's processed.
Craig Topperf398d7c2014-03-05 06:35:38 +000083 bool runOnFunction(Function &F) override {
Chandler Carruthd174ce42015-01-05 02:47:05 +000084 P.run(F);
Chandler Carruth3dd261d2014-01-12 11:16:01 +000085 return false;
86 }
87
Craig Topperf398d7c2014-03-05 06:35:38 +000088 void getAnalysisUsage(AnalysisUsage &AU) const override {
Chandler Carruth3dd261d2014-01-12 11:16:01 +000089 AU.setPreservesAll();
90 }
91};
92
93class PrintBasicBlockPass : public BasicBlockPass {
Chandler Carruthe0af6642014-01-12 11:40:03 +000094 raw_ostream &Out;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000095 std::string Banner;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000096
97public:
98 static char ID;
Chandler Carruthe0af6642014-01-12 11:40:03 +000099 PrintBasicBlockPass() : BasicBlockPass(ID), Out(dbgs()) {}
100 PrintBasicBlockPass(raw_ostream &Out, const std::string &Banner)
101 : BasicBlockPass(ID), Out(Out), Banner(Banner) {}
Chandler Carruth3dd261d2014-01-12 11:16:01 +0000102
Craig Topperf398d7c2014-03-05 06:35:38 +0000103 bool runOnBasicBlock(BasicBlock &BB) override {
Chandler Carruthe0af6642014-01-12 11:40:03 +0000104 Out << Banner << BB;
Chandler Carruth3dd261d2014-01-12 11:16:01 +0000105 return false;
106 }
107
Hans Wennborg12d1e242014-05-24 20:19:40 +0000108 void getAnalysisUsage(AnalysisUsage &AU) const override {
Chandler Carruth3dd261d2014-01-12 11:16:01 +0000109 AU.setPreservesAll();
110 }
111};
Chandler Carruthe0af6642014-01-12 11:40:03 +0000112
Alexander Kornienkof00654e2015-06-23 09:49:53 +0000113}
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +0000114
Chandler Carruth52eef882014-01-12 12:15:39 +0000115char PrintModulePassWrapper::ID = 0;
116INITIALIZE_PASS(PrintModulePassWrapper, "print-module",
117 "Print module to stderr", false, false)
118char PrintFunctionPassWrapper::ID = 0;
119INITIALIZE_PASS(PrintFunctionPassWrapper, "print-function",
120 "Print function to stderr", false, false)
Sergei Larincd1201b2013-02-08 23:37:41 +0000121char PrintBasicBlockPass::ID = 0;
Chandler Carruth3dd261d2014-01-12 11:16:01 +0000122INITIALIZE_PASS(PrintBasicBlockPass, "print-bb", "Print BB to stderr", false,
123 false)
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +0000124
Chandler Carruth9d805132014-01-12 11:30:46 +0000125ModulePass *llvm::createPrintModulePass(llvm::raw_ostream &OS,
Duncan P. N. Exon Smith8a74f682015-04-15 02:38:06 +0000126 const std::string &Banner,
127 bool ShouldPreserveUseListOrder) {
128 return new PrintModulePassWrapper(OS, Banner, ShouldPreserveUseListOrder);
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +0000129}
130
Chandler Carruth9d805132014-01-12 11:30:46 +0000131FunctionPass *llvm::createPrintFunctionPass(llvm::raw_ostream &OS,
132 const std::string &Banner) {
Chandler Carruth52eef882014-01-12 12:15:39 +0000133 return new PrintFunctionPassWrapper(OS, Banner);
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +0000134}
135
Chandler Carruth9d805132014-01-12 11:30:46 +0000136BasicBlockPass *llvm::createPrintBasicBlockPass(llvm::raw_ostream &OS,
Chandler Carruth3dd261d2014-01-12 11:16:01 +0000137 const std::string &Banner) {
Chandler Carruthe0af6642014-01-12 11:40:03 +0000138 return new PrintBasicBlockPass(OS, Banner);
Sergei Larincd1201b2013-02-08 23:37:41 +0000139}