| //===-- VEAsmPrinter.cpp - VE LLVM assembly writer ------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file contains a printer that converts from our internal representation |
| // of machine-dependent LLVM code to GAS-format VE assembly language. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "InstPrinter/VEInstPrinter.h" |
| #include "MCTargetDesc/VETargetStreamer.h" |
| #include "VE.h" |
| #include "VEInstrInfo.h" |
| #include "VETargetMachine.h" |
| #include "llvm/CodeGen/AsmPrinter.h" |
| #include "llvm/CodeGen/MachineInstr.h" |
| #include "llvm/CodeGen/MachineModuleInfoImpls.h" |
| #include "llvm/CodeGen/MachineRegisterInfo.h" |
| #include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" |
| #include "llvm/IR/Mangler.h" |
| #include "llvm/MC/MCAsmInfo.h" |
| #include "llvm/MC/MCContext.h" |
| #include "llvm/MC/MCInst.h" |
| #include "llvm/MC/MCInstBuilder.h" |
| #include "llvm/MC/MCStreamer.h" |
| #include "llvm/MC/MCSymbol.h" |
| #include "llvm/Support/TargetRegistry.h" |
| #include "llvm/Support/raw_ostream.h" |
| using namespace llvm; |
| |
| #define DEBUG_TYPE "ve-asmprinter" |
| |
| namespace { |
| class VEAsmPrinter : public AsmPrinter { |
| VETargetStreamer &getTargetStreamer() { |
| return static_cast<VETargetStreamer &>(*OutStreamer->getTargetStreamer()); |
| } |
| |
| public: |
| explicit VEAsmPrinter(TargetMachine &TM, std::unique_ptr<MCStreamer> Streamer) |
| : AsmPrinter(TM, std::move(Streamer)) {} |
| |
| StringRef getPassName() const override { return "VE Assembly Printer"; } |
| |
| void EmitInstruction(const MachineInstr *MI) override; |
| |
| static const char *getRegisterName(unsigned RegNo) { |
| return VEInstPrinter::getRegisterName(RegNo); |
| } |
| }; |
| } // end of anonymous namespace |
| |
| void VEAsmPrinter::EmitInstruction(const MachineInstr *MI) { |
| |
| switch (MI->getOpcode()) { |
| default: |
| break; |
| case TargetOpcode::DBG_VALUE: |
| // FIXME: Debug Value. |
| return; |
| } |
| MachineBasicBlock::const_instr_iterator I = MI->getIterator(); |
| MachineBasicBlock::const_instr_iterator E = MI->getParent()->instr_end(); |
| do { |
| MCInst TmpInst; |
| LowerVEMachineInstrToMCInst(&*I, TmpInst, *this); |
| EmitToStreamer(*OutStreamer, TmpInst); |
| } while ((++I != E) && I->isInsideBundle()); // Delay slot check. |
| } |
| |
| // Force static initialization. |
| extern "C" void LLVMInitializeVEAsmPrinter() { |
| RegisterAsmPrinter<VEAsmPrinter> X(getTheVETarget()); |
| } |