xref: /freebsd/contrib/llvm-project/llvm/lib/CodeGen/MachineFunctionPrinterPass.cpp (revision 0b57cec536236d46e3dba9bd041533462f33dbb7)
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