blob: 4398a9cfd2aaee8a5373b5e7c3d378db3c56e713 [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"
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
22namespace {
23
Chandler Carruth3dd261d2014-01-12 11:16:01 +000024class PrintModulePass : public ModulePass {
25 std::string Banner;
26 raw_ostream *Out;
27 bool DeleteStream;
28
29public:
30 static char ID;
31 PrintModulePass() : ModulePass(ID), Out(&dbgs()), DeleteStream(false) {}
32 PrintModulePass(const std::string &B, raw_ostream *o, bool DS)
33 : ModulePass(ID), Banner(B), Out(o), DeleteStream(DS) {}
34
35 ~PrintModulePass() {
36 if (DeleteStream)
37 delete Out;
38 }
39
40 bool runOnModule(Module &M) {
41 (*Out) << Banner << M;
42 return false;
43 }
44
45 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
46 AU.setPreservesAll();
47 }
48};
49
50class PrintFunctionPass : public FunctionPass {
51 std::string Banner;
52 raw_ostream *Out;
53 bool DeleteStream;
54
55public:
56 static char ID;
57 PrintFunctionPass()
58 : FunctionPass(ID), Banner(""), Out(&dbgs()), DeleteStream(false) {}
59 PrintFunctionPass(const std::string &B, raw_ostream *o, bool DS)
Owen Andersona7aed182010-08-06 18:33:48 +000060 : FunctionPass(ID), Banner(B), Out(o), DeleteStream(DS) {}
Chandler Carruth3dd261d2014-01-12 11:16:01 +000061
62 ~PrintFunctionPass() {
63 if (DeleteStream)
64 delete Out;
65 }
66
67 // This pass just prints a banner followed by the function as it's processed.
68 bool runOnFunction(Function &F) {
69 (*Out) << Banner << static_cast<Value &>(F);
70 return false;
71 }
72
73 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
74 AU.setPreservesAll();
75 }
76};
77
78class PrintBasicBlockPass : public BasicBlockPass {
79 std::string Banner;
80 raw_ostream *Out;
81 bool DeleteStream;
82
83public:
84 static char ID;
85 PrintBasicBlockPass()
86 : BasicBlockPass(ID), Out(&dbgs()), DeleteStream(false) {}
87 PrintBasicBlockPass(const std::string &B, raw_ostream *o, bool DS)
88 : BasicBlockPass(ID), Banner(B), Out(o), DeleteStream(DS) {}
89
90 ~PrintBasicBlockPass() {
91 if (DeleteStream)
92 delete Out;
93 }
94
95 bool runOnBasicBlock(BasicBlock &BB) {
96 (*Out) << Banner << BB;
97 return false;
98 }
99
100 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
101 AU.setPreservesAll();
102 }
103};
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +0000104}
105
106char PrintModulePass::ID = 0;
Chandler Carruth3dd261d2014-01-12 11:16:01 +0000107INITIALIZE_PASS(PrintModulePass, "print-module", "Print module to stderr",
108 false, false)
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +0000109char PrintFunctionPass::ID = 0;
Chandler Carruth3dd261d2014-01-12 11:16:01 +0000110INITIALIZE_PASS(PrintFunctionPass, "print-function", "Print function to stderr",
111 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 Carruth3dd261d2014-01-12 11:16:01 +0000116ModulePass *llvm::createPrintModulePass(llvm::raw_ostream *OS,
David Greene9b063df2010-04-02 23:17:14 +0000117 bool DeleteStream,
118 const std::string &Banner) {
119 return new PrintModulePass(Banner, OS, DeleteStream);
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +0000120}
121
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +0000122FunctionPass *llvm::createPrintFunctionPass(const std::string &Banner,
Chandler Carruth3dd261d2014-01-12 11:16:01 +0000123 llvm::raw_ostream *OS,
Daniel Dunbar81b5fa52008-10-22 03:25:22 +0000124 bool DeleteStream) {
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +0000125 return new PrintFunctionPass(Banner, OS, DeleteStream);
126}
127
Sergei Larincd1201b2013-02-08 23:37:41 +0000128BasicBlockPass *llvm::createPrintBasicBlockPass(llvm::raw_ostream *OS,
Chandler Carruth3dd261d2014-01-12 11:16:01 +0000129 bool DeleteStream,
130 const std::string &Banner) {
Sergei Larincd1201b2013-02-08 23:37:41 +0000131 return new PrintBasicBlockPass(Banner, OS, DeleteStream);
132}