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