1*06f32e7eSjoerg //===-- AVRMCTargetDesc.cpp - AVR Target Descriptions ---------------------===//
2*06f32e7eSjoerg //
3*06f32e7eSjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*06f32e7eSjoerg // See https://llvm.org/LICENSE.txt for license information.
5*06f32e7eSjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*06f32e7eSjoerg //
7*06f32e7eSjoerg //===----------------------------------------------------------------------===//
8*06f32e7eSjoerg //
9*06f32e7eSjoerg // This file provides AVR specific target descriptions.
10*06f32e7eSjoerg //
11*06f32e7eSjoerg //===----------------------------------------------------------------------===//
12*06f32e7eSjoerg 
13*06f32e7eSjoerg #include "AVRELFStreamer.h"
14*06f32e7eSjoerg #include "AVRInstPrinter.h"
15*06f32e7eSjoerg #include "AVRMCAsmInfo.h"
16*06f32e7eSjoerg #include "AVRMCELFStreamer.h"
17*06f32e7eSjoerg #include "AVRMCTargetDesc.h"
18*06f32e7eSjoerg #include "AVRTargetStreamer.h"
19*06f32e7eSjoerg #include "TargetInfo/AVRTargetInfo.h"
20*06f32e7eSjoerg 
21*06f32e7eSjoerg #include "llvm/MC/MCAsmBackend.h"
22*06f32e7eSjoerg #include "llvm/MC/MCELFStreamer.h"
23*06f32e7eSjoerg #include "llvm/MC/MCCodeEmitter.h"
24*06f32e7eSjoerg #include "llvm/MC/MCInstrInfo.h"
25*06f32e7eSjoerg #include "llvm/MC/MCRegisterInfo.h"
26*06f32e7eSjoerg #include "llvm/MC/MCSubtargetInfo.h"
27*06f32e7eSjoerg #include "llvm/Support/TargetRegistry.h"
28*06f32e7eSjoerg 
29*06f32e7eSjoerg #define GET_INSTRINFO_MC_DESC
30*06f32e7eSjoerg #include "AVRGenInstrInfo.inc"
31*06f32e7eSjoerg 
32*06f32e7eSjoerg #define GET_SUBTARGETINFO_MC_DESC
33*06f32e7eSjoerg #include "AVRGenSubtargetInfo.inc"
34*06f32e7eSjoerg 
35*06f32e7eSjoerg #define GET_REGINFO_MC_DESC
36*06f32e7eSjoerg #include "AVRGenRegisterInfo.inc"
37*06f32e7eSjoerg 
38*06f32e7eSjoerg using namespace llvm;
39*06f32e7eSjoerg 
40*06f32e7eSjoerg MCInstrInfo *llvm::createAVRMCInstrInfo() {
41*06f32e7eSjoerg   MCInstrInfo *X = new MCInstrInfo();
42*06f32e7eSjoerg   InitAVRMCInstrInfo(X);
43*06f32e7eSjoerg 
44*06f32e7eSjoerg   return X;
45*06f32e7eSjoerg }
46*06f32e7eSjoerg 
47*06f32e7eSjoerg static MCRegisterInfo *createAVRMCRegisterInfo(const Triple &TT) {
48*06f32e7eSjoerg   MCRegisterInfo *X = new MCRegisterInfo();
49*06f32e7eSjoerg   InitAVRMCRegisterInfo(X, 0);
50*06f32e7eSjoerg 
51*06f32e7eSjoerg   return X;
52*06f32e7eSjoerg }
53*06f32e7eSjoerg 
54*06f32e7eSjoerg static MCSubtargetInfo *createAVRMCSubtargetInfo(const Triple &TT,
55*06f32e7eSjoerg                                                  StringRef CPU, StringRef FS) {
56*06f32e7eSjoerg   return createAVRMCSubtargetInfoImpl(TT, CPU, FS);
57*06f32e7eSjoerg }
58*06f32e7eSjoerg 
59*06f32e7eSjoerg static MCInstPrinter *createAVRMCInstPrinter(const Triple &T,
60*06f32e7eSjoerg                                              unsigned SyntaxVariant,
61*06f32e7eSjoerg                                              const MCAsmInfo &MAI,
62*06f32e7eSjoerg                                              const MCInstrInfo &MII,
63*06f32e7eSjoerg                                              const MCRegisterInfo &MRI) {
64*06f32e7eSjoerg   if (SyntaxVariant == 0) {
65*06f32e7eSjoerg     return new AVRInstPrinter(MAI, MII, MRI);
66*06f32e7eSjoerg   }
67*06f32e7eSjoerg 
68*06f32e7eSjoerg   return nullptr;
69*06f32e7eSjoerg }
70*06f32e7eSjoerg 
71*06f32e7eSjoerg static MCStreamer *createMCStreamer(const Triple &T, MCContext &Context,
72*06f32e7eSjoerg                                     std::unique_ptr<MCAsmBackend> &&MAB,
73*06f32e7eSjoerg                                     std::unique_ptr<MCObjectWriter> &&OW,
74*06f32e7eSjoerg                                     std::unique_ptr<MCCodeEmitter> &&Emitter,
75*06f32e7eSjoerg                                     bool RelaxAll) {
76*06f32e7eSjoerg   return createELFStreamer(Context, std::move(MAB), std::move(OW),
77*06f32e7eSjoerg                            std::move(Emitter), RelaxAll);
78*06f32e7eSjoerg }
79*06f32e7eSjoerg 
80*06f32e7eSjoerg static MCTargetStreamer *
81*06f32e7eSjoerg createAVRObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {
82*06f32e7eSjoerg   return new AVRELFStreamer(S, STI);
83*06f32e7eSjoerg }
84*06f32e7eSjoerg 
85*06f32e7eSjoerg static MCTargetStreamer *createMCAsmTargetStreamer(MCStreamer &S,
86*06f32e7eSjoerg                                                    formatted_raw_ostream &OS,
87*06f32e7eSjoerg                                                    MCInstPrinter *InstPrint,
88*06f32e7eSjoerg                                                    bool isVerboseAsm) {
89*06f32e7eSjoerg   return new AVRTargetAsmStreamer(S);
90*06f32e7eSjoerg }
91*06f32e7eSjoerg 
92*06f32e7eSjoerg extern "C" void LLVMInitializeAVRTargetMC() {
93*06f32e7eSjoerg   // Register the MC asm info.
94*06f32e7eSjoerg   RegisterMCAsmInfo<AVRMCAsmInfo> X(getTheAVRTarget());
95*06f32e7eSjoerg 
96*06f32e7eSjoerg   // Register the MC instruction info.
97*06f32e7eSjoerg   TargetRegistry::RegisterMCInstrInfo(getTheAVRTarget(), createAVRMCInstrInfo);
98*06f32e7eSjoerg 
99*06f32e7eSjoerg   // Register the MC register info.
100*06f32e7eSjoerg   TargetRegistry::RegisterMCRegInfo(getTheAVRTarget(), createAVRMCRegisterInfo);
101*06f32e7eSjoerg 
102*06f32e7eSjoerg   // Register the MC subtarget info.
103*06f32e7eSjoerg   TargetRegistry::RegisterMCSubtargetInfo(getTheAVRTarget(),
104*06f32e7eSjoerg                                           createAVRMCSubtargetInfo);
105*06f32e7eSjoerg 
106*06f32e7eSjoerg   // Register the MCInstPrinter.
107*06f32e7eSjoerg   TargetRegistry::RegisterMCInstPrinter(getTheAVRTarget(),
108*06f32e7eSjoerg                                         createAVRMCInstPrinter);
109*06f32e7eSjoerg 
110*06f32e7eSjoerg   // Register the MC Code Emitter
111*06f32e7eSjoerg   TargetRegistry::RegisterMCCodeEmitter(getTheAVRTarget(), createAVRMCCodeEmitter);
112*06f32e7eSjoerg 
113*06f32e7eSjoerg   // Register the obj streamer
114*06f32e7eSjoerg   TargetRegistry::RegisterELFStreamer(getTheAVRTarget(), createMCStreamer);
115*06f32e7eSjoerg 
116*06f32e7eSjoerg   // Register the obj target streamer.
117*06f32e7eSjoerg   TargetRegistry::RegisterObjectTargetStreamer(getTheAVRTarget(),
118*06f32e7eSjoerg                                                createAVRObjectTargetStreamer);
119*06f32e7eSjoerg 
120*06f32e7eSjoerg   // Register the asm target streamer.
121*06f32e7eSjoerg   TargetRegistry::RegisterAsmTargetStreamer(getTheAVRTarget(),
122*06f32e7eSjoerg                                             createMCAsmTargetStreamer);
123*06f32e7eSjoerg 
124*06f32e7eSjoerg   // Register the asm backend (as little endian).
125*06f32e7eSjoerg   TargetRegistry::RegisterMCAsmBackend(getTheAVRTarget(), createAVRAsmBackend);
126*06f32e7eSjoerg }
127*06f32e7eSjoerg 
128