12d1f6d67SPete Couperus //===- ARCAsmPrinter.cpp - ARC LLVM assembly writer -------------*- C++ -*-===// 22d1f6d67SPete Couperus // 32d1f6d67SPete Couperus // The LLVM Compiler Infrastructure 42d1f6d67SPete Couperus // 52d1f6d67SPete Couperus // This file is distributed under the University of Illinois Open Source 62d1f6d67SPete Couperus // License. See LICENSE.TXT for details. 72d1f6d67SPete Couperus // 82d1f6d67SPete Couperus //===----------------------------------------------------------------------===// 92d1f6d67SPete Couperus // 102d1f6d67SPete Couperus // This file contains a printer that converts from our internal representation 112d1f6d67SPete Couperus // of machine-dependent LLVM code to GNU format ARC assembly language. 122d1f6d67SPete Couperus // 132d1f6d67SPete Couperus //===----------------------------------------------------------------------===// 142d1f6d67SPete Couperus 152d1f6d67SPete Couperus #include "ARC.h" 162d1f6d67SPete Couperus #include "ARCInstrInfo.h" 172d1f6d67SPete Couperus #include "ARCMCInstLower.h" 182d1f6d67SPete Couperus #include "ARCSubtarget.h" 192d1f6d67SPete Couperus #include "ARCTargetMachine.h" 202d1f6d67SPete Couperus #include "ARCTargetStreamer.h" 212d1f6d67SPete Couperus #include "InstPrinter/ARCInstPrinter.h" 222d1f6d67SPete Couperus #include "llvm/ADT/SmallString.h" 232d1f6d67SPete Couperus #include "llvm/ADT/StringExtras.h" 242d1f6d67SPete Couperus #include "llvm/CodeGen/AsmPrinter.h" 252d1f6d67SPete Couperus #include "llvm/CodeGen/MachineFunctionPass.h" 262d1f6d67SPete Couperus #include "llvm/CodeGen/MachineInstr.h" 272d1f6d67SPete Couperus #include "llvm/CodeGen/MachineModuleInfo.h" 282d1f6d67SPete Couperus #include "llvm/MC/MCAsmInfo.h" 292d1f6d67SPete Couperus #include "llvm/MC/MCExpr.h" 302d1f6d67SPete Couperus #include "llvm/MC/MCInst.h" 312d1f6d67SPete Couperus #include "llvm/MC/MCStreamer.h" 322d1f6d67SPete Couperus #include "llvm/MC/MCSymbolELF.h" 332d1f6d67SPete Couperus #include "llvm/Support/ErrorHandling.h" 342d1f6d67SPete Couperus #include "llvm/Support/TargetRegistry.h" 352d1f6d67SPete Couperus #include "llvm/Support/raw_ostream.h" 36*6054e650SDavid Blaikie #include "llvm/Target/TargetLoweringObjectFile.h" 372d1f6d67SPete Couperus #include <algorithm> 382d1f6d67SPete Couperus 392d1f6d67SPete Couperus using namespace llvm; 402d1f6d67SPete Couperus 412d1f6d67SPete Couperus #define DEBUG_TYPE "asm-printer" 422d1f6d67SPete Couperus 432d1f6d67SPete Couperus namespace { 442d1f6d67SPete Couperus 452d1f6d67SPete Couperus class ARCAsmPrinter : public AsmPrinter { 462d1f6d67SPete Couperus ARCMCInstLower MCInstLowering; 472d1f6d67SPete Couperus ARCTargetStreamer &getTargetStreamer(); 482d1f6d67SPete Couperus 492d1f6d67SPete Couperus public: 502d1f6d67SPete Couperus explicit ARCAsmPrinter(TargetMachine &TM, 512d1f6d67SPete Couperus std::unique_ptr<MCStreamer> Streamer) 522d1f6d67SPete Couperus : AsmPrinter(TM, std::move(Streamer)), 532d1f6d67SPete Couperus MCInstLowering(&OutContext, *this) {} 542d1f6d67SPete Couperus 552d1f6d67SPete Couperus StringRef getPassName() const override { return "ARC Assembly Printer"; } 562d1f6d67SPete Couperus void EmitInstruction(const MachineInstr *MI) override; 572d1f6d67SPete Couperus }; 582d1f6d67SPete Couperus 592d1f6d67SPete Couperus } // end anonymous namespace 602d1f6d67SPete Couperus 612d1f6d67SPete Couperus ARCTargetStreamer &ARCAsmPrinter::getTargetStreamer() { 622d1f6d67SPete Couperus return static_cast<ARCTargetStreamer &>(*OutStreamer->getTargetStreamer()); 632d1f6d67SPete Couperus } 642d1f6d67SPete Couperus 652d1f6d67SPete Couperus void ARCAsmPrinter::EmitInstruction(const MachineInstr *MI) { 662d1f6d67SPete Couperus SmallString<128> Str; 672d1f6d67SPete Couperus raw_svector_ostream O(Str); 682d1f6d67SPete Couperus 692d1f6d67SPete Couperus switch (MI->getOpcode()) { 702d1f6d67SPete Couperus case ARC::DBG_VALUE: 712d1f6d67SPete Couperus llvm_unreachable("Should be handled target independently"); 722d1f6d67SPete Couperus break; 732d1f6d67SPete Couperus } 742d1f6d67SPete Couperus 752d1f6d67SPete Couperus MCInst TmpInst; 762d1f6d67SPete Couperus MCInstLowering.Lower(MI, TmpInst); 772d1f6d67SPete Couperus EmitToStreamer(*OutStreamer, TmpInst); 782d1f6d67SPete Couperus } 792d1f6d67SPete Couperus 802d1f6d67SPete Couperus // Force static initialization. 812d1f6d67SPete Couperus extern "C" void LLVMInitializeARCAsmPrinter() { 822d1f6d67SPete Couperus RegisterAsmPrinter<ARCAsmPrinter> X(getTheARCTarget()); 832d1f6d67SPete Couperus } 84