blob: 13336ba55b3e3d39390ec6f93695ae64091812e0 [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()) {}
24PrintModulePass::PrintModulePass(raw_ostream &OS, const std::string &Banner)
25 : OS(OS), Banner(Banner) {}
26
27PreservedAnalyses PrintModulePass::run(Module *M) {
28 OS << Banner << *M;
29 return PreservedAnalyses::all();
30}
31
32PrintFunctionPass::PrintFunctionPass() : OS(dbgs()) {}
33PrintFunctionPass::PrintFunctionPass(raw_ostream &OS, const std::string &Banner)
34 : OS(OS), Banner(Banner) {}
35
36PreservedAnalyses PrintFunctionPass::run(Function *F) {
37 OS << Banner << static_cast<Value &>(*F);
38 return PreservedAnalyses::all();
39}
40
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +000041namespace {
42
Chandler Carruth52eef882014-01-12 12:15:39 +000043class PrintModulePassWrapper : public ModulePass {
44 PrintModulePass P;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000045
46public:
47 static char ID;
Chandler Carruth52eef882014-01-12 12:15:39 +000048 PrintModulePassWrapper() : ModulePass(ID) {}
49 PrintModulePassWrapper(raw_ostream &OS, const std::string &Banner)
50 : ModulePass(ID), P(OS, Banner) {}
Chandler Carruth3dd261d2014-01-12 11:16:01 +000051
52 bool runOnModule(Module &M) {
Chandler Carruth52eef882014-01-12 12:15:39 +000053 P.run(&M);
Chandler Carruth3dd261d2014-01-12 11:16:01 +000054 return false;
55 }
56
57 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
58 AU.setPreservesAll();
59 }
60};
61
Chandler Carruth52eef882014-01-12 12:15:39 +000062class PrintFunctionPassWrapper : public FunctionPass {
63 PrintFunctionPass P;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000064
65public:
66 static char ID;
Chandler Carruth52eef882014-01-12 12:15:39 +000067 PrintFunctionPassWrapper() : FunctionPass(ID) {}
68 PrintFunctionPassWrapper(raw_ostream &OS, const std::string &Banner)
69 : FunctionPass(ID), P(OS, Banner) {}
Chandler Carruth3dd261d2014-01-12 11:16:01 +000070
71 // This pass just prints a banner followed by the function as it's processed.
72 bool runOnFunction(Function &F) {
Chandler Carruth52eef882014-01-12 12:15:39 +000073 P.run(&F);
Chandler Carruth3dd261d2014-01-12 11:16:01 +000074 return false;
75 }
76
77 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
78 AU.setPreservesAll();
79 }
80};
81
82class PrintBasicBlockPass : public BasicBlockPass {
Chandler Carruthe0af6642014-01-12 11:40:03 +000083 raw_ostream &Out;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000084 std::string Banner;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000085
86public:
87 static char ID;
Chandler Carruthe0af6642014-01-12 11:40:03 +000088 PrintBasicBlockPass() : BasicBlockPass(ID), Out(dbgs()) {}
89 PrintBasicBlockPass(raw_ostream &Out, const std::string &Banner)
90 : BasicBlockPass(ID), Out(Out), Banner(Banner) {}
Chandler Carruth3dd261d2014-01-12 11:16:01 +000091
92 bool runOnBasicBlock(BasicBlock &BB) {
Chandler Carruthe0af6642014-01-12 11:40:03 +000093 Out << Banner << BB;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000094 return false;
95 }
96
97 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
98 AU.setPreservesAll();
99 }
100};
Chandler Carruthe0af6642014-01-12 11:40:03 +0000101
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +0000102}
103
Chandler Carruth52eef882014-01-12 12:15:39 +0000104char PrintModulePassWrapper::ID = 0;
105INITIALIZE_PASS(PrintModulePassWrapper, "print-module",
106 "Print module to stderr", false, false)
107char PrintFunctionPassWrapper::ID = 0;
108INITIALIZE_PASS(PrintFunctionPassWrapper, "print-function",
109 "Print function to stderr", false, false)
Sergei Larincd1201b2013-02-08 23:37:41 +0000110char PrintBasicBlockPass::ID = 0;
Chandler Carruth3dd261d2014-01-12 11:16:01 +0000111INITIALIZE_PASS(PrintBasicBlockPass, "print-bb", "Print BB to stderr", false,
112 false)
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +0000113
Chandler Carruth9d805132014-01-12 11:30:46 +0000114ModulePass *llvm::createPrintModulePass(llvm::raw_ostream &OS,
David Greene9b063df2010-04-02 23:17:14 +0000115 const std::string &Banner) {
Chandler Carruth52eef882014-01-12 12:15:39 +0000116 return new PrintModulePassWrapper(OS, Banner);
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +0000117}
118
Chandler Carruth9d805132014-01-12 11:30:46 +0000119FunctionPass *llvm::createPrintFunctionPass(llvm::raw_ostream &OS,
120 const std::string &Banner) {
Chandler Carruth52eef882014-01-12 12:15:39 +0000121 return new PrintFunctionPassWrapper(OS, Banner);
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +0000122}
123
Chandler Carruth9d805132014-01-12 11:30:46 +0000124BasicBlockPass *llvm::createPrintBasicBlockPass(llvm::raw_ostream &OS,
Chandler Carruth3dd261d2014-01-12 11:16:01 +0000125 const std::string &Banner) {
Chandler Carruthe0af6642014-01-12 11:40:03 +0000126 return new PrintBasicBlockPass(OS, Banner);
Sergei Larincd1201b2013-02-08 23:37:41 +0000127}