PrintModulePass.cpp revision 492d06efde44a4e38a6ed321ada4af5a75494df6
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" 191363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar#include "llvm/Support/Compiler.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 { 263b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar raw_ostream *Out; // raw_ostream to print on 271363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar bool DeleteStream; // Delete the ostream in our dtor? 281363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar public: 291363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar static char ID; 30c74a197153dae0577209a2e12b9bc984f9f4df45Dan Gohman PrintModulePass() : ModulePass(&ID), Out(&errs()), 311363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar DeleteStream(false) {} 323b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar PrintModulePass(raw_ostream *o, bool DS) 33c74a197153dae0577209a2e12b9bc984f9f4df45Dan Gohman : ModulePass(&ID), Out(o), DeleteStream(DS) {} 341363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 351363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar ~PrintModulePass() { 361363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar if (DeleteStream) delete Out; 371363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar } 381363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 391363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar bool runOnModule(Module &M) { 403b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar (*Out) << M; 411363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar return false; 421363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar } 431363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 441363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar virtual void getAnalysisUsage(AnalysisUsage &AU) const { 451363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar AU.setPreservesAll(); 461363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar } 471363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar }; 481363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 491363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar class PrintFunctionPass : public FunctionPass { 501363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar std::string Banner; // String to print before each function 513b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar raw_ostream *Out; // raw_ostream to print on 521363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar bool DeleteStream; // Delete the ostream in our dtor? 531363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar public: 541363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar static char ID; 55c74a197153dae0577209a2e12b9bc984f9f4df45Dan Gohman PrintFunctionPass() : FunctionPass(&ID), Banner(""), Out(&errs()), 561363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar DeleteStream(false) {} 573b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar PrintFunctionPass(const std::string &B, raw_ostream *o, bool DS) 58c74a197153dae0577209a2e12b9bc984f9f4df45Dan Gohman : FunctionPass(&ID), Banner(B), Out(o), DeleteStream(DS) {} 591363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 601363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar inline ~PrintFunctionPass() { 611363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar if (DeleteStream) delete Out; 621363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar } 631363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 641363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar // runOnFunction - This pass just prints a banner followed by the 651363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar // function as it's processed. 661363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar // 671363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar bool runOnFunction(Function &F) { 681363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar (*Out) << Banner << static_cast<Value&>(F); 691363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar return false; 701363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar } 711363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 721363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar virtual void getAnalysisUsage(AnalysisUsage &AU) const { 731363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar AU.setPreservesAll(); 741363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar } 751363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar }; 761363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar} 771363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 781363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarchar PrintModulePass::ID = 0; 791363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarstatic RegisterPass<PrintModulePass> 801363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel DunbarX("print-module", "Print module to stderr"); 811363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarchar PrintFunctionPass::ID = 0; 821363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarstatic RegisterPass<PrintFunctionPass> 831363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel DunbarY("print-function","Print function to stderr"); 841363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 851363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar/// createPrintModulePass - Create and return a pass that writes the 863b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar/// module to the specified raw_ostream. 873b475e99db65dccb5b816af218f3335573e7f526Daniel DunbarModulePass *llvm::createPrintModulePass(llvm::raw_ostream *OS, 883b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar bool DeleteStream) { 891363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar return new PrintModulePass(OS, DeleteStream); 901363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar} 911363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 921363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar/// createPrintFunctionPass - Create and return a pass that prints 933b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar/// functions to the specified raw_ostream as they are processed. 941363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel DunbarFunctionPass *llvm::createPrintFunctionPass(const std::string &Banner, 953b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar llvm::raw_ostream *OS, 963b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar bool DeleteStream) { 971363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar return new PrintFunctionPass(Banner, OS, DeleteStream); 981363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar} 991363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 100