11363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar//===--- VMCore/PrintModulePass.cpp - Module/Function Printer -------------===// 21363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar// 31363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar// The LLVM Compiler Infrastructure 41363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar// 51363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar// This file is distributed under the University of Illinois Open Source 61363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar// License. See LICENSE.TXT for details. 71363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar// 81363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar//===----------------------------------------------------------------------===// 91363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar// 101363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar// PrintModulePass and PrintFunctionPass implementations. 111363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar// 121363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar//===----------------------------------------------------------------------===// 131363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 141363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar#include "llvm/Assembly/PrintModulePass.h" 151363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 161363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar#include "llvm/Function.h" 171363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar#include "llvm/Module.h" 181363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar#include "llvm/Pass.h" 190316fc7b26a0055a503d6c438e4aa5180e527643David Greene#include "llvm/Support/Debug.h" 203b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar#include "llvm/Support/raw_ostream.h" 211363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarusing namespace llvm; 221363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 231363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarnamespace { 241363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 25492d06efde44a4e38a6ed321ada4af5a75494df6Nick Lewycky class PrintModulePass : public ModulePass { 2668a217169a546c904bb1dc8ac3f1afb36a29020cDavid Greene std::string Banner; 273b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar raw_ostream *Out; // raw_ostream to print on 281363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar bool DeleteStream; // Delete the ostream in our dtor? 291363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar public: 301363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar static char ID; 317569322765651f19eea0609fb082e6b267d5d2b5Owen Anderson PrintModulePass() : ModulePass(ID), Out(&dbgs()), 321363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar DeleteStream(false) {} 3368a217169a546c904bb1dc8ac3f1afb36a29020cDavid Greene PrintModulePass(const std::string &B, raw_ostream *o, bool DS) 347569322765651f19eea0609fb082e6b267d5d2b5Owen Anderson : ModulePass(ID), Banner(B), Out(o), DeleteStream(DS) {} 351363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 361363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar ~PrintModulePass() { 371363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar if (DeleteStream) delete Out; 381363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar } 391363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 401363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar bool runOnModule(Module &M) { 4168a217169a546c904bb1dc8ac3f1afb36a29020cDavid Greene (*Out) << Banner << M; 421363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar return false; 431363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar } 441363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 451363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar virtual void getAnalysisUsage(AnalysisUsage &AU) const { 461363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar AU.setPreservesAll(); 471363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar } 481363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar }; 491363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 501363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar class PrintFunctionPass : public FunctionPass { 511363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar std::string Banner; // String to print before each function 523b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar raw_ostream *Out; // raw_ostream to print on 531363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar bool DeleteStream; // Delete the ostream in our dtor? 541363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar public: 551363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar static char ID; 567569322765651f19eea0609fb082e6b267d5d2b5Owen Anderson PrintFunctionPass() : FunctionPass(ID), Banner(""), Out(&dbgs()), 571363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar DeleteStream(false) {} 583b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar PrintFunctionPass(const std::string &B, raw_ostream *o, bool DS) 597569322765651f19eea0609fb082e6b267d5d2b5Owen Anderson : FunctionPass(ID), Banner(B), Out(o), DeleteStream(DS) {} 601363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 612c6d59c3c4e5b2e1e846f52c871d42dee19ac308Dan Gohman ~PrintFunctionPass() { 621363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar if (DeleteStream) delete Out; 631363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar } 641363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 651363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar // runOnFunction - This pass just prints a banner followed by the 661363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar // function as it's processed. 671363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar // 681363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar bool runOnFunction(Function &F) { 691363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar (*Out) << Banner << static_cast<Value&>(F); 701363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar return false; 711363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar } 721363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 731363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar virtual void getAnalysisUsage(AnalysisUsage &AU) const { 741363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar AU.setPreservesAll(); 751363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar } 761363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar }; 771363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar} 781363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 791363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarchar PrintModulePass::ID = 0; 806374c3d4d7b1fece8ed9acb590f809a0e6fb17eeOwen AndersonINITIALIZE_PASS(PrintModulePass, "print-module", 811434dfa8cead98bd1e63411fcb9424e1d37f61acOwen Anderson "Print module to stderr", false, false) 821363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarchar PrintFunctionPass::ID = 0; 836374c3d4d7b1fece8ed9acb590f809a0e6fb17eeOwen AndersonINITIALIZE_PASS(PrintFunctionPass, "print-function", 841434dfa8cead98bd1e63411fcb9424e1d37f61acOwen Anderson "Print function to stderr", false, false) 851363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 861363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar/// createPrintModulePass - Create and return a pass that writes the 873b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar/// module to the specified raw_ostream. 883b475e99db65dccb5b816af218f3335573e7f526Daniel DunbarModulePass *llvm::createPrintModulePass(llvm::raw_ostream *OS, 8968a217169a546c904bb1dc8ac3f1afb36a29020cDavid Greene bool DeleteStream, 9068a217169a546c904bb1dc8ac3f1afb36a29020cDavid Greene const std::string &Banner) { 9168a217169a546c904bb1dc8ac3f1afb36a29020cDavid Greene return new PrintModulePass(Banner, OS, DeleteStream); 921363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar} 931363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 941363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar/// createPrintFunctionPass - Create and return a pass that prints 953b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar/// functions to the specified raw_ostream as they are processed. 961363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel DunbarFunctionPass *llvm::createPrintFunctionPass(const std::string &Banner, 973b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar llvm::raw_ostream *OS, 983b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar bool DeleteStream) { 991363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar return new PrintFunctionPass(Banner, OS, DeleteStream); 1001363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar} 1011363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 102