blob: b8e2a2ba5942b4ce549b16bf17d16ff459dd0579 [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 {
Chandler Carruthe0af6642014-01-12 11:40:03 +000025 raw_ostream &Out;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000026 std::string Banner;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000027
28public:
29 static char ID;
Chandler Carruthe0af6642014-01-12 11:40:03 +000030 PrintModulePass() : ModulePass(ID), Out(dbgs()) {}
31 PrintModulePass(raw_ostream &Out, const std::string &Banner)
32 : ModulePass(ID), Out(Out), Banner(Banner) {}
Chandler Carruth3dd261d2014-01-12 11:16:01 +000033
34 bool runOnModule(Module &M) {
Chandler Carruthe0af6642014-01-12 11:40:03 +000035 Out << Banner << M;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000036 return false;
37 }
38
39 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
40 AU.setPreservesAll();
41 }
42};
43
44class PrintFunctionPass : public FunctionPass {
Chandler Carruthe0af6642014-01-12 11:40:03 +000045 raw_ostream &Out;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000046 std::string Banner;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000047
48public:
49 static char ID;
Chandler Carruthe0af6642014-01-12 11:40:03 +000050 PrintFunctionPass() : FunctionPass(ID), Out(dbgs()) {}
51 PrintFunctionPass(raw_ostream &Out, const std::string &Banner)
52 : FunctionPass(ID), Out(Out), Banner(Banner) {}
Chandler Carruth3dd261d2014-01-12 11:16:01 +000053
54 // This pass just prints a banner followed by the function as it's processed.
55 bool runOnFunction(Function &F) {
Chandler Carruthe0af6642014-01-12 11:40:03 +000056 Out << Banner << static_cast<Value &>(F);
Chandler Carruth3dd261d2014-01-12 11:16:01 +000057 return false;
58 }
59
60 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
61 AU.setPreservesAll();
62 }
63};
64
65class PrintBasicBlockPass : public BasicBlockPass {
Chandler Carruthe0af6642014-01-12 11:40:03 +000066 raw_ostream &Out;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000067 std::string Banner;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000068
69public:
70 static char ID;
Chandler Carruthe0af6642014-01-12 11:40:03 +000071 PrintBasicBlockPass() : BasicBlockPass(ID), Out(dbgs()) {}
72 PrintBasicBlockPass(raw_ostream &Out, const std::string &Banner)
73 : BasicBlockPass(ID), Out(Out), Banner(Banner) {}
Chandler Carruth3dd261d2014-01-12 11:16:01 +000074
75 bool runOnBasicBlock(BasicBlock &BB) {
Chandler Carruthe0af6642014-01-12 11:40:03 +000076 Out << Banner << BB;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000077 return false;
78 }
79
80 virtual void getAnalysisUsage(AnalysisUsage &AU) const {
81 AU.setPreservesAll();
82 }
83};
Chandler Carruthe0af6642014-01-12 11:40:03 +000084
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +000085}
86
87char PrintModulePass::ID = 0;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000088INITIALIZE_PASS(PrintModulePass, "print-module", "Print module to stderr",
89 false, false)
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +000090char PrintFunctionPass::ID = 0;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000091INITIALIZE_PASS(PrintFunctionPass, "print-function", "Print function to stderr",
92 false, false)
Sergei Larincd1201b2013-02-08 23:37:41 +000093char PrintBasicBlockPass::ID = 0;
Chandler Carruth3dd261d2014-01-12 11:16:01 +000094INITIALIZE_PASS(PrintBasicBlockPass, "print-bb", "Print BB to stderr", false,
95 false)
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +000096
Chandler Carruth9d805132014-01-12 11:30:46 +000097ModulePass *llvm::createPrintModulePass(llvm::raw_ostream &OS,
David Greene9b063df2010-04-02 23:17:14 +000098 const std::string &Banner) {
Chandler Carruthe0af6642014-01-12 11:40:03 +000099 return new PrintModulePass(OS, Banner);
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +0000100}
101
Chandler Carruth9d805132014-01-12 11:30:46 +0000102FunctionPass *llvm::createPrintFunctionPass(llvm::raw_ostream &OS,
103 const std::string &Banner) {
Chandler Carruthe0af6642014-01-12 11:40:03 +0000104 return new PrintFunctionPass(OS, Banner);
Daniel Dunbar54d5b9e2008-10-21 23:33:38 +0000105}
106
Chandler Carruth9d805132014-01-12 11:30:46 +0000107BasicBlockPass *llvm::createPrintBasicBlockPass(llvm::raw_ostream &OS,
Chandler Carruth3dd261d2014-01-12 11:16:01 +0000108 const std::string &Banner) {
Chandler Carruthe0af6642014-01-12 11:40:03 +0000109 return new PrintBasicBlockPass(OS, Banner);
Sergei Larincd1201b2013-02-08 23:37:41 +0000110}