xref: /src/contrib/llvm-project/llvm/lib/CodeGen/MachineFunctionPrinterPass.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1b5efedafSRoman Divacky //===-- MachineFunctionPrinterPass.cpp ------------------------------------===//
2b5efedafSRoman Divacky //
3e6d15924SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e6d15924SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5e6d15924SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6b5efedafSRoman Divacky //
7b5efedafSRoman Divacky //===----------------------------------------------------------------------===//
8b5efedafSRoman Divacky //
9b5efedafSRoman Divacky // MachineFunctionPrinterPass implementation.
10b5efedafSRoman Divacky //
11b5efedafSRoman Divacky //===----------------------------------------------------------------------===//
12b5efedafSRoman Divacky 
13b5efedafSRoman Divacky #include "llvm/CodeGen/MachineFunction.h"
144a16efa3SDimitry Andric #include "llvm/CodeGen/MachineFunctionPass.h"
157ab83427SDimitry Andric #include "llvm/CodeGen/Passes.h"
1658b69754SDimitry Andric #include "llvm/CodeGen/SlotIndexes.h"
17b60736ecSDimitry Andric #include "llvm/IR/PrintPasses.h"
18706b4fc4SDimitry Andric #include "llvm/InitializePasses.h"
1958b69754SDimitry Andric #include "llvm/Support/Debug.h"
204a16efa3SDimitry Andric #include "llvm/Support/raw_ostream.h"
21b5efedafSRoman Divacky 
22b5efedafSRoman Divacky using namespace llvm;
23b5efedafSRoman Divacky 
24b5efedafSRoman Divacky namespace {
25b5efedafSRoman Divacky /// MachineFunctionPrinterPass - This is a pass to dump the IR of a
26b5efedafSRoman Divacky /// MachineFunction.
27b5efedafSRoman Divacky ///
28b5efedafSRoman Divacky struct MachineFunctionPrinterPass : public MachineFunctionPass {
29b5efedafSRoman Divacky   static char ID;
30b5efedafSRoman Divacky 
31b5efedafSRoman Divacky   raw_ostream &OS;
32b5efedafSRoman Divacky   const std::string Banner;
33b5efedafSRoman Divacky 
MachineFunctionPrinterPass__anon1ed6c25f0111::MachineFunctionPrinterPass3458b69754SDimitry Andric   MachineFunctionPrinterPass() : MachineFunctionPass(ID), OS(dbgs()) { }
MachineFunctionPrinterPass__anon1ed6c25f0111::MachineFunctionPrinterPass35b5efedafSRoman Divacky   MachineFunctionPrinterPass(raw_ostream &os, const std::string &banner)
36d39c594dSDimitry Andric       : MachineFunctionPass(ID), OS(os), Banner(banner) {}
37b5efedafSRoman Divacky 
getPassName__anon1ed6c25f0111::MachineFunctionPrinterPass38b915e9e0SDimitry Andric   StringRef getPassName() const override { return "MachineFunction Printer"; }
39b5efedafSRoman Divacky 
getAnalysisUsage__anon1ed6c25f0111::MachineFunctionPrinterPass405ca98fd9SDimitry Andric   void getAnalysisUsage(AnalysisUsage &AU) const override {
41b5efedafSRoman Divacky     AU.setPreservesAll();
42ac9a064cSDimitry Andric     AU.addUsedIfAvailable<SlotIndexesWrapperPass>();
43b5efedafSRoman Divacky     MachineFunctionPass::getAnalysisUsage(AU);
44b5efedafSRoman Divacky   }
45b5efedafSRoman Divacky 
runOnMachineFunction__anon1ed6c25f0111::MachineFunctionPrinterPass465ca98fd9SDimitry Andric   bool runOnMachineFunction(MachineFunction &MF) override {
47b60736ecSDimitry Andric     if (!isFunctionInPrintList(MF.getName()))
48050e163aSDimitry Andric       return false;
49b5efedafSRoman Divacky     OS << "# " << Banner << ":\n";
50ac9a064cSDimitry Andric     auto *SIWrapper = getAnalysisIfAvailable<SlotIndexesWrapperPass>();
51ac9a064cSDimitry Andric     MF.print(OS, SIWrapper ? &SIWrapper->getSI() : nullptr);
52b5efedafSRoman Divacky     return false;
53b5efedafSRoman Divacky   }
54b5efedafSRoman Divacky };
55b5efedafSRoman Divacky 
56b5efedafSRoman Divacky char MachineFunctionPrinterPass::ID = 0;
571a82d4c0SDimitry Andric }
58b5efedafSRoman Divacky 
59522600a2SDimitry Andric char &llvm::MachineFunctionPrinterPassID = MachineFunctionPrinterPass::ID;
6067c32a98SDimitry Andric INITIALIZE_PASS(MachineFunctionPrinterPass, "machineinstr-printer",
6158b69754SDimitry Andric                 "Machine Function Printer", false, false)
6258b69754SDimitry Andric 
63b5efedafSRoman Divacky namespace llvm {
64b5efedafSRoman Divacky /// Returns a newly-created MachineFunction Printer pass. The
65b5efedafSRoman Divacky /// default banner is empty.
66b5efedafSRoman Divacky ///
createMachineFunctionPrinterPass(raw_ostream & OS,const std::string & Banner)67b5efedafSRoman Divacky MachineFunctionPass *createMachineFunctionPrinterPass(raw_ostream &OS,
68b5efedafSRoman Divacky                                                       const std::string &Banner){
69b5efedafSRoman Divacky   return new MachineFunctionPrinterPass(OS, Banner);
70b5efedafSRoman Divacky }
71b5efedafSRoman Divacky 
72b5efedafSRoman Divacky }
73