1f22ef01cSRoman Divacky //===-- MachineFunctionPrinterPass.cpp ------------------------------------===//
2f22ef01cSRoman Divacky //
3f22ef01cSRoman Divacky //                     The LLVM Compiler Infrastructure
4f22ef01cSRoman Divacky //
5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source
6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details.
7f22ef01cSRoman Divacky //
8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
9f22ef01cSRoman Divacky //
10f22ef01cSRoman Divacky // MachineFunctionPrinterPass implementation.
11f22ef01cSRoman Divacky //
12f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
13f22ef01cSRoman Divacky 
14f22ef01cSRoman Divacky #include "llvm/CodeGen/Passes.h"
15f22ef01cSRoman Divacky #include "llvm/CodeGen/MachineFunction.h"
16139f7f9bSDimitry Andric #include "llvm/CodeGen/MachineFunctionPass.h"
177ae0e2c9SDimitry Andric #include "llvm/CodeGen/SlotIndexes.h"
187ae0e2c9SDimitry Andric #include "llvm/Support/Debug.h"
19139f7f9bSDimitry Andric #include "llvm/Support/raw_ostream.h"
20f22ef01cSRoman Divacky 
21f22ef01cSRoman Divacky using namespace llvm;
22f22ef01cSRoman Divacky 
23f22ef01cSRoman Divacky namespace {
24f22ef01cSRoman Divacky /// MachineFunctionPrinterPass - This is a pass to dump the IR of a
25f22ef01cSRoman Divacky /// MachineFunction.
26f22ef01cSRoman Divacky ///
27f22ef01cSRoman Divacky struct MachineFunctionPrinterPass : public MachineFunctionPass {
28f22ef01cSRoman Divacky   static char ID;
29f22ef01cSRoman Divacky 
30f22ef01cSRoman Divacky   raw_ostream &OS;
31f22ef01cSRoman Divacky   const std::string Banner;
32f22ef01cSRoman Divacky 
337ae0e2c9SDimitry Andric   MachineFunctionPrinterPass() : MachineFunctionPass(ID), OS(dbgs()) { }
34f22ef01cSRoman Divacky   MachineFunctionPrinterPass(raw_ostream &os, const std::string &banner)
35e580952dSDimitry Andric       : MachineFunctionPass(ID), OS(os), Banner(banner) {}
36f22ef01cSRoman Divacky 
3791bc56edSDimitry Andric   const char *getPassName() const override { return "MachineFunction Printer"; }
38f22ef01cSRoman Divacky 
3991bc56edSDimitry Andric   void getAnalysisUsage(AnalysisUsage &AU) const override {
40f22ef01cSRoman Divacky     AU.setPreservesAll();
41f22ef01cSRoman Divacky     MachineFunctionPass::getAnalysisUsage(AU);
42f22ef01cSRoman Divacky   }
43f22ef01cSRoman Divacky 
4491bc56edSDimitry Andric   bool runOnMachineFunction(MachineFunction &MF) override {
45f22ef01cSRoman Divacky     OS << "# " << Banner << ":\n";
467ae0e2c9SDimitry Andric     MF.print(OS, getAnalysisIfAvailable<SlotIndexes>());
47f22ef01cSRoman Divacky     return false;
48f22ef01cSRoman Divacky   }
49f22ef01cSRoman Divacky };
50f22ef01cSRoman Divacky 
51f22ef01cSRoman Divacky char MachineFunctionPrinterPass::ID = 0;
52f22ef01cSRoman Divacky }
53f22ef01cSRoman Divacky 
543861d79fSDimitry Andric char &llvm::MachineFunctionPrinterPassID = MachineFunctionPrinterPass::ID;
557ae0e2c9SDimitry Andric INITIALIZE_PASS(MachineFunctionPrinterPass, "print-machineinstrs",
567ae0e2c9SDimitry Andric                 "Machine Function Printer", false, false)
577ae0e2c9SDimitry Andric 
58f22ef01cSRoman Divacky namespace llvm {
59f22ef01cSRoman Divacky /// Returns a newly-created MachineFunction Printer pass. The
60f22ef01cSRoman Divacky /// default banner is empty.
61f22ef01cSRoman Divacky ///
62f22ef01cSRoman Divacky MachineFunctionPass *createMachineFunctionPrinterPass(raw_ostream &OS,
63f22ef01cSRoman Divacky                                                       const std::string &Banner){
64f22ef01cSRoman Divacky   return new MachineFunctionPrinterPass(OS, Banner);
65f22ef01cSRoman Divacky }
66f22ef01cSRoman Divacky 
67f22ef01cSRoman Divacky }
68