10b57cec5SDimitry Andric //===- MIRPrintingPass.cpp - Pass that prints out using the MIR format ----===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric // 90b57cec5SDimitry Andric // This file implements a pass that prints out the LLVM module using the MIR 100b57cec5SDimitry Andric // serialization format. 110b57cec5SDimitry Andric // 120b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 130b57cec5SDimitry Andric 140b57cec5SDimitry Andric #include "llvm/CodeGen/MIRPrinter.h" 150b57cec5SDimitry Andric #include "llvm/CodeGen/MachineFunctionPass.h" 160b57cec5SDimitry Andric #include "llvm/CodeGen/Passes.h" 17480093f4SDimitry Andric #include "llvm/InitializePasses.h" 180b57cec5SDimitry Andric 190b57cec5SDimitry Andric using namespace llvm; 200b57cec5SDimitry Andric 21*0fca6ea1SDimitry Andric PreservedAnalyses PrintMIRPreparePass::run(Module &M, ModuleAnalysisManager &) { 22*0fca6ea1SDimitry Andric printMIR(OS, M); 23*0fca6ea1SDimitry Andric return PreservedAnalyses::all(); 24*0fca6ea1SDimitry Andric } 25*0fca6ea1SDimitry Andric 26*0fca6ea1SDimitry Andric PreservedAnalyses PrintMIRPass::run(MachineFunction &MF, 27*0fca6ea1SDimitry Andric MachineFunctionAnalysisManager &) { 28*0fca6ea1SDimitry Andric printMIR(OS, MF); 29*0fca6ea1SDimitry Andric return PreservedAnalyses::all(); 30*0fca6ea1SDimitry Andric } 31*0fca6ea1SDimitry Andric 320b57cec5SDimitry Andric namespace { 330b57cec5SDimitry Andric 340b57cec5SDimitry Andric /// This pass prints out the LLVM IR to an output stream using the MIR 350b57cec5SDimitry Andric /// serialization format. 360b57cec5SDimitry Andric struct MIRPrintingPass : public MachineFunctionPass { 370b57cec5SDimitry Andric static char ID; 380b57cec5SDimitry Andric raw_ostream &OS; 390b57cec5SDimitry Andric std::string MachineFunctions; 400b57cec5SDimitry Andric 410b57cec5SDimitry Andric MIRPrintingPass() : MachineFunctionPass(ID), OS(dbgs()) {} 420b57cec5SDimitry Andric MIRPrintingPass(raw_ostream &OS) : MachineFunctionPass(ID), OS(OS) {} 430b57cec5SDimitry Andric 440b57cec5SDimitry Andric StringRef getPassName() const override { return "MIR Printing Pass"; } 450b57cec5SDimitry Andric 460b57cec5SDimitry Andric void getAnalysisUsage(AnalysisUsage &AU) const override { 470b57cec5SDimitry Andric AU.setPreservesAll(); 480b57cec5SDimitry Andric MachineFunctionPass::getAnalysisUsage(AU); 490b57cec5SDimitry Andric } 500b57cec5SDimitry Andric 510b57cec5SDimitry Andric bool runOnMachineFunction(MachineFunction &MF) override { 520b57cec5SDimitry Andric std::string Str; 530b57cec5SDimitry Andric raw_string_ostream StrOS(Str); 540b57cec5SDimitry Andric printMIR(StrOS, MF); 55*0fca6ea1SDimitry Andric MachineFunctions.append(Str); 560b57cec5SDimitry Andric return false; 570b57cec5SDimitry Andric } 580b57cec5SDimitry Andric 590b57cec5SDimitry Andric bool doFinalization(Module &M) override { 600b57cec5SDimitry Andric printMIR(OS, M); 610b57cec5SDimitry Andric OS << MachineFunctions; 620b57cec5SDimitry Andric return false; 630b57cec5SDimitry Andric } 640b57cec5SDimitry Andric }; 650b57cec5SDimitry Andric 660b57cec5SDimitry Andric char MIRPrintingPass::ID = 0; 670b57cec5SDimitry Andric 680b57cec5SDimitry Andric } // end anonymous namespace 690b57cec5SDimitry Andric 700b57cec5SDimitry Andric char &llvm::MIRPrintingPassID = MIRPrintingPass::ID; 710b57cec5SDimitry Andric INITIALIZE_PASS(MIRPrintingPass, "mir-printer", "MIR Printer", false, false) 720b57cec5SDimitry Andric 730b57cec5SDimitry Andric namespace llvm { 740b57cec5SDimitry Andric 750b57cec5SDimitry Andric MachineFunctionPass *createPrintMIRPass(raw_ostream &OS) { 760b57cec5SDimitry Andric return new MIRPrintingPass(OS); 770b57cec5SDimitry Andric } 780b57cec5SDimitry Andric 790b57cec5SDimitry Andric } // end namespace llvm 80