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 Lorenz MachineFunctionPass *createPrintMIRPass(raw_ostream &OS) {
672bdb4e10SAlex Lorenz   return new MIRPrintingPass(OS);
682bdb4e10SAlex Lorenz }
692bdb4e10SAlex Lorenz 
702bdb4e10SAlex Lorenz } // end namespace llvm
71