12bdb4e10SAlex Lorenz //===- MIRPrintingPass.cpp - Pass that prints out using the MIR format ----===// 22bdb4e10SAlex Lorenz // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 62bdb4e10SAlex Lorenz // 72bdb4e10SAlex Lorenz //===----------------------------------------------------------------------===// 82bdb4e10SAlex Lorenz // 92bdb4e10SAlex Lorenz // This file implements a pass that prints out the LLVM module using the MIR 102bdb4e10SAlex Lorenz // serialization format. 112bdb4e10SAlex Lorenz // 122bdb4e10SAlex Lorenz //===----------------------------------------------------------------------===// 132bdb4e10SAlex Lorenz 148940114fSMatthias Braun #include "llvm/CodeGen/MIRPrinter.h" 156bda14b3SChandler Carruth #include "llvm/CodeGen/MachineFunctionPass.h" 166bda14b3SChandler Carruth #include "llvm/CodeGen/Passes.h" 17*05da2fe5SReid Kleckner #include "llvm/InitializePasses.h" 182bdb4e10SAlex Lorenz #include "llvm/Support/Debug.h" 192bdb4e10SAlex Lorenz #include "llvm/Support/raw_ostream.h" 202bdb4e10SAlex Lorenz 212bdb4e10SAlex Lorenz using namespace llvm; 222bdb4e10SAlex Lorenz 232bdb4e10SAlex Lorenz namespace { 242bdb4e10SAlex Lorenz 252bdb4e10SAlex Lorenz /// This pass prints out the LLVM IR to an output stream using the MIR 262bdb4e10SAlex Lorenz /// serialization format. 272bdb4e10SAlex Lorenz struct MIRPrintingPass : public MachineFunctionPass { 282bdb4e10SAlex Lorenz static char ID; 292bdb4e10SAlex Lorenz raw_ostream &OS; 3078d7831bSAlex Lorenz std::string MachineFunctions; 312bdb4e10SAlex Lorenz MIRPrintingPass__anonc31d03ee0111::MIRPrintingPass322bdb4e10SAlex Lorenz MIRPrintingPass() : MachineFunctionPass(ID), OS(dbgs()) {} MIRPrintingPass__anonc31d03ee0111::MIRPrintingPass332bdb4e10SAlex Lorenz MIRPrintingPass(raw_ostream &OS) : MachineFunctionPass(ID), OS(OS) {} 342bdb4e10SAlex Lorenz getPassName__anonc31d03ee0111::MIRPrintingPass35117296c0SMehdi Amini StringRef getPassName() const override { return "MIR Printing Pass"; } 362bdb4e10SAlex Lorenz getAnalysisUsage__anonc31d03ee0111::MIRPrintingPass372bdb4e10SAlex Lorenz void getAnalysisUsage(AnalysisUsage &AU) const override { 382bdb4e10SAlex Lorenz AU.setPreservesAll(); 392bdb4e10SAlex Lorenz MachineFunctionPass::getAnalysisUsage(AU); 402bdb4e10SAlex Lorenz } 412bdb4e10SAlex Lorenz runOnMachineFunction__anonc31d03ee0111::MIRPrintingPass42aa15bffaSHans Wennborg bool runOnMachineFunction(MachineFunction &MF) override { 4378d7831bSAlex Lorenz std::string Str; 4478d7831bSAlex Lorenz raw_string_ostream StrOS(Str); 45345c1449SAlex Lorenz printMIR(StrOS, MF); 4678d7831bSAlex Lorenz MachineFunctions.append(StrOS.str()); 472bdb4e10SAlex Lorenz return false; 482bdb4e10SAlex Lorenz } 492bdb4e10SAlex Lorenz doFinalization__anonc31d03ee0111::MIRPrintingPass50aa15bffaSHans Wennborg bool doFinalization(Module &M) override { 51345c1449SAlex Lorenz printMIR(OS, M); 5278d7831bSAlex Lorenz OS << MachineFunctions; 532bdb4e10SAlex Lorenz return false; 542bdb4e10SAlex Lorenz } 552bdb4e10SAlex Lorenz }; 562bdb4e10SAlex Lorenz 572bdb4e10SAlex Lorenz char MIRPrintingPass::ID = 0; 582bdb4e10SAlex Lorenz 592bdb4e10SAlex Lorenz } // end anonymous namespace 602bdb4e10SAlex Lorenz 612bdb4e10SAlex Lorenz char &llvm::MIRPrintingPassID = MIRPrintingPass::ID; 622bdb4e10SAlex Lorenz INITIALIZE_PASS(MIRPrintingPass, "mir-printer", "MIR Printer", false, false) 632bdb4e10SAlex Lorenz 642bdb4e10SAlex Lorenz namespace llvm { 652bdb4e10SAlex Lorenz createPrintMIRPass(raw_ostream & OS)662bdb4e10SAlex LorenzMachineFunctionPass *createPrintMIRPass(raw_ostream &OS) { 672bdb4e10SAlex Lorenz return new MIRPrintingPass(OS); 682bdb4e10SAlex Lorenz } 692bdb4e10SAlex Lorenz 702bdb4e10SAlex Lorenz } // end namespace llvm 71