15c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene//===-- MachineFunctionPrinterPass.cpp ------------------------------------===//
25c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene//
35c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene//                     The LLVM Compiler Infrastructure
45c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene//
55c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene// This file is distributed under the University of Illinois Open Source
65c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene// License. See LICENSE.TXT for details.
75c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene//
85c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene//===----------------------------------------------------------------------===//
95c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene//
105c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene// MachineFunctionPrinterPass implementation.
115c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene//
125c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene//===----------------------------------------------------------------------===//
135c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene
145c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene#include "llvm/CodeGen/Passes.h"
155c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene#include "llvm/CodeGen/MachineFunction.h"
16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/CodeGen/MachineFunctionPass.h"
179389ec7375eb184ad017b7a1f09600cc4c2be4cdJakob Stoklund Olesen#include "llvm/CodeGen/SlotIndexes.h"
186e1b8128505711276a87e96f6bffb818b435cbd5Bob Wilson#include "llvm/Support/Debug.h"
19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/raw_ostream.h"
205c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene
215c8aa950fe3484b6e115647328c196f8be64f9edDavid Greeneusing namespace llvm;
225c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene
235c8aa950fe3484b6e115647328c196f8be64f9edDavid Greenenamespace {
245c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene/// MachineFunctionPrinterPass - This is a pass to dump the IR of a
255c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene/// MachineFunction.
265c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene///
275c8aa950fe3484b6e115647328c196f8be64f9edDavid Greenestruct MachineFunctionPrinterPass : public MachineFunctionPass {
285c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene  static char ID;
295c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene
305c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene  raw_ostream &OS;
315c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene  const std::string Banner;
325c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene
336e1b8128505711276a87e96f6bffb818b435cbd5Bob Wilson  MachineFunctionPrinterPass() : MachineFunctionPass(ID), OS(dbgs()) { }
345c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene  MachineFunctionPrinterPass(raw_ostream &os, const std::string &banner)
3590c579de5a383cee278acc3f7e7b9d0a656e6a35Owen Anderson      : MachineFunctionPass(ID), OS(os), Banner(banner) {}
365c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene
375c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene  const char *getPassName() const { return "MachineFunction Printer"; }
385c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene
395c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene  virtual void getAnalysisUsage(AnalysisUsage &AU) const {
405c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene    AU.setPreservesAll();
415c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene    MachineFunctionPass::getAnalysisUsage(AU);
425c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene  }
435c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene
445c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene  bool runOnMachineFunction(MachineFunction &MF) {
455c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene    OS << "# " << Banner << ":\n";
469389ec7375eb184ad017b7a1f09600cc4c2be4cdJakob Stoklund Olesen    MF.print(OS, getAnalysisIfAvailable<SlotIndexes>());
475c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene    return false;
485c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene  }
495c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene};
505c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene
515c8aa950fe3484b6e115647328c196f8be64f9edDavid Greenechar MachineFunctionPrinterPass::ID = 0;
525c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene}
535c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene
5463a4c24616fafa2b86d6391308ffd93e012115e4Benjamin Kramerchar &llvm::MachineFunctionPrinterPassID = MachineFunctionPrinterPass::ID;
556e1b8128505711276a87e96f6bffb818b435cbd5Bob WilsonINITIALIZE_PASS(MachineFunctionPrinterPass, "print-machineinstrs",
566e1b8128505711276a87e96f6bffb818b435cbd5Bob Wilson                "Machine Function Printer", false, false)
576e1b8128505711276a87e96f6bffb818b435cbd5Bob Wilson
585c8aa950fe3484b6e115647328c196f8be64f9edDavid Greenenamespace llvm {
595c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene/// Returns a newly-created MachineFunction Printer pass. The
605c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene/// default banner is empty.
615c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene///
625c8aa950fe3484b6e115647328c196f8be64f9edDavid GreeneMachineFunctionPass *createMachineFunctionPrinterPass(raw_ostream &OS,
635c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene                                                      const std::string &Banner){
645c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene  return new MachineFunctionPrinterPass(OS, Banner);
655c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene}
665c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene
675c8aa950fe3484b6e115647328c196f8be64f9edDavid Greene}
68