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