xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/VE/VEAsmPrinter.cpp (revision 480093f4440d54b30b3025afeac24b48f2ba7a2e)
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