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