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"; } 44bcd24b2dSFangrui Song void emitInstruction(const MachineInstr *MI) override; 45*bbd78519SMatt Arsenault 46*bbd78519SMatt Arsenault bool runOnMachineFunction(MachineFunction &MF) override; 472d1f6d67SPete Couperus }; 482d1f6d67SPete Couperus 492d1f6d67SPete Couperus } // end anonymous namespace 502d1f6d67SPete Couperus 51bcd24b2dSFangrui Song void ARCAsmPrinter::emitInstruction(const MachineInstr *MI) { 522d1f6d67SPete Couperus SmallString<128> Str; 532d1f6d67SPete Couperus raw_svector_ostream O(Str); 542d1f6d67SPete Couperus 552d1f6d67SPete Couperus switch (MI->getOpcode()) { 562d1f6d67SPete Couperus case ARC::DBG_VALUE: 572d1f6d67SPete Couperus llvm_unreachable("Should be handled target independently"); 582d1f6d67SPete Couperus break; 592d1f6d67SPete Couperus } 602d1f6d67SPete Couperus 612d1f6d67SPete Couperus MCInst TmpInst; 622d1f6d67SPete Couperus MCInstLowering.Lower(MI, TmpInst); 632d1f6d67SPete Couperus EmitToStreamer(*OutStreamer, TmpInst); 642d1f6d67SPete Couperus } 652d1f6d67SPete Couperus 66*bbd78519SMatt Arsenault bool ARCAsmPrinter::runOnMachineFunction(MachineFunction &MF) { 67*bbd78519SMatt Arsenault // Functions are 4-byte aligned. 68*bbd78519SMatt Arsenault MF.ensureAlignment(Align(4)); 69*bbd78519SMatt Arsenault AsmPrinter::runOnMachineFunction(MF); 70*bbd78519SMatt Arsenault } 71*bbd78519SMatt Arsenault 722d1f6d67SPete Couperus // Force static initialization. 730dbcb363STom Stellard extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeARCAsmPrinter() { 742d1f6d67SPete Couperus RegisterAsmPrinter<ARCAsmPrinter> X(getTheARCTarget()); 752d1f6d67SPete Couperus } 76