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