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