1*349cc55cSDimitry Andric //===-- CSKYAsmPrinter.cpp - CSKY LLVM assembly writer --------------------===// 2*349cc55cSDimitry Andric // 3*349cc55cSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*349cc55cSDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*349cc55cSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*349cc55cSDimitry Andric // 7*349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 8*349cc55cSDimitry Andric // 9*349cc55cSDimitry Andric // This file contains a printer that converts from our internal representation 10*349cc55cSDimitry Andric // of machine-dependent LLVM code to the CSKY assembly language. 11*349cc55cSDimitry Andric // 12*349cc55cSDimitry Andric //===----------------------------------------------------------------------===// 13*349cc55cSDimitry Andric #include "CSKYAsmPrinter.h" 14*349cc55cSDimitry Andric #include "CSKY.h" 15*349cc55cSDimitry Andric #include "CSKYTargetMachine.h" 16*349cc55cSDimitry Andric #include "MCTargetDesc/CSKYInstPrinter.h" 17*349cc55cSDimitry Andric #include "MCTargetDesc/CSKYMCExpr.h" 18*349cc55cSDimitry Andric #include "TargetInfo/CSKYTargetInfo.h" 19*349cc55cSDimitry Andric #include "llvm/ADT/Statistic.h" 20*349cc55cSDimitry Andric #include "llvm/CodeGen/AsmPrinter.h" 21*349cc55cSDimitry Andric #include "llvm/CodeGen/MachineConstantPool.h" 22*349cc55cSDimitry Andric #include "llvm/IR/DataLayout.h" 23*349cc55cSDimitry Andric #include "llvm/MC/MCAsmInfo.h" 24*349cc55cSDimitry Andric #include "llvm/MC/MCContext.h" 25*349cc55cSDimitry Andric #include "llvm/MC/MCInstBuilder.h" 26*349cc55cSDimitry Andric #include "llvm/MC/MCStreamer.h" 27*349cc55cSDimitry Andric #include "llvm/MC/TargetRegistry.h" 28*349cc55cSDimitry Andric 29*349cc55cSDimitry Andric using namespace llvm; 30*349cc55cSDimitry Andric 31*349cc55cSDimitry Andric #define DEBUG_TYPE "csky-asm-printer" 32*349cc55cSDimitry Andric 33*349cc55cSDimitry Andric CSKYAsmPrinter::CSKYAsmPrinter(llvm::TargetMachine &TM, 34*349cc55cSDimitry Andric std::unique_ptr<llvm::MCStreamer> Streamer) 35*349cc55cSDimitry Andric : AsmPrinter(TM, std::move(Streamer)), MCInstLowering(OutContext, *this) {} 36*349cc55cSDimitry Andric 37*349cc55cSDimitry Andric bool CSKYAsmPrinter::runOnMachineFunction(MachineFunction &MF) { 38*349cc55cSDimitry Andric Subtarget = &MF.getSubtarget<CSKYSubtarget>(); 39*349cc55cSDimitry Andric return AsmPrinter::runOnMachineFunction(MF); 40*349cc55cSDimitry Andric } 41*349cc55cSDimitry Andric 42*349cc55cSDimitry Andric // Simple pseudo-instructions have their lowering (with expansion to real 43*349cc55cSDimitry Andric // instructions) auto-generated. 44*349cc55cSDimitry Andric #include "CSKYGenMCPseudoLowering.inc" 45*349cc55cSDimitry Andric 46*349cc55cSDimitry Andric void CSKYAsmPrinter::emitInstruction(const MachineInstr *MI) { 47*349cc55cSDimitry Andric // Do any auto-generated pseudo lowerings. 48*349cc55cSDimitry Andric if (emitPseudoExpansionLowering(*OutStreamer, MI)) 49*349cc55cSDimitry Andric return; 50*349cc55cSDimitry Andric 51*349cc55cSDimitry Andric MCInst TmpInst; 52*349cc55cSDimitry Andric MCInstLowering.Lower(MI, TmpInst); 53*349cc55cSDimitry Andric EmitToStreamer(*OutStreamer, TmpInst); 54*349cc55cSDimitry Andric } 55*349cc55cSDimitry Andric 56*349cc55cSDimitry Andric extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeCSKYAsmPrinter() { 57*349cc55cSDimitry Andric RegisterAsmPrinter<CSKYAsmPrinter> X(getTheCSKYTarget()); 58*349cc55cSDimitry Andric } 59