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