IRPrintingPasses.cpp revision 36b56886974eae4f9c5ebc96befd3e7bfe5de338
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com//===--- IRPrintingPasses.cpp - Module and Function printing passes -------===//
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com//
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com//                     The LLVM Compiler Infrastructure
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com//
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// This file is distributed under the University of Illinois Open Source
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com// License. See LICENSE.TXT for details.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com//
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//===----------------------------------------------------------------------===//
9227b516f233df5870d79d3f8dcbdaa02336b7356mike@reedtribe.org//
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com// PrintModulePass and PrintFunctionPass implementations.
11f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com//
12f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com//===----------------------------------------------------------------------===//
138b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.org
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "llvm/IR/IRPrintingPasses.h"
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "llvm/IR/Function.h"
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "llvm/IR/Module.h"
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "llvm/IR/PassManager.h"
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "llvm/Pass.h"
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "llvm/Support/Debug.h"
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "llvm/Support/raw_ostream.h"
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comusing namespace llvm;
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
230c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.comPrintModulePass::PrintModulePass() : OS(dbgs()) {}
240c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.comPrintModulePass::PrintModulePass(raw_ostream &OS, const std::string &Banner)
250c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com    : OS(OS), Banner(Banner) {}
260c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com
270c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.comPreservedAnalyses PrintModulePass::run(Module *M) {
280c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com  OS << Banner << *M;
290c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com  return PreservedAnalyses::all();
300c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com}
310c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com
320c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.comPrintFunctionPass::PrintFunctionPass() : OS(dbgs()) {}
330c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.comPrintFunctionPass::PrintFunctionPass(raw_ostream &OS, const std::string &Banner)
340c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com    : OS(OS), Banner(Banner) {}
350c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com
360c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.comPreservedAnalyses PrintFunctionPass::run(Function *F) {
370c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com  OS << Banner << static_cast<Value &>(*F);
380c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com  return PreservedAnalyses::all();
390c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com}
400c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com
410c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.comnamespace {
420c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com
430c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.comclass PrintModulePassWrapper : public ModulePass {
440c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com  PrintModulePass P;
450c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com
460c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.compublic:
47e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org  static char ID;
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  PrintModulePassWrapper() : ModulePass(ID) {}
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  PrintModulePassWrapper(raw_ostream &OS, const std::string &Banner)
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      : ModulePass(ID), P(OS, Banner) {}
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
52e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org  bool runOnModule(Module &M) override {
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    P.run(&M);
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return false;
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  }
56e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  void getAnalysisUsage(AnalysisUsage &AU) const override {
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    AU.setPreservesAll();
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  }
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass PrintFunctionPassWrapper : public FunctionPass {
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  PrintFunctionPass P;
64c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
66c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org  static char ID;
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  PrintFunctionPassWrapper() : FunctionPass(ID) {}
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  PrintFunctionPassWrapper(raw_ostream &OS, const std::string &Banner)
69c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org      : FunctionPass(ID), P(OS, Banner) {}
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  // This pass just prints a banner followed by the function as it's processed.
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  bool runOnFunction(Function &F) override {
73c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org    P.run(&F);
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return false;
75c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org  }
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  void getAnalysisUsage(AnalysisUsage &AU) const override {
7882065d667f64e232bcde2ad849756a6096fcbe6freed@google.com    AU.setPreservesAll();
79c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org  }
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass PrintBasicBlockPass : public BasicBlockPass {
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  raw_ostream &Out;
8482065d667f64e232bcde2ad849756a6096fcbe6freed@google.com  std::string Banner;
85c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org
8682065d667f64e232bcde2ad849756a6096fcbe6freed@google.compublic:
87c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org  static char ID;
88c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org  PrintBasicBlockPass() : BasicBlockPass(ID), Out(dbgs()) {}
89c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org  PrintBasicBlockPass(raw_ostream &Out, const std::string &Banner)
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      : BasicBlockPass(ID), Out(Out), Banner(Banner) {}
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  bool runOnBasicBlock(BasicBlock &BB) override {
93a0c2bc24381fea063008f9c8823756eb020603b3scroggo@google.com    Out << Banner << BB;
94d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com    return false;
95d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com  }
96c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org
97c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org  void getAnalysisUsage(AnalysisUsage &AU) const override{
989245498e40399199ed6d32aa67fe028b634cc582caryclark@google.com    AU.setPreservesAll();
99d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com  }
100d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com};
101d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com
102d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com}
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
104c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.orgchar PrintModulePassWrapper::ID = 0;
105a0c2bc24381fea063008f9c8823756eb020603b3scroggo@google.comINITIALIZE_PASS(PrintModulePassWrapper, "print-module",
106d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com                "Print module to stderr", false, false)
107d26147adbbdca85f07dff432025afee0c8614387caryclark@google.comchar PrintFunctionPassWrapper::ID = 0;
108c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.orgINITIALIZE_PASS(PrintFunctionPassWrapper, "print-function",
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                "Print function to stderr", false, false)
110c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.orgchar PrintBasicBlockPass::ID = 0;
111c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.orgINITIALIZE_PASS(PrintBasicBlockPass, "print-bb", "Print BB to stderr", false,
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                false)
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comModulePass *llvm::createPrintModulePass(llvm::raw_ostream &OS,
1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                                        const std::string &Banner) {
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com  return new PrintModulePassWrapper(OS, Banner);
117c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org}
118c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org
119c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.orgFunctionPass *llvm::createPrintFunctionPass(llvm::raw_ostream &OS,
120c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org                                            const std::string &Banner) {
121c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org  return new PrintFunctionPassWrapper(OS, Banner);
122c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org}
123c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org
124c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.orgBasicBlockPass *llvm::createPrintBasicBlockPass(llvm::raw_ostream &OS,
125c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org                                                const std::string &Banner) {
126c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org  return new PrintBasicBlockPass(OS, Banner);
127c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org}
128c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org