136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===--- IRPrintingPasses.cpp - Module and Function printing passes -------===// 236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// The LLVM Compiler Infrastructure 436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// This file is distributed under the University of Illinois Open Source 636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// License. See LICENSE.TXT for details. 736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===// 936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 1036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// PrintModulePass and PrintFunctionPass implementations. 1136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// 1236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===----------------------------------------------------------------------===// 1336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 1436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/IRPrintingPasses.h" 1536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Function.h" 1636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/Module.h" 1736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/PassManager.h" 1836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Pass.h" 1936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/Debug.h" 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/raw_ostream.h" 2136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesusing namespace llvm; 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesPrintModulePass::PrintModulePass() : OS(dbgs()) {} 2436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesPrintModulePass::PrintModulePass(raw_ostream &OS, const std::string &Banner) 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines : OS(OS), Banner(Banner) {} 2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesPreservedAnalyses PrintModulePass::run(Module *M) { 2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << Banner << *M; 2936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return PreservedAnalyses::all(); 3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 3136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesPrintFunctionPass::PrintFunctionPass() : OS(dbgs()) {} 3336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesPrintFunctionPass::PrintFunctionPass(raw_ostream &OS, const std::string &Banner) 3436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines : OS(OS), Banner(Banner) {} 3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 3636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesPreservedAnalyses PrintFunctionPass::run(Function *F) { 3736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines OS << Banner << static_cast<Value &>(*F); 3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return PreservedAnalyses::all(); 3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesnamespace { 4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass PrintModulePassWrapper : public ModulePass { 4436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PrintModulePass P; 4536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 4636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic: 4736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines static char ID; 4836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PrintModulePassWrapper() : ModulePass(ID) {} 4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PrintModulePassWrapper(raw_ostream &OS, const std::string &Banner) 5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines : ModulePass(ID), P(OS, Banner) {} 5136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool runOnModule(Module &M) override { 5336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines P.run(&M); 5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 5736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void getAnalysisUsage(AnalysisUsage &AU) const override { 5836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AU.setPreservesAll(); 5936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass PrintFunctionPassWrapper : public FunctionPass { 6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PrintFunctionPass P; 6436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 6536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic: 6636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines static char ID; 6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PrintFunctionPassWrapper() : FunctionPass(ID) {} 6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PrintFunctionPassWrapper(raw_ostream &OS, const std::string &Banner) 6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines : FunctionPass(ID), P(OS, Banner) {} 7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 7136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines // This pass just prints a banner followed by the function as it's processed. 7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool runOnFunction(Function &F) override { 7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines P.run(&F); 7436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 7536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 7636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void getAnalysisUsage(AnalysisUsage &AU) const override { 7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AU.setPreservesAll(); 7936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 8136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesclass PrintBasicBlockPass : public BasicBlockPass { 8336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines raw_ostream &Out; 8436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines std::string Banner; 8536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 8636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinespublic: 8736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines static char ID; 8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PrintBasicBlockPass() : BasicBlockPass(ID), Out(dbgs()) {} 8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PrintBasicBlockPass(raw_ostream &Out, const std::string &Banner) 9036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines : BasicBlockPass(ID), Out(Out), Banner(Banner) {} 9136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 9236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool runOnBasicBlock(BasicBlock &BB) override { 9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Out << Banner << BB; 9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return false; 9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 9636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 97dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void getAnalysisUsage(AnalysisUsage &AU) const override { 9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AU.setPreservesAll(); 9936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 10036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 10136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 10236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 10336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 10436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hineschar PrintModulePassWrapper::ID = 0; 10536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesINITIALIZE_PASS(PrintModulePassWrapper, "print-module", 10636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "Print module to stderr", false, false) 10736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hineschar PrintFunctionPassWrapper::ID = 0; 10836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesINITIALIZE_PASS(PrintFunctionPassWrapper, "print-function", 10936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "Print function to stderr", false, false) 11036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hineschar PrintBasicBlockPass::ID = 0; 11136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesINITIALIZE_PASS(PrintBasicBlockPass, "print-bb", "Print BB to stderr", false, 11236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines false) 11336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesModulePass *llvm::createPrintModulePass(llvm::raw_ostream &OS, 11536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const std::string &Banner) { 11636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return new PrintModulePassWrapper(OS, Banner); 11736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesFunctionPass *llvm::createPrintFunctionPass(llvm::raw_ostream &OS, 12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const std::string &Banner) { 12136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return new PrintFunctionPassWrapper(OS, Banner); 12236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 12336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 12436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesBasicBlockPass *llvm::createPrintBasicBlockPass(llvm::raw_ostream &OS, 12536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines const std::string &Banner) { 12636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return new PrintBasicBlockPass(OS, Banner); 12736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 128