llvm-6502/lib/IR/IRPrintingPasses.cpp
Chandler Carruth 313e399b48 [PM] Simplify the IR printing passes significantly now that a narrower
API is exposed.

This removes the support for deleting the ostream, switches the member
and constructor order arround to be consistent with the creation
routines, and switches to using references.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199047 91177308-0d34-0410-b5e6-96231b3b80d8
2014-01-12 11:40:03 +00:00

111 lines
3.1 KiB
C++

//===--- IRPrintingPasses.cpp - Module and Function printing passes -------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// PrintModulePass and PrintFunctionPass implementations.
//
//===----------------------------------------------------------------------===//
#include "llvm/IR/IRPrintingPasses.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Module.h"
#include "llvm/Pass.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;
namespace {
class PrintModulePass : public ModulePass {
raw_ostream &Out;
std::string Banner;
public:
static char ID;
PrintModulePass() : ModulePass(ID), Out(dbgs()) {}
PrintModulePass(raw_ostream &Out, const std::string &Banner)
: ModulePass(ID), Out(Out), Banner(Banner) {}
bool runOnModule(Module &M) {
Out << Banner << M;
return false;
}
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesAll();
}
};
class PrintFunctionPass : public FunctionPass {
raw_ostream &Out;
std::string Banner;
public:
static char ID;
PrintFunctionPass() : FunctionPass(ID), Out(dbgs()) {}
PrintFunctionPass(raw_ostream &Out, const std::string &Banner)
: FunctionPass(ID), Out(Out), Banner(Banner) {}
// This pass just prints a banner followed by the function as it's processed.
bool runOnFunction(Function &F) {
Out << Banner << static_cast<Value &>(F);
return false;
}
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesAll();
}
};
class PrintBasicBlockPass : public BasicBlockPass {
raw_ostream &Out;
std::string Banner;
public:
static char ID;
PrintBasicBlockPass() : BasicBlockPass(ID), Out(dbgs()) {}
PrintBasicBlockPass(raw_ostream &Out, const std::string &Banner)
: BasicBlockPass(ID), Out(Out), Banner(Banner) {}
bool runOnBasicBlock(BasicBlock &BB) {
Out << Banner << BB;
return false;
}
virtual void getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesAll();
}
};
}
char PrintModulePass::ID = 0;
INITIALIZE_PASS(PrintModulePass, "print-module", "Print module to stderr",
false, false)
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)
ModulePass *llvm::createPrintModulePass(llvm::raw_ostream &OS,
const std::string &Banner) {
return new PrintModulePass(OS, Banner);
}
FunctionPass *llvm::createPrintFunctionPass(llvm::raw_ostream &OS,
const std::string &Banner) {
return new PrintFunctionPass(OS, Banner);
}
BasicBlockPass *llvm::createPrintBasicBlockPass(llvm::raw_ostream &OS,
const std::string &Banner) {
return new PrintBasicBlockPass(OS, Banner);
}