From: Sergei Larin Date: Fri, 8 Feb 2013 23:37:41 +0000 (+0000) Subject: Enable *BasicBlockPass::createPrinterPass() X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=68b2faf6be3a08064687a67a19efee0a713435de;p=oota-llvm.git Enable *BasicBlockPass::createPrinterPass() Enables raw_ostream I/O for BasicBlockPass. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174776 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Assembly/PrintModulePass.h b/include/llvm/Assembly/PrintModulePass.h index 239fbcc0c8c..02b9bd9be50 100644 --- a/include/llvm/Assembly/PrintModulePass.h +++ b/include/llvm/Assembly/PrintModulePass.h @@ -23,6 +23,7 @@ namespace llvm { class FunctionPass; class ModulePass; + class BasicBlockPass; class raw_ostream; /// createPrintModulePass - Create and return a pass that writes the @@ -37,6 +38,11 @@ namespace llvm { raw_ostream *OS, bool DeleteStream=false); + /// createPrintBasicBlockPass - Create and return a pass that writes the + /// BB to the specified raw_ostream. + BasicBlockPass *createPrintBasicBlockPass(raw_ostream *OS, + bool DeleteStream=false, + const std::string &Banner = ""); } // End llvm namespace #endif diff --git a/include/llvm/InitializePasses.h b/include/llvm/InitializePasses.h index 8d6e64e88f1..e5e21f34599 100644 --- a/include/llvm/InitializePasses.h +++ b/include/llvm/InitializePasses.h @@ -217,6 +217,7 @@ void initializePreVerifierPass(PassRegistry&); void initializePrintDbgInfoPass(PassRegistry&); void initializePrintFunctionPassPass(PassRegistry&); void initializePrintModulePassPass(PassRegistry&); +void initializePrintBasicBlockPassPass(PassRegistry&); void initializeProcessImplicitDefsPass(PassRegistry&); void initializeProfileEstimatorPassPass(PassRegistry&); void initializeProfileInfoAnalysisGroup(PassRegistry&); diff --git a/include/llvm/LinkAllPasses.h b/include/llvm/LinkAllPasses.h index d61ecab2147..cb727f6e7fb 100644 --- a/include/llvm/LinkAllPasses.h +++ b/include/llvm/LinkAllPasses.h @@ -151,6 +151,7 @@ namespace { (void) llvm::createMergeFunctionsPass(); (void) llvm::createPrintModulePass(0); (void) llvm::createPrintFunctionPass("", 0); + (void) llvm::createPrintBasicBlockPass(0); (void) llvm::createDbgInfoPrinterPass(); (void) llvm::createModuleDebugInfoPrinterPass(); (void) llvm::createPartialInliningPass(); diff --git a/lib/IR/Core.cpp b/lib/IR/Core.cpp index aaf661f0825..b696ed06c4f 100644 --- a/lib/IR/Core.cpp +++ b/lib/IR/Core.cpp @@ -39,6 +39,7 @@ void llvm::initializeCore(PassRegistry &Registry) { initializeDominatorTreePass(Registry); initializePrintModulePassPass(Registry); initializePrintFunctionPassPass(Registry); + initializePrintBasicBlockPassPass(Registry); initializeVerifierPass(Registry); initializePreVerifierPass(Registry); } diff --git a/lib/IR/Pass.cpp b/lib/IR/Pass.cpp index ec448e6420d..7fc48282380 100644 --- a/lib/IR/Pass.cpp +++ b/lib/IR/Pass.cpp @@ -143,8 +143,7 @@ PassManagerType FunctionPass::getPotentialPassManagerType() const { Pass *BasicBlockPass::createPrinterPass(raw_ostream &O, const std::string &Banner) const { - - llvm_unreachable("BasicBlockPass printing unsupported."); + return createPrintBasicBlockPass(&O, false, Banner); } bool BasicBlockPass::doInitialization(Function &) { diff --git a/lib/IR/PrintModulePass.cpp b/lib/IR/PrintModulePass.cpp index e4e9939f083..5026bc2d984 100644 --- a/lib/IR/PrintModulePass.cpp +++ b/lib/IR/PrintModulePass.cpp @@ -73,6 +73,31 @@ namespace { AU.setPreservesAll(); } }; + + class PrintBasicBlockPass : public BasicBlockPass { + std::string Banner; + raw_ostream *Out; // raw_ostream to print on + bool DeleteStream; // Delete the ostream in our dtor? + public: + static char ID; + PrintBasicBlockPass() : BasicBlockPass(ID), Out(&dbgs()), + DeleteStream(false) {} + PrintBasicBlockPass(const std::string &B, raw_ostream *o, bool DS) + : BasicBlockPass(ID), Banner(B), Out(o), DeleteStream(DS) {} + + ~PrintBasicBlockPass() { + if (DeleteStream) delete Out; + } + + bool runOnBasicBlock(BasicBlock &BB) { + (*Out) << Banner << BB; + return false; + } + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); + } + }; } char PrintModulePass::ID = 0; @@ -81,6 +106,9 @@ INITIALIZE_PASS(PrintModulePass, "print-module", char PrintFunctionPass::ID = 0; INITIALIZE_PASS(PrintFunctionPass, "print-function", "Print function to stderr", false, false) +char PrintBasicBlockPass::ID = 0; +INITIALIZE_PASS(PrintBasicBlockPass, "print-bb", + "Print BB to stderr", false, false) /// createPrintModulePass - Create and return a pass that writes the /// module to the specified raw_ostream. @@ -98,3 +126,11 @@ FunctionPass *llvm::createPrintFunctionPass(const std::string &Banner, return new PrintFunctionPass(Banner, OS, DeleteStream); } +/// createPrintBasicBlockPass - Create and return a pass that writes the +/// BB to the specified raw_ostream. +BasicBlockPass *llvm::createPrintBasicBlockPass(llvm::raw_ostream *OS, + bool DeleteStream, + const std::string &Banner) { + return new PrintBasicBlockPass(Banner, OS, DeleteStream); +} +