1235633Sdim//===-- MipsMCTargetDesc.cpp - Mips Target Descriptions -------------------===// 2224133Sdim// 3224133Sdim// The LLVM Compiler Infrastructure 4224133Sdim// 5224133Sdim// This file is distributed under the University of Illinois Open Source 6224133Sdim// License. See LICENSE.TXT for details. 7224133Sdim// 8224133Sdim//===----------------------------------------------------------------------===// 9224133Sdim// 10224133Sdim// This file provides Mips specific target descriptions. 11224133Sdim// 12224133Sdim//===----------------------------------------------------------------------===// 13224133Sdim 14224133Sdim#include "MipsMCTargetDesc.h" 15226890Sdim#include "InstPrinter/MipsInstPrinter.h" 16252723Sdim#include "MipsMCAsmInfo.h" 17263509Sdim#include "MipsTargetStreamer.h" 18226890Sdim#include "llvm/MC/MCCodeGenInfo.h" 19263509Sdim#include "llvm/MC/MCELF.h" 20263509Sdim#include "llvm/MC/MCELFStreamer.h" 21224133Sdim#include "llvm/MC/MCInstrInfo.h" 22224133Sdim#include "llvm/MC/MCRegisterInfo.h" 23224133Sdim#include "llvm/MC/MCSubtargetInfo.h" 24263509Sdim#include "llvm/MC/MCSymbol.h" 25252723Sdim#include "llvm/MC/MachineLocation.h" 26263509Sdim#include "llvm/Support/CommandLine.h" 27235633Sdim#include "llvm/Support/ErrorHandling.h" 28263509Sdim#include "llvm/Support/FormattedStream.h" 29226890Sdim#include "llvm/Support/TargetRegistry.h" 30224133Sdim 31224133Sdim#define GET_INSTRINFO_MC_DESC 32224133Sdim#include "MipsGenInstrInfo.inc" 33224133Sdim 34224133Sdim#define GET_SUBTARGETINFO_MC_DESC 35224133Sdim#include "MipsGenSubtargetInfo.inc" 36224133Sdim 37224133Sdim#define GET_REGINFO_MC_DESC 38224133Sdim#include "MipsGenRegisterInfo.inc" 39224133Sdim 40224133Sdimusing namespace llvm; 41224133Sdim 42235633Sdimstatic std::string ParseMipsTriple(StringRef TT, StringRef CPU) { 43235633Sdim std::string MipsArchFeature; 44235633Sdim size_t DashPosition = 0; 45235633Sdim StringRef TheTriple; 46235633Sdim 47235633Sdim // Let's see if there is a dash, like mips-unknown-linux. 48235633Sdim DashPosition = TT.find('-'); 49235633Sdim 50235633Sdim if (DashPosition == StringRef::npos) { 51235633Sdim // No dash, we check the string size. 52235633Sdim TheTriple = TT.substr(0); 53235633Sdim } else { 54235633Sdim // We are only interested in substring before dash. 55235633Sdim TheTriple = TT.substr(0,DashPosition); 56235633Sdim } 57235633Sdim 58235633Sdim if (TheTriple == "mips" || TheTriple == "mipsel") { 59235633Sdim if (CPU.empty() || CPU == "mips32") { 60235633Sdim MipsArchFeature = "+mips32"; 61235633Sdim } else if (CPU == "mips32r2") { 62235633Sdim MipsArchFeature = "+mips32r2"; 63235633Sdim } 64235633Sdim } else { 65235633Sdim if (CPU.empty() || CPU == "mips64") { 66235633Sdim MipsArchFeature = "+mips64"; 67235633Sdim } else if (CPU == "mips64r2") { 68235633Sdim MipsArchFeature = "+mips64r2"; 69235633Sdim } 70235633Sdim } 71235633Sdim return MipsArchFeature; 72235633Sdim} 73235633Sdim 74224133Sdimstatic MCInstrInfo *createMipsMCInstrInfo() { 75224133Sdim MCInstrInfo *X = new MCInstrInfo(); 76224133Sdim InitMipsMCInstrInfo(X); 77224133Sdim return X; 78224133Sdim} 79224133Sdim 80226890Sdimstatic MCRegisterInfo *createMipsMCRegisterInfo(StringRef TT) { 81226890Sdim MCRegisterInfo *X = new MCRegisterInfo(); 82226890Sdim InitMipsMCRegisterInfo(X, Mips::RA); 83226890Sdim return X; 84224133Sdim} 85224133Sdim 86224133Sdimstatic MCSubtargetInfo *createMipsMCSubtargetInfo(StringRef TT, StringRef CPU, 87224133Sdim StringRef FS) { 88235633Sdim std::string ArchFS = ParseMipsTriple(TT,CPU); 89235633Sdim if (!FS.empty()) { 90235633Sdim if (!ArchFS.empty()) 91235633Sdim ArchFS = ArchFS + "," + FS.str(); 92235633Sdim else 93235633Sdim ArchFS = FS; 94235633Sdim } 95224133Sdim MCSubtargetInfo *X = new MCSubtargetInfo(); 96235633Sdim InitMipsMCSubtargetInfo(X, TT, CPU, ArchFS); 97224133Sdim return X; 98224133Sdim} 99224133Sdim 100263509Sdimstatic MCAsmInfo *createMipsMCAsmInfo(const MCRegisterInfo &MRI, StringRef TT) { 101263509Sdim MCAsmInfo *MAI = new MipsMCAsmInfo(TT); 102226890Sdim 103263509Sdim unsigned SP = MRI.getDwarfRegNum(Mips::SP, true); 104263509Sdim MCCFIInstruction Inst = MCCFIInstruction::createDefCfa(0, SP, 0); 105263509Sdim MAI->addInitialFrameState(Inst); 106226890Sdim 107226890Sdim return MAI; 108226890Sdim} 109226890Sdim 110226890Sdimstatic MCCodeGenInfo *createMipsMCCodeGenInfo(StringRef TT, Reloc::Model RM, 111235633Sdim CodeModel::Model CM, 112235633Sdim CodeGenOpt::Level OL) { 113226890Sdim MCCodeGenInfo *X = new MCCodeGenInfo(); 114235633Sdim if (CM == CodeModel::JITDefault) 115235633Sdim RM = Reloc::Static; 116235633Sdim else if (RM == Reloc::Default) 117226890Sdim RM = Reloc::PIC_; 118235633Sdim X->InitMCCodeGenInfo(RM, CM, OL); 119226890Sdim return X; 120226890Sdim} 121226890Sdim 122226890Sdimstatic MCInstPrinter *createMipsMCInstPrinter(const Target &T, 123226890Sdim unsigned SyntaxVariant, 124226890Sdim const MCAsmInfo &MAI, 125235633Sdim const MCInstrInfo &MII, 126235633Sdim const MCRegisterInfo &MRI, 127226890Sdim const MCSubtargetInfo &STI) { 128235633Sdim return new MipsInstPrinter(MAI, MII, MRI); 129226890Sdim} 130226890Sdim 131226890Sdimstatic MCStreamer *createMCStreamer(const Target &T, StringRef TT, 132263509Sdim MCContext &Context, MCAsmBackend &MAB, 133263509Sdim raw_ostream &OS, MCCodeEmitter *Emitter, 134263509Sdim bool RelaxAll, bool NoExecStack) { 135263509Sdim MipsTargetELFStreamer *S = new MipsTargetELFStreamer(); 136263509Sdim return createELFStreamer(Context, S, MAB, OS, Emitter, RelaxAll, NoExecStack); 137263509Sdim} 138226890Sdim 139263509Sdimstatic MCStreamer * 140263509SdimcreateMCAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS, 141263509Sdim bool isVerboseAsm, bool useLoc, bool useCFI, 142263509Sdim bool useDwarfDirectory, MCInstPrinter *InstPrint, 143263509Sdim MCCodeEmitter *CE, MCAsmBackend *TAB, bool ShowInst) { 144263509Sdim MipsTargetAsmStreamer *S = new MipsTargetAsmStreamer(OS); 145263509Sdim 146263509Sdim return llvm::createAsmStreamer(Ctx, S, OS, isVerboseAsm, useLoc, useCFI, 147263509Sdim useDwarfDirectory, InstPrint, CE, TAB, 148263509Sdim ShowInst); 149226890Sdim} 150226890Sdim 151226890Sdimextern "C" void LLVMInitializeMipsTargetMC() { 152226890Sdim // Register the MC asm info. 153226890Sdim RegisterMCAsmInfoFn X(TheMipsTarget, createMipsMCAsmInfo); 154226890Sdim RegisterMCAsmInfoFn Y(TheMipselTarget, createMipsMCAsmInfo); 155226890Sdim RegisterMCAsmInfoFn A(TheMips64Target, createMipsMCAsmInfo); 156226890Sdim RegisterMCAsmInfoFn B(TheMips64elTarget, createMipsMCAsmInfo); 157226890Sdim 158226890Sdim // Register the MC codegen info. 159226890Sdim TargetRegistry::RegisterMCCodeGenInfo(TheMipsTarget, 160226890Sdim createMipsMCCodeGenInfo); 161226890Sdim TargetRegistry::RegisterMCCodeGenInfo(TheMipselTarget, 162226890Sdim createMipsMCCodeGenInfo); 163226890Sdim TargetRegistry::RegisterMCCodeGenInfo(TheMips64Target, 164226890Sdim createMipsMCCodeGenInfo); 165226890Sdim TargetRegistry::RegisterMCCodeGenInfo(TheMips64elTarget, 166226890Sdim createMipsMCCodeGenInfo); 167226890Sdim 168226890Sdim // Register the MC instruction info. 169226890Sdim TargetRegistry::RegisterMCInstrInfo(TheMipsTarget, createMipsMCInstrInfo); 170226890Sdim TargetRegistry::RegisterMCInstrInfo(TheMipselTarget, createMipsMCInstrInfo); 171226890Sdim TargetRegistry::RegisterMCInstrInfo(TheMips64Target, createMipsMCInstrInfo); 172235633Sdim TargetRegistry::RegisterMCInstrInfo(TheMips64elTarget, 173235633Sdim createMipsMCInstrInfo); 174226890Sdim 175226890Sdim // Register the MC register info. 176226890Sdim TargetRegistry::RegisterMCRegInfo(TheMipsTarget, createMipsMCRegisterInfo); 177226890Sdim TargetRegistry::RegisterMCRegInfo(TheMipselTarget, createMipsMCRegisterInfo); 178226890Sdim TargetRegistry::RegisterMCRegInfo(TheMips64Target, createMipsMCRegisterInfo); 179226890Sdim TargetRegistry::RegisterMCRegInfo(TheMips64elTarget, 180226890Sdim createMipsMCRegisterInfo); 181226890Sdim 182226890Sdim // Register the MC Code Emitter 183235633Sdim TargetRegistry::RegisterMCCodeEmitter(TheMipsTarget, 184235633Sdim createMipsMCCodeEmitterEB); 185226890Sdim TargetRegistry::RegisterMCCodeEmitter(TheMipselTarget, 186235633Sdim createMipsMCCodeEmitterEL); 187226890Sdim TargetRegistry::RegisterMCCodeEmitter(TheMips64Target, 188235633Sdim createMipsMCCodeEmitterEB); 189226890Sdim TargetRegistry::RegisterMCCodeEmitter(TheMips64elTarget, 190235633Sdim createMipsMCCodeEmitterEL); 191226890Sdim 192226890Sdim // Register the object streamer. 193226890Sdim TargetRegistry::RegisterMCObjectStreamer(TheMipsTarget, createMCStreamer); 194226890Sdim TargetRegistry::RegisterMCObjectStreamer(TheMipselTarget, createMCStreamer); 195226890Sdim TargetRegistry::RegisterMCObjectStreamer(TheMips64Target, createMCStreamer); 196235633Sdim TargetRegistry::RegisterMCObjectStreamer(TheMips64elTarget, 197235633Sdim createMCStreamer); 198226890Sdim 199263509Sdim // Register the asm streamer. 200263509Sdim TargetRegistry::RegisterAsmStreamer(TheMipsTarget, createMCAsmStreamer); 201263509Sdim TargetRegistry::RegisterAsmStreamer(TheMipselTarget, createMCAsmStreamer); 202263509Sdim TargetRegistry::RegisterAsmStreamer(TheMips64Target, createMCAsmStreamer); 203263509Sdim TargetRegistry::RegisterAsmStreamer(TheMips64elTarget, createMCAsmStreamer); 204263509Sdim 205226890Sdim // Register the asm backend. 206235633Sdim TargetRegistry::RegisterMCAsmBackend(TheMipsTarget, 207235633Sdim createMipsAsmBackendEB32); 208235633Sdim TargetRegistry::RegisterMCAsmBackend(TheMipselTarget, 209235633Sdim createMipsAsmBackendEL32); 210235633Sdim TargetRegistry::RegisterMCAsmBackend(TheMips64Target, 211235633Sdim createMipsAsmBackendEB64); 212235633Sdim TargetRegistry::RegisterMCAsmBackend(TheMips64elTarget, 213235633Sdim createMipsAsmBackendEL64); 214226890Sdim 215226890Sdim // Register the MC subtarget info. 216224133Sdim TargetRegistry::RegisterMCSubtargetInfo(TheMipsTarget, 217224133Sdim createMipsMCSubtargetInfo); 218226890Sdim TargetRegistry::RegisterMCSubtargetInfo(TheMipselTarget, 219226890Sdim createMipsMCSubtargetInfo); 220226890Sdim TargetRegistry::RegisterMCSubtargetInfo(TheMips64Target, 221226890Sdim createMipsMCSubtargetInfo); 222226890Sdim TargetRegistry::RegisterMCSubtargetInfo(TheMips64elTarget, 223226890Sdim createMipsMCSubtargetInfo); 224224133Sdim 225226890Sdim // Register the MCInstPrinter. 226226890Sdim TargetRegistry::RegisterMCInstPrinter(TheMipsTarget, 227226890Sdim createMipsMCInstPrinter); 228226890Sdim TargetRegistry::RegisterMCInstPrinter(TheMipselTarget, 229226890Sdim createMipsMCInstPrinter); 230226890Sdim TargetRegistry::RegisterMCInstPrinter(TheMips64Target, 231226890Sdim createMipsMCInstPrinter); 232226890Sdim TargetRegistry::RegisterMCInstPrinter(TheMips64elTarget, 233226890Sdim createMipsMCInstPrinter); 234224133Sdim} 235