12d1f6d67SPete Couperus //===- ARCAsmPrinter.cpp - ARC LLVM assembly writer -------------*- C++ -*-===// 22d1f6d67SPete Couperus // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 62d1f6d67SPete Couperus // 72d1f6d67SPete Couperus //===----------------------------------------------------------------------===// 82d1f6d67SPete Couperus // 92d1f6d67SPete Couperus // This file contains a printer that converts from our internal representation 102d1f6d67SPete Couperus // of machine-dependent LLVM code to GNU format ARC assembly language. 112d1f6d67SPete Couperus // 122d1f6d67SPete Couperus //===----------------------------------------------------------------------===// 132d1f6d67SPete Couperus 142d1f6d67SPete Couperus #include "ARC.h" 152d1f6d67SPete Couperus #include "ARCMCInstLower.h" 162d1f6d67SPete Couperus #include "ARCSubtarget.h" 172d1f6d67SPete Couperus #include "ARCTargetMachine.h" 18dcf1ea08SRichard Trieu #include "MCTargetDesc/ARCInstPrinter.h" 197f9a008aSRichard Trieu #include "TargetInfo/ARCTargetInfo.h" 202d1f6d67SPete Couperus #include "llvm/CodeGen/AsmPrinter.h" 212d1f6d67SPete Couperus #include "llvm/CodeGen/MachineInstr.h" 222d1f6d67SPete Couperus #include "llvm/MC/MCAsmInfo.h" 232d1f6d67SPete Couperus #include "llvm/MC/MCInst.h" 242d1f6d67SPete Couperus #include "llvm/MC/MCStreamer.h" 252d1f6d67SPete Couperus #include "llvm/Support/TargetRegistry.h" 262d1f6d67SPete Couperus #include "llvm/Support/raw_ostream.h" 272d1f6d67SPete Couperus 282d1f6d67SPete Couperus using namespace llvm; 292d1f6d67SPete Couperus 302d1f6d67SPete Couperus #define DEBUG_TYPE "asm-printer" 312d1f6d67SPete Couperus 322d1f6d67SPete Couperus namespace { 332d1f6d67SPete Couperus 342d1f6d67SPete Couperus class ARCAsmPrinter : public AsmPrinter { 352d1f6d67SPete Couperus ARCMCInstLower MCInstLowering; 362d1f6d67SPete Couperus 372d1f6d67SPete Couperus public: 382d1f6d67SPete Couperus explicit ARCAsmPrinter(TargetMachine &TM, 392d1f6d67SPete Couperus std::unique_ptr<MCStreamer> Streamer) 402d1f6d67SPete Couperus : AsmPrinter(TM, std::move(Streamer)), 412d1f6d67SPete Couperus MCInstLowering(&OutContext, *this) {} 422d1f6d67SPete Couperus 432d1f6d67SPete Couperus StringRef getPassName() const override { return "ARC Assembly Printer"; } 442d1f6d67SPete Couperus void EmitInstruction(const MachineInstr *MI) override; 452d1f6d67SPete Couperus }; 462d1f6d67SPete Couperus 472d1f6d67SPete Couperus } // end anonymous namespace 482d1f6d67SPete Couperus 492d1f6d67SPete Couperus void ARCAsmPrinter::EmitInstruction(const MachineInstr *MI) { 502d1f6d67SPete Couperus SmallString<128> Str; 512d1f6d67SPete Couperus raw_svector_ostream O(Str); 522d1f6d67SPete Couperus 532d1f6d67SPete Couperus switch (MI->getOpcode()) { 542d1f6d67SPete Couperus case ARC::DBG_VALUE: 552d1f6d67SPete Couperus llvm_unreachable("Should be handled target independently"); 562d1f6d67SPete Couperus break; 572d1f6d67SPete Couperus } 582d1f6d67SPete Couperus 592d1f6d67SPete Couperus MCInst TmpInst; 602d1f6d67SPete Couperus MCInstLowering.Lower(MI, TmpInst); 612d1f6d67SPete Couperus EmitToStreamer(*OutStreamer, TmpInst); 622d1f6d67SPete Couperus } 632d1f6d67SPete Couperus 642d1f6d67SPete Couperus // Force static initialization. 65*0dbcb363STom Stellard extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeARCAsmPrinter() { 662d1f6d67SPete Couperus RegisterAsmPrinter<ARCAsmPrinter> X(getTheARCTarget()); 672d1f6d67SPete Couperus } 68