1*0b57cec5SDimitry Andric //===-- MachineFunctionPrinterPass.cpp ------------------------------------===// 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric // 9*0b57cec5SDimitry Andric // MachineFunctionPrinterPass implementation. 10*0b57cec5SDimitry Andric // 11*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 12*0b57cec5SDimitry Andric 13*0b57cec5SDimitry Andric #include "llvm/CodeGen/MachineFunction.h" 14*0b57cec5SDimitry Andric #include "llvm/CodeGen/MachineFunctionPass.h" 15*0b57cec5SDimitry Andric #include "llvm/CodeGen/Passes.h" 16*0b57cec5SDimitry Andric #include "llvm/CodeGen/SlotIndexes.h" 17*0b57cec5SDimitry Andric #include "llvm/IR/IRPrintingPasses.h" 18*0b57cec5SDimitry Andric #include "llvm/Support/Debug.h" 19*0b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h" 20*0b57cec5SDimitry Andric 21*0b57cec5SDimitry Andric using namespace llvm; 22*0b57cec5SDimitry Andric 23*0b57cec5SDimitry Andric namespace { 24*0b57cec5SDimitry Andric /// MachineFunctionPrinterPass - This is a pass to dump the IR of a 25*0b57cec5SDimitry Andric /// MachineFunction. 26*0b57cec5SDimitry Andric /// 27*0b57cec5SDimitry Andric struct MachineFunctionPrinterPass : public MachineFunctionPass { 28*0b57cec5SDimitry Andric static char ID; 29*0b57cec5SDimitry Andric 30*0b57cec5SDimitry Andric raw_ostream &OS; 31*0b57cec5SDimitry Andric const std::string Banner; 32*0b57cec5SDimitry Andric 33*0b57cec5SDimitry Andric MachineFunctionPrinterPass() : MachineFunctionPass(ID), OS(dbgs()) { } 34*0b57cec5SDimitry Andric MachineFunctionPrinterPass(raw_ostream &os, const std::string &banner) 35*0b57cec5SDimitry Andric : MachineFunctionPass(ID), OS(os), Banner(banner) {} 36*0b57cec5SDimitry Andric 37*0b57cec5SDimitry Andric StringRef getPassName() const override { return "MachineFunction Printer"; } 38*0b57cec5SDimitry Andric 39*0b57cec5SDimitry Andric void getAnalysisUsage(AnalysisUsage &AU) const override { 40*0b57cec5SDimitry Andric AU.setPreservesAll(); 41*0b57cec5SDimitry Andric AU.addUsedIfAvailable<SlotIndexes>(); 42*0b57cec5SDimitry Andric MachineFunctionPass::getAnalysisUsage(AU); 43*0b57cec5SDimitry Andric } 44*0b57cec5SDimitry Andric 45*0b57cec5SDimitry Andric bool runOnMachineFunction(MachineFunction &MF) override { 46*0b57cec5SDimitry Andric if (!llvm::isFunctionInPrintList(MF.getName())) 47*0b57cec5SDimitry Andric return false; 48*0b57cec5SDimitry Andric OS << "# " << Banner << ":\n"; 49*0b57cec5SDimitry Andric MF.print(OS, getAnalysisIfAvailable<SlotIndexes>()); 50*0b57cec5SDimitry Andric return false; 51*0b57cec5SDimitry Andric } 52*0b57cec5SDimitry Andric }; 53*0b57cec5SDimitry Andric 54*0b57cec5SDimitry Andric char MachineFunctionPrinterPass::ID = 0; 55*0b57cec5SDimitry Andric } 56*0b57cec5SDimitry Andric 57*0b57cec5SDimitry Andric char &llvm::MachineFunctionPrinterPassID = MachineFunctionPrinterPass::ID; 58*0b57cec5SDimitry Andric INITIALIZE_PASS(MachineFunctionPrinterPass, "machineinstr-printer", 59*0b57cec5SDimitry Andric "Machine Function Printer", false, false) 60*0b57cec5SDimitry Andric 61*0b57cec5SDimitry Andric namespace llvm { 62*0b57cec5SDimitry Andric /// Returns a newly-created MachineFunction Printer pass. The 63*0b57cec5SDimitry Andric /// default banner is empty. 64*0b57cec5SDimitry Andric /// 65*0b57cec5SDimitry Andric MachineFunctionPass *createMachineFunctionPrinterPass(raw_ostream &OS, 66*0b57cec5SDimitry Andric const std::string &Banner){ 67*0b57cec5SDimitry Andric return new MachineFunctionPrinterPass(OS, Banner); 68*0b57cec5SDimitry Andric } 69*0b57cec5SDimitry Andric 70*0b57cec5SDimitry Andric } 71