1*2d1f6d67SPete Couperus //===- ARCAsmPrinter.cpp - ARC LLVM assembly writer -------------*- C++ -*-===// 2*2d1f6d67SPete Couperus // 3*2d1f6d67SPete Couperus // The LLVM Compiler Infrastructure 4*2d1f6d67SPete Couperus // 5*2d1f6d67SPete Couperus // This file is distributed under the University of Illinois Open Source 6*2d1f6d67SPete Couperus // License. See LICENSE.TXT for details. 7*2d1f6d67SPete Couperus // 8*2d1f6d67SPete Couperus //===----------------------------------------------------------------------===// 9*2d1f6d67SPete Couperus // 10*2d1f6d67SPete Couperus // This file contains a printer that converts from our internal representation 11*2d1f6d67SPete Couperus // of machine-dependent LLVM code to GNU format ARC assembly language. 12*2d1f6d67SPete Couperus // 13*2d1f6d67SPete Couperus //===----------------------------------------------------------------------===// 14*2d1f6d67SPete Couperus 15*2d1f6d67SPete Couperus #include "ARC.h" 16*2d1f6d67SPete Couperus #include "ARCInstrInfo.h" 17*2d1f6d67SPete Couperus #include "ARCMCInstLower.h" 18*2d1f6d67SPete Couperus #include "ARCSubtarget.h" 19*2d1f6d67SPete Couperus #include "ARCTargetMachine.h" 20*2d1f6d67SPete Couperus #include "ARCTargetStreamer.h" 21*2d1f6d67SPete Couperus #include "InstPrinter/ARCInstPrinter.h" 22*2d1f6d67SPete Couperus #include "llvm/ADT/SmallString.h" 23*2d1f6d67SPete Couperus #include "llvm/ADT/StringExtras.h" 24*2d1f6d67SPete Couperus #include "llvm/CodeGen/AsmPrinter.h" 25*2d1f6d67SPete Couperus #include "llvm/CodeGen/MachineFunctionPass.h" 26*2d1f6d67SPete Couperus #include "llvm/CodeGen/MachineInstr.h" 27*2d1f6d67SPete Couperus #include "llvm/CodeGen/MachineModuleInfo.h" 28*2d1f6d67SPete Couperus #include "llvm/MC/MCAsmInfo.h" 29*2d1f6d67SPete Couperus #include "llvm/MC/MCExpr.h" 30*2d1f6d67SPete Couperus #include "llvm/MC/MCInst.h" 31*2d1f6d67SPete Couperus #include "llvm/MC/MCStreamer.h" 32*2d1f6d67SPete Couperus #include "llvm/MC/MCSymbolELF.h" 33*2d1f6d67SPete Couperus #include "llvm/Support/ErrorHandling.h" 34*2d1f6d67SPete Couperus #include "llvm/Support/TargetRegistry.h" 35*2d1f6d67SPete Couperus #include "llvm/Support/raw_ostream.h" 36*2d1f6d67SPete Couperus #include "llvm/Target/TargetLoweringObjectFile.h" 37*2d1f6d67SPete Couperus #include <algorithm> 38*2d1f6d67SPete Couperus 39*2d1f6d67SPete Couperus using namespace llvm; 40*2d1f6d67SPete Couperus 41*2d1f6d67SPete Couperus #define DEBUG_TYPE "asm-printer" 42*2d1f6d67SPete Couperus 43*2d1f6d67SPete Couperus namespace { 44*2d1f6d67SPete Couperus 45*2d1f6d67SPete Couperus class ARCAsmPrinter : public AsmPrinter { 46*2d1f6d67SPete Couperus ARCMCInstLower MCInstLowering; 47*2d1f6d67SPete Couperus ARCTargetStreamer &getTargetStreamer(); 48*2d1f6d67SPete Couperus 49*2d1f6d67SPete Couperus public: 50*2d1f6d67SPete Couperus explicit ARCAsmPrinter(TargetMachine &TM, 51*2d1f6d67SPete Couperus std::unique_ptr<MCStreamer> Streamer) 52*2d1f6d67SPete Couperus : AsmPrinter(TM, std::move(Streamer)), 53*2d1f6d67SPete Couperus MCInstLowering(&OutContext, *this) {} 54*2d1f6d67SPete Couperus 55*2d1f6d67SPete Couperus StringRef getPassName() const override { return "ARC Assembly Printer"; } 56*2d1f6d67SPete Couperus void EmitInstruction(const MachineInstr *MI) override; 57*2d1f6d67SPete Couperus }; 58*2d1f6d67SPete Couperus 59*2d1f6d67SPete Couperus } // end anonymous namespace 60*2d1f6d67SPete Couperus 61*2d1f6d67SPete Couperus ARCTargetStreamer &ARCAsmPrinter::getTargetStreamer() { 62*2d1f6d67SPete Couperus return static_cast<ARCTargetStreamer &>(*OutStreamer->getTargetStreamer()); 63*2d1f6d67SPete Couperus } 64*2d1f6d67SPete Couperus 65*2d1f6d67SPete Couperus void ARCAsmPrinter::EmitInstruction(const MachineInstr *MI) { 66*2d1f6d67SPete Couperus SmallString<128> Str; 67*2d1f6d67SPete Couperus raw_svector_ostream O(Str); 68*2d1f6d67SPete Couperus 69*2d1f6d67SPete Couperus switch (MI->getOpcode()) { 70*2d1f6d67SPete Couperus case ARC::DBG_VALUE: 71*2d1f6d67SPete Couperus llvm_unreachable("Should be handled target independently"); 72*2d1f6d67SPete Couperus break; 73*2d1f6d67SPete Couperus } 74*2d1f6d67SPete Couperus 75*2d1f6d67SPete Couperus MCInst TmpInst; 76*2d1f6d67SPete Couperus MCInstLowering.Lower(MI, TmpInst); 77*2d1f6d67SPete Couperus EmitToStreamer(*OutStreamer, TmpInst); 78*2d1f6d67SPete Couperus } 79*2d1f6d67SPete Couperus 80*2d1f6d67SPete Couperus // Force static initialization. 81*2d1f6d67SPete Couperus extern "C" void LLVMInitializeARCAsmPrinter() { 82*2d1f6d67SPete Couperus RegisterAsmPrinter<ARCAsmPrinter> X(getTheARCTarget()); 83*2d1f6d67SPete Couperus } 84