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