106f32e7eSjoerg //===-- AVRMCTargetDesc.cpp - AVR Target Descriptions ---------------------===//
206f32e7eSjoerg //
306f32e7eSjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
406f32e7eSjoerg // See https://llvm.org/LICENSE.txt for license information.
506f32e7eSjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
606f32e7eSjoerg //
706f32e7eSjoerg //===----------------------------------------------------------------------===//
806f32e7eSjoerg //
906f32e7eSjoerg // This file provides AVR specific target descriptions.
1006f32e7eSjoerg //
1106f32e7eSjoerg //===----------------------------------------------------------------------===//
1206f32e7eSjoerg 
1306f32e7eSjoerg #include "AVRELFStreamer.h"
1406f32e7eSjoerg #include "AVRInstPrinter.h"
1506f32e7eSjoerg #include "AVRMCAsmInfo.h"
1606f32e7eSjoerg #include "AVRMCELFStreamer.h"
1706f32e7eSjoerg #include "AVRMCTargetDesc.h"
1806f32e7eSjoerg #include "AVRTargetStreamer.h"
1906f32e7eSjoerg #include "TargetInfo/AVRTargetInfo.h"
2006f32e7eSjoerg 
2106f32e7eSjoerg #include "llvm/MC/MCAsmBackend.h"
2206f32e7eSjoerg #include "llvm/MC/MCELFStreamer.h"
2306f32e7eSjoerg #include "llvm/MC/MCCodeEmitter.h"
2406f32e7eSjoerg #include "llvm/MC/MCInstrInfo.h"
2506f32e7eSjoerg #include "llvm/MC/MCRegisterInfo.h"
2606f32e7eSjoerg #include "llvm/MC/MCSubtargetInfo.h"
2706f32e7eSjoerg #include "llvm/Support/TargetRegistry.h"
2806f32e7eSjoerg 
2906f32e7eSjoerg #define GET_INSTRINFO_MC_DESC
3006f32e7eSjoerg #include "AVRGenInstrInfo.inc"
3106f32e7eSjoerg 
3206f32e7eSjoerg #define GET_SUBTARGETINFO_MC_DESC
3306f32e7eSjoerg #include "AVRGenSubtargetInfo.inc"
3406f32e7eSjoerg 
3506f32e7eSjoerg #define GET_REGINFO_MC_DESC
3606f32e7eSjoerg #include "AVRGenRegisterInfo.inc"
3706f32e7eSjoerg 
3806f32e7eSjoerg using namespace llvm;
3906f32e7eSjoerg 
createAVRMCInstrInfo()4006f32e7eSjoerg MCInstrInfo *llvm::createAVRMCInstrInfo() {
4106f32e7eSjoerg   MCInstrInfo *X = new MCInstrInfo();
4206f32e7eSjoerg   InitAVRMCInstrInfo(X);
4306f32e7eSjoerg 
4406f32e7eSjoerg   return X;
4506f32e7eSjoerg }
4606f32e7eSjoerg 
createAVRMCRegisterInfo(const Triple & TT)4706f32e7eSjoerg static MCRegisterInfo *createAVRMCRegisterInfo(const Triple &TT) {
4806f32e7eSjoerg   MCRegisterInfo *X = new MCRegisterInfo();
4906f32e7eSjoerg   InitAVRMCRegisterInfo(X, 0);
5006f32e7eSjoerg 
5106f32e7eSjoerg   return X;
5206f32e7eSjoerg }
5306f32e7eSjoerg 
createAVRMCSubtargetInfo(const Triple & TT,StringRef CPU,StringRef FS)5406f32e7eSjoerg static MCSubtargetInfo *createAVRMCSubtargetInfo(const Triple &TT,
5506f32e7eSjoerg                                                  StringRef CPU, StringRef FS) {
56*da58b97aSjoerg   return createAVRMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS);
5706f32e7eSjoerg }
5806f32e7eSjoerg 
createAVRMCInstPrinter(const Triple & T,unsigned SyntaxVariant,const MCAsmInfo & MAI,const MCInstrInfo & MII,const MCRegisterInfo & MRI)5906f32e7eSjoerg static MCInstPrinter *createAVRMCInstPrinter(const Triple &T,
6006f32e7eSjoerg                                              unsigned SyntaxVariant,
6106f32e7eSjoerg                                              const MCAsmInfo &MAI,
6206f32e7eSjoerg                                              const MCInstrInfo &MII,
6306f32e7eSjoerg                                              const MCRegisterInfo &MRI) {
6406f32e7eSjoerg   if (SyntaxVariant == 0) {
6506f32e7eSjoerg     return new AVRInstPrinter(MAI, MII, MRI);
6606f32e7eSjoerg   }
6706f32e7eSjoerg 
6806f32e7eSjoerg   return nullptr;
6906f32e7eSjoerg }
7006f32e7eSjoerg 
createMCStreamer(const Triple & T,MCContext & Context,std::unique_ptr<MCAsmBackend> && MAB,std::unique_ptr<MCObjectWriter> && OW,std::unique_ptr<MCCodeEmitter> && Emitter,bool RelaxAll)7106f32e7eSjoerg static MCStreamer *createMCStreamer(const Triple &T, MCContext &Context,
7206f32e7eSjoerg                                     std::unique_ptr<MCAsmBackend> &&MAB,
7306f32e7eSjoerg                                     std::unique_ptr<MCObjectWriter> &&OW,
7406f32e7eSjoerg                                     std::unique_ptr<MCCodeEmitter> &&Emitter,
7506f32e7eSjoerg                                     bool RelaxAll) {
7606f32e7eSjoerg   return createELFStreamer(Context, std::move(MAB), std::move(OW),
7706f32e7eSjoerg                            std::move(Emitter), RelaxAll);
7806f32e7eSjoerg }
7906f32e7eSjoerg 
8006f32e7eSjoerg static MCTargetStreamer *
createAVRObjectTargetStreamer(MCStreamer & S,const MCSubtargetInfo & STI)8106f32e7eSjoerg createAVRObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {
8206f32e7eSjoerg   return new AVRELFStreamer(S, STI);
8306f32e7eSjoerg }
8406f32e7eSjoerg 
createMCAsmTargetStreamer(MCStreamer & S,formatted_raw_ostream & OS,MCInstPrinter * InstPrint,bool isVerboseAsm)8506f32e7eSjoerg static MCTargetStreamer *createMCAsmTargetStreamer(MCStreamer &S,
8606f32e7eSjoerg                                                    formatted_raw_ostream &OS,
8706f32e7eSjoerg                                                    MCInstPrinter *InstPrint,
8806f32e7eSjoerg                                                    bool isVerboseAsm) {
8906f32e7eSjoerg   return new AVRTargetAsmStreamer(S);
9006f32e7eSjoerg }
9106f32e7eSjoerg 
LLVMInitializeAVRTargetMC()92*da58b97aSjoerg extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeAVRTargetMC() {
9306f32e7eSjoerg   // Register the MC asm info.
9406f32e7eSjoerg   RegisterMCAsmInfo<AVRMCAsmInfo> X(getTheAVRTarget());
9506f32e7eSjoerg 
9606f32e7eSjoerg   // Register the MC instruction info.
9706f32e7eSjoerg   TargetRegistry::RegisterMCInstrInfo(getTheAVRTarget(), createAVRMCInstrInfo);
9806f32e7eSjoerg 
9906f32e7eSjoerg   // Register the MC register info.
10006f32e7eSjoerg   TargetRegistry::RegisterMCRegInfo(getTheAVRTarget(), createAVRMCRegisterInfo);
10106f32e7eSjoerg 
10206f32e7eSjoerg   // Register the MC subtarget info.
10306f32e7eSjoerg   TargetRegistry::RegisterMCSubtargetInfo(getTheAVRTarget(),
10406f32e7eSjoerg                                           createAVRMCSubtargetInfo);
10506f32e7eSjoerg 
10606f32e7eSjoerg   // Register the MCInstPrinter.
10706f32e7eSjoerg   TargetRegistry::RegisterMCInstPrinter(getTheAVRTarget(),
10806f32e7eSjoerg                                         createAVRMCInstPrinter);
10906f32e7eSjoerg 
11006f32e7eSjoerg   // Register the MC Code Emitter
11106f32e7eSjoerg   TargetRegistry::RegisterMCCodeEmitter(getTheAVRTarget(), createAVRMCCodeEmitter);
11206f32e7eSjoerg 
11306f32e7eSjoerg   // Register the obj streamer
11406f32e7eSjoerg   TargetRegistry::RegisterELFStreamer(getTheAVRTarget(), createMCStreamer);
11506f32e7eSjoerg 
11606f32e7eSjoerg   // Register the obj target streamer.
11706f32e7eSjoerg   TargetRegistry::RegisterObjectTargetStreamer(getTheAVRTarget(),
11806f32e7eSjoerg                                                createAVRObjectTargetStreamer);
11906f32e7eSjoerg 
12006f32e7eSjoerg   // Register the asm target streamer.
12106f32e7eSjoerg   TargetRegistry::RegisterAsmTargetStreamer(getTheAVRTarget(),
12206f32e7eSjoerg                                             createMCAsmTargetStreamer);
12306f32e7eSjoerg 
12406f32e7eSjoerg   // Register the asm backend (as little endian).
12506f32e7eSjoerg   TargetRegistry::RegisterMCAsmBackend(getTheAVRTarget(), createAVRAsmBackend);
12606f32e7eSjoerg }
12706f32e7eSjoerg 
128