blob: e872387022ff0d7d821f2f6a04199f713a932628 [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"
Duncan P. N. Exon Smithc4f0a322015-04-15 02:12:41 +000018#include "llvm/IR/UseListOrder.h"
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +000019#include "llvm/Pass.h"
David Greene5f2433e2010-01-05 01:30:18 +000020#include "llvm/Support/Debug.h"
Daniel Dunbar81b5fa52008-10-22 03:25:22 +000021#include "llvm/Support/raw_ostream.h"
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +000022using namespace llvm;
23
Chandler Carruth52eef882014-01-12 12:15:39 +000024PrintModulePass::PrintModulePass() : OS(dbgs()) {}
25PrintModulePass::PrintModulePass(raw_ostream &OS, const std::string &Banner)
26 : OS(OS), Banner(Banner) {}
27
Chandler Carruthd174ce42015-01-05 02:47:05 +000028PreservedAnalyses PrintModulePass::run(Module &M) {
Duncan P. N. Exon Smithc4f0a322015-04-15 02:12:41 +000029 OS << Banner;
30 M.print(OS, nullptr, shouldPreserveAssemblyUseListOrder());
Chandler Carruth52eef882014-01-12 12:15:39 +000031 return PreservedAnalyses::all();
32}
33
34PrintFunctionPass::PrintFunctionPass() : OS(dbgs()) {}
35PrintFunctionPass::PrintFunctionPass(raw_ostream &OS, const std::string &Banner)
36 : OS(OS), Banner(Banner) {}
37
Chandler Carruthd174ce42015-01-05 02:47:05 +000038PreservedAnalyses PrintFunctionPass::run(Function &F) {
39 OS << Banner << static_cast<Value &>(F);
Chandler Carruth52eef882014-01-12 12:15:39 +000040 return PreservedAnalyses::all();
41}
42
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +000043namespace {
44
Chandler Carruth52eef882014-01-12 12:15:39 +000045class PrintModulePassWrapper : public ModulePass {
46 PrintModulePass P;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000047
48public:
49 static char ID;
Chandler Carruth52eef882014-01-12 12:15:39 +000050 PrintModulePassWrapper() : ModulePass(ID) {}
51 PrintModulePassWrapper(raw_ostream &OS, const std::string &Banner)
52 : ModulePass(ID), P(OS, Banner) {}
Chandler Carruth3dd261d2014-01-12 11:16:01 +000053
Craig Topperf398d7c2014-03-05 06:35:38 +000054 bool runOnModule(Module &M) override {
Chandler Carruthd174ce42015-01-05 02:47:05 +000055 P.run(M);
Chandler Carruth3dd261d2014-01-12 11:16:01 +000056 return false;
57 }
58
Craig Topperf398d7c2014-03-05 06:35:38 +000059 void getAnalysisUsage(AnalysisUsage &AU) const override {
Chandler Carruth3dd261d2014-01-12 11:16:01 +000060 AU.setPreservesAll();
61 }
62};
63
Chandler Carruth52eef882014-01-12 12:15:39 +000064class PrintFunctionPassWrapper : public FunctionPass {
65 PrintFunctionPass P;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000066
67public:
68 static char ID;
Chandler Carruth52eef882014-01-12 12:15:39 +000069 PrintFunctionPassWrapper() : FunctionPass(ID) {}
70 PrintFunctionPassWrapper(raw_ostream &OS, const std::string &Banner)
71 : FunctionPass(ID), P(OS, Banner) {}
Chandler Carruth3dd261d2014-01-12 11:16:01 +000072
73 // This pass just prints a banner followed by the function as it's processed.
Craig Topperf398d7c2014-03-05 06:35:38 +000074 bool runOnFunction(Function &F) override {
Chandler Carruthd174ce42015-01-05 02:47:05 +000075 P.run(F);
Chandler Carruth3dd261d2014-01-12 11:16:01 +000076 return false;
77 }
78
Craig Topperf398d7c2014-03-05 06:35:38 +000079 void getAnalysisUsage(AnalysisUsage &AU) const override {
Chandler Carruth3dd261d2014-01-12 11:16:01 +000080 AU.setPreservesAll();
81 }
82};
83
84class PrintBasicBlockPass : public BasicBlockPass {
Chandler Carruthe0af6642014-01-12 11:40:03 +000085 raw_ostream &Out;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000086 std::string Banner;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000087
88public:
89 static char ID;
Chandler Carruthe0af6642014-01-12 11:40:03 +000090 PrintBasicBlockPass() : BasicBlockPass(ID), Out(dbgs()) {}
91 PrintBasicBlockPass(raw_ostream &Out, const std::string &Banner)
92 : BasicBlockPass(ID), Out(Out), Banner(Banner) {}
Chandler Carruth3dd261d2014-01-12 11:16:01 +000093
Craig Topperf398d7c2014-03-05 06:35:38 +000094 bool runOnBasicBlock(BasicBlock &BB) override {
Chandler Carruthe0af6642014-01-12 11:40:03 +000095 Out << Banner << BB;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000096 return false;
97 }
98
Hans Wennborg12d1e242014-05-24 20:19:40 +000099 void getAnalysisUsage(AnalysisUsage &AU) const override {
Chandler Carruth3dd261d2014-01-12 11:16:01 +0000100 AU.setPreservesAll();
101 }
102};
Chandler Carruthe0af6642014-01-12 11:40:03 +0000103
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +0000104}
105
Chandler Carruth52eef882014-01-12 12:15:39 +0000106char PrintModulePassWrapper::ID = 0;
107INITIALIZE_PASS(PrintModulePassWrapper, "print-module",
108 "Print module to stderr", false, false)
109char PrintFunctionPassWrapper::ID = 0;
110INITIALIZE_PASS(PrintFunctionPassWrapper, "print-function",
111 "Print function to stderr", false, false)
Sergei Larincd1201b2013-02-08 23:37:41 +0000112char PrintBasicBlockPass::ID = 0;
Chandler Carruth3dd261d2014-01-12 11:16:01 +0000113INITIALIZE_PASS(PrintBasicBlockPass, "print-bb", "Print BB to stderr", false,
114 false)
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +0000115
Chandler Carruth9d805132014-01-12 11:30:46 +0000116ModulePass *llvm::createPrintModulePass(llvm::raw_ostream &OS,
David Greene9b063df2010-04-02 23:17:14 +0000117 const std::string &Banner) {
Chandler Carruth52eef882014-01-12 12:15:39 +0000118 return new PrintModulePassWrapper(OS, Banner);
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +0000119}
120
Chandler Carruth9d805132014-01-12 11:30:46 +0000121FunctionPass *llvm::createPrintFunctionPass(llvm::raw_ostream &OS,
122 const std::string &Banner) {
Chandler Carruth52eef882014-01-12 12:15:39 +0000123 return new PrintFunctionPassWrapper(OS, Banner);
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +0000124}
125
Chandler Carruth9d805132014-01-12 11:30:46 +0000126BasicBlockPass *llvm::createPrintBasicBlockPass(llvm::raw_ostream &OS,
Chandler Carruth3dd261d2014-01-12 11:16:01 +0000127 const std::string &Banner) {
Chandler Carruthe0af6642014-01-12 11:40:03 +0000128 return new PrintBasicBlockPass(OS, Banner);
Sergei Larincd1201b2013-02-08 23:37:41 +0000129}