1*480093f4SDimitry Andric //===-- VEAsmPrinter.cpp - VE LLVM assembly writer ------------------------===// 2*480093f4SDimitry Andric // 3*480093f4SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*480093f4SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*480093f4SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*480093f4SDimitry Andric // 7*480093f4SDimitry Andric //===----------------------------------------------------------------------===// 8*480093f4SDimitry Andric // 9*480093f4SDimitry Andric // This file contains a printer that converts from our internal representation 10*480093f4SDimitry Andric // of machine-dependent LLVM code to GAS-format VE assembly language. 11*480093f4SDimitry Andric // 12*480093f4SDimitry Andric //===----------------------------------------------------------------------===// 13*480093f4SDimitry Andric 14*480093f4SDimitry Andric #include "InstPrinter/VEInstPrinter.h" 15*480093f4SDimitry Andric #include "MCTargetDesc/VETargetStreamer.h" 16*480093f4SDimitry Andric #include "VE.h" 17*480093f4SDimitry Andric #include "VEInstrInfo.h" 18*480093f4SDimitry Andric #include "VETargetMachine.h" 19*480093f4SDimitry Andric #include "llvm/CodeGen/AsmPrinter.h" 20*480093f4SDimitry Andric #include "llvm/CodeGen/MachineInstr.h" 21*480093f4SDimitry Andric #include "llvm/CodeGen/MachineModuleInfoImpls.h" 22*480093f4SDimitry Andric #include "llvm/CodeGen/MachineRegisterInfo.h" 23*480093f4SDimitry Andric #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" 24*480093f4SDimitry Andric #include "llvm/IR/Mangler.h" 25*480093f4SDimitry Andric #include "llvm/MC/MCAsmInfo.h" 26*480093f4SDimitry Andric #include "llvm/MC/MCContext.h" 27*480093f4SDimitry Andric #include "llvm/MC/MCInst.h" 28*480093f4SDimitry Andric #include "llvm/MC/MCInstBuilder.h" 29*480093f4SDimitry Andric #include "llvm/MC/MCStreamer.h" 30*480093f4SDimitry Andric #include "llvm/MC/MCSymbol.h" 31*480093f4SDimitry Andric #include "llvm/Support/TargetRegistry.h" 32*480093f4SDimitry Andric #include "llvm/Support/raw_ostream.h" 33*480093f4SDimitry Andric using namespace llvm; 34*480093f4SDimitry Andric 35*480093f4SDimitry Andric #define DEBUG_TYPE "ve-asmprinter" 36*480093f4SDimitry Andric 37*480093f4SDimitry Andric namespace { 38*480093f4SDimitry Andric class VEAsmPrinter : public AsmPrinter { 39*480093f4SDimitry Andric VETargetStreamer &getTargetStreamer() { 40*480093f4SDimitry Andric return static_cast<VETargetStreamer &>(*OutStreamer->getTargetStreamer()); 41*480093f4SDimitry Andric } 42*480093f4SDimitry Andric 43*480093f4SDimitry Andric public: 44*480093f4SDimitry Andric explicit VEAsmPrinter(TargetMachine &TM, std::unique_ptr<MCStreamer> Streamer) 45*480093f4SDimitry Andric : AsmPrinter(TM, std::move(Streamer)) {} 46*480093f4SDimitry Andric 47*480093f4SDimitry Andric StringRef getPassName() const override { return "VE Assembly Printer"; } 48*480093f4SDimitry Andric 49*480093f4SDimitry Andric void EmitInstruction(const MachineInstr *MI) override; 50*480093f4SDimitry Andric 51*480093f4SDimitry Andric static const char *getRegisterName(unsigned RegNo) { 52*480093f4SDimitry Andric return VEInstPrinter::getRegisterName(RegNo); 53*480093f4SDimitry Andric } 54*480093f4SDimitry Andric }; 55*480093f4SDimitry Andric } // end of anonymous namespace 56*480093f4SDimitry Andric 57*480093f4SDimitry Andric void VEAsmPrinter::EmitInstruction(const MachineInstr *MI) { 58*480093f4SDimitry Andric 59*480093f4SDimitry Andric switch (MI->getOpcode()) { 60*480093f4SDimitry Andric default: 61*480093f4SDimitry Andric break; 62*480093f4SDimitry Andric case TargetOpcode::DBG_VALUE: 63*480093f4SDimitry Andric // FIXME: Debug Value. 64*480093f4SDimitry Andric return; 65*480093f4SDimitry Andric } 66*480093f4SDimitry Andric MachineBasicBlock::const_instr_iterator I = MI->getIterator(); 67*480093f4SDimitry Andric MachineBasicBlock::const_instr_iterator E = MI->getParent()->instr_end(); 68*480093f4SDimitry Andric do { 69*480093f4SDimitry Andric MCInst TmpInst; 70*480093f4SDimitry Andric LowerVEMachineInstrToMCInst(&*I, TmpInst, *this); 71*480093f4SDimitry Andric EmitToStreamer(*OutStreamer, TmpInst); 72*480093f4SDimitry Andric } while ((++I != E) && I->isInsideBundle()); // Delay slot check. 73*480093f4SDimitry Andric } 74*480093f4SDimitry Andric 75*480093f4SDimitry Andric // Force static initialization. 76*480093f4SDimitry Andric extern "C" void LLVMInitializeVEAsmPrinter() { 77*480093f4SDimitry Andric RegisterAsmPrinter<VEAsmPrinter> X(getTheVETarget()); 78*480093f4SDimitry Andric } 79