PrintModulePass.cpp revision 3b475e99db65dccb5b816af218f3335573e7f526
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 251363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar class VISIBILITY_HIDDEN 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; 303b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar PrintModulePass() : ModulePass(intptr_t(&ID)), Out(&errs()), 311363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar DeleteStream(false) {} 323b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar PrintModulePass(raw_ostream *o, bool DS) 331363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar : ModulePass(intptr_t(&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; 413b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar Out->flush(); 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; 563b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar PrintFunctionPass() : FunctionPass(intptr_t(&ID)), Banner(""), Out(&errs()), 571363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar DeleteStream(false) {} 583b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar PrintFunctionPass(const std::string &B, raw_ostream *o, bool DS) 591363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar : FunctionPass(intptr_t(&ID)), Banner(B), Out(o), DeleteStream(DS) {} 601363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 611363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar inline ~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); 703b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar Out->flush(); 711363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar return false; 721363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar } 731363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 741363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar virtual void getAnalysisUsage(AnalysisUsage &AU) const { 751363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar AU.setPreservesAll(); 761363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar } 771363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar }; 781363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar} 791363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 801363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarchar PrintModulePass::ID = 0; 811363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarstatic RegisterPass<PrintModulePass> 821363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel DunbarX("print-module", "Print module to stderr"); 831363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarchar PrintFunctionPass::ID = 0; 841363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbarstatic RegisterPass<PrintFunctionPass> 851363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel DunbarY("print-function","Print function to stderr"); 861363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar 871363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar/// createPrintModulePass - Create and return a pass that writes the 883b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar/// module to the specified raw_ostream. 893b475e99db65dccb5b816af218f3335573e7f526Daniel DunbarModulePass *llvm::createPrintModulePass(llvm::raw_ostream *OS, 903b475e99db65dccb5b816af218f3335573e7f526Daniel Dunbar bool DeleteStream) { 911363a6d0e5daa5ab8ff2670825f9e8a34123defaDaniel Dunbar return new PrintModulePass(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