1234353Sdim//===-- 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" 15226633Sdim#include "InstPrinter/MipsInstPrinter.h" 16249423Sdim#include "MipsMCAsmInfo.h" 17263508Sdim#include "MipsTargetStreamer.h" 18226633Sdim#include "llvm/MC/MCCodeGenInfo.h" 19263508Sdim#include "llvm/MC/MCELF.h" 20263508Sdim#include "llvm/MC/MCELFStreamer.h" 21224133Sdim#include "llvm/MC/MCInstrInfo.h" 22224133Sdim#include "llvm/MC/MCRegisterInfo.h" 23224133Sdim#include "llvm/MC/MCSubtargetInfo.h" 24263508Sdim#include "llvm/MC/MCSymbol.h" 25249423Sdim#include "llvm/MC/MachineLocation.h" 26263508Sdim#include "llvm/Support/CommandLine.h" 27234353Sdim#include "llvm/Support/ErrorHandling.h" 28263508Sdim#include "llvm/Support/FormattedStream.h" 29226633Sdim#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 42234982Sdimstatic std::string ParseMipsTriple(StringRef TT, StringRef CPU) { 43234982Sdim std::string MipsArchFeature; 44234982Sdim size_t DashPosition = 0; 45234982Sdim StringRef TheTriple; 46234982Sdim 47234982Sdim // Let's see if there is a dash, like mips-unknown-linux. 48234982Sdim DashPosition = TT.find('-'); 49234982Sdim 50234982Sdim if (DashPosition == StringRef::npos) { 51234982Sdim // No dash, we check the string size. 52234982Sdim TheTriple = TT.substr(0); 53234982Sdim } else { 54234982Sdim // We are only interested in substring before dash. 55234982Sdim TheTriple = TT.substr(0,DashPosition); 56234982Sdim } 57234982Sdim 58234982Sdim if (TheTriple == "mips" || TheTriple == "mipsel") { 59234982Sdim if (CPU.empty() || CPU == "mips32") { 60234982Sdim MipsArchFeature = "+mips32"; 61234982Sdim } else if (CPU == "mips32r2") { 62234982Sdim MipsArchFeature = "+mips32r2"; 63234982Sdim } 64234982Sdim } else { 65234982Sdim if (CPU.empty() || CPU == "mips64") { 66234982Sdim MipsArchFeature = "+mips64"; 67234982Sdim } else if (CPU == "mips64r2") { 68234982Sdim MipsArchFeature = "+mips64r2"; 69234982Sdim } 70234982Sdim } 71234982Sdim return MipsArchFeature; 72234982Sdim} 73234982Sdim 74224133Sdimstatic MCInstrInfo *createMipsMCInstrInfo() { 75224133Sdim MCInstrInfo *X = new MCInstrInfo(); 76224133Sdim InitMipsMCInstrInfo(X); 77224133Sdim return X; 78224133Sdim} 79224133Sdim 80226633Sdimstatic MCRegisterInfo *createMipsMCRegisterInfo(StringRef TT) { 81226633Sdim MCRegisterInfo *X = new MCRegisterInfo(); 82226633Sdim InitMipsMCRegisterInfo(X, Mips::RA); 83226633Sdim return X; 84224133Sdim} 85224133Sdim 86224133Sdimstatic MCSubtargetInfo *createMipsMCSubtargetInfo(StringRef TT, StringRef CPU, 87224133Sdim StringRef FS) { 88234982Sdim std::string ArchFS = ParseMipsTriple(TT,CPU); 89234982Sdim if (!FS.empty()) { 90234982Sdim if (!ArchFS.empty()) 91234982Sdim ArchFS = ArchFS + "," + FS.str(); 92234982Sdim else 93234982Sdim ArchFS = FS; 94234982Sdim } 95224133Sdim MCSubtargetInfo *X = new MCSubtargetInfo(); 96234982Sdim InitMipsMCSubtargetInfo(X, TT, CPU, ArchFS); 97224133Sdim return X; 98224133Sdim} 99224133Sdim 100263508Sdimstatic MCAsmInfo *createMipsMCAsmInfo(const MCRegisterInfo &MRI, StringRef TT) { 101263508Sdim MCAsmInfo *MAI = new MipsMCAsmInfo(TT); 102226633Sdim 103263508Sdim unsigned SP = MRI.getDwarfRegNum(Mips::SP, true); 104263508Sdim MCCFIInstruction Inst = MCCFIInstruction::createDefCfa(0, SP, 0); 105263508Sdim MAI->addInitialFrameState(Inst); 106226633Sdim 107226633Sdim return MAI; 108226633Sdim} 109226633Sdim 110226633Sdimstatic MCCodeGenInfo *createMipsMCCodeGenInfo(StringRef TT, Reloc::Model RM, 111234353Sdim CodeModel::Model CM, 112234353Sdim CodeGenOpt::Level OL) { 113226633Sdim MCCodeGenInfo *X = new MCCodeGenInfo(); 114234353Sdim if (CM == CodeModel::JITDefault) 115234353Sdim RM = Reloc::Static; 116234353Sdim else if (RM == Reloc::Default) 117226633Sdim RM = Reloc::PIC_; 118234353Sdim X->InitMCCodeGenInfo(RM, CM, OL); 119226633Sdim return X; 120226633Sdim} 121226633Sdim 122226633Sdimstatic MCInstPrinter *createMipsMCInstPrinter(const Target &T, 123226633Sdim unsigned SyntaxVariant, 124226633Sdim const MCAsmInfo &MAI, 125234353Sdim const MCInstrInfo &MII, 126234353Sdim const MCRegisterInfo &MRI, 127226633Sdim const MCSubtargetInfo &STI) { 128234353Sdim return new MipsInstPrinter(MAI, MII, MRI); 129226633Sdim} 130226633Sdim 131226633Sdimstatic MCStreamer *createMCStreamer(const Target &T, StringRef TT, 132263508Sdim MCContext &Context, MCAsmBackend &MAB, 133263508Sdim raw_ostream &OS, MCCodeEmitter *Emitter, 134263508Sdim bool RelaxAll, bool NoExecStack) { 135263508Sdim MipsTargetELFStreamer *S = new MipsTargetELFStreamer(); 136263508Sdim return createELFStreamer(Context, S, MAB, OS, Emitter, RelaxAll, NoExecStack); 137263508Sdim} 138226633Sdim 139263508Sdimstatic MCStreamer * 140263508SdimcreateMCAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS, 141263508Sdim bool isVerboseAsm, bool useLoc, bool useCFI, 142263508Sdim bool useDwarfDirectory, MCInstPrinter *InstPrint, 143263508Sdim MCCodeEmitter *CE, MCAsmBackend *TAB, bool ShowInst) { 144263508Sdim MipsTargetAsmStreamer *S = new MipsTargetAsmStreamer(OS); 145263508Sdim 146263508Sdim return llvm::createAsmStreamer(Ctx, S, OS, isVerboseAsm, useLoc, useCFI, 147263508Sdim useDwarfDirectory, InstPrint, CE, TAB, 148263508Sdim ShowInst); 149226633Sdim} 150226633Sdim 151226633Sdimextern "C" void LLVMInitializeMipsTargetMC() { 152226633Sdim // Register the MC asm info. 153226633Sdim RegisterMCAsmInfoFn X(TheMipsTarget, createMipsMCAsmInfo); 154226633Sdim RegisterMCAsmInfoFn Y(TheMipselTarget, createMipsMCAsmInfo); 155226633Sdim RegisterMCAsmInfoFn A(TheMips64Target, createMipsMCAsmInfo); 156226633Sdim RegisterMCAsmInfoFn B(TheMips64elTarget, createMipsMCAsmInfo); 157226633Sdim 158226633Sdim // Register the MC codegen info. 159226633Sdim TargetRegistry::RegisterMCCodeGenInfo(TheMipsTarget, 160226633Sdim createMipsMCCodeGenInfo); 161226633Sdim TargetRegistry::RegisterMCCodeGenInfo(TheMipselTarget, 162226633Sdim createMipsMCCodeGenInfo); 163226633Sdim TargetRegistry::RegisterMCCodeGenInfo(TheMips64Target, 164226633Sdim createMipsMCCodeGenInfo); 165226633Sdim TargetRegistry::RegisterMCCodeGenInfo(TheMips64elTarget, 166226633Sdim createMipsMCCodeGenInfo); 167226633Sdim 168226633Sdim // Register the MC instruction info. 169226633Sdim TargetRegistry::RegisterMCInstrInfo(TheMipsTarget, createMipsMCInstrInfo); 170226633Sdim TargetRegistry::RegisterMCInstrInfo(TheMipselTarget, createMipsMCInstrInfo); 171226633Sdim TargetRegistry::RegisterMCInstrInfo(TheMips64Target, createMipsMCInstrInfo); 172234353Sdim TargetRegistry::RegisterMCInstrInfo(TheMips64elTarget, 173234353Sdim createMipsMCInstrInfo); 174226633Sdim 175226633Sdim // Register the MC register info. 176226633Sdim TargetRegistry::RegisterMCRegInfo(TheMipsTarget, createMipsMCRegisterInfo); 177226633Sdim TargetRegistry::RegisterMCRegInfo(TheMipselTarget, createMipsMCRegisterInfo); 178226633Sdim TargetRegistry::RegisterMCRegInfo(TheMips64Target, createMipsMCRegisterInfo); 179226633Sdim TargetRegistry::RegisterMCRegInfo(TheMips64elTarget, 180226633Sdim createMipsMCRegisterInfo); 181226633Sdim 182226633Sdim // Register the MC Code Emitter 183234353Sdim TargetRegistry::RegisterMCCodeEmitter(TheMipsTarget, 184234353Sdim createMipsMCCodeEmitterEB); 185226633Sdim TargetRegistry::RegisterMCCodeEmitter(TheMipselTarget, 186234353Sdim createMipsMCCodeEmitterEL); 187226633Sdim TargetRegistry::RegisterMCCodeEmitter(TheMips64Target, 188234353Sdim createMipsMCCodeEmitterEB); 189226633Sdim TargetRegistry::RegisterMCCodeEmitter(TheMips64elTarget, 190234353Sdim createMipsMCCodeEmitterEL); 191226633Sdim 192226633Sdim // Register the object streamer. 193226633Sdim TargetRegistry::RegisterMCObjectStreamer(TheMipsTarget, createMCStreamer); 194226633Sdim TargetRegistry::RegisterMCObjectStreamer(TheMipselTarget, createMCStreamer); 195226633Sdim TargetRegistry::RegisterMCObjectStreamer(TheMips64Target, createMCStreamer); 196234353Sdim TargetRegistry::RegisterMCObjectStreamer(TheMips64elTarget, 197234353Sdim createMCStreamer); 198226633Sdim 199263508Sdim // Register the asm streamer. 200263508Sdim TargetRegistry::RegisterAsmStreamer(TheMipsTarget, createMCAsmStreamer); 201263508Sdim TargetRegistry::RegisterAsmStreamer(TheMipselTarget, createMCAsmStreamer); 202263508Sdim TargetRegistry::RegisterAsmStreamer(TheMips64Target, createMCAsmStreamer); 203263508Sdim TargetRegistry::RegisterAsmStreamer(TheMips64elTarget, createMCAsmStreamer); 204263508Sdim 205226633Sdim // Register the asm backend. 206234353Sdim TargetRegistry::RegisterMCAsmBackend(TheMipsTarget, 207234353Sdim createMipsAsmBackendEB32); 208234353Sdim TargetRegistry::RegisterMCAsmBackend(TheMipselTarget, 209234353Sdim createMipsAsmBackendEL32); 210234353Sdim TargetRegistry::RegisterMCAsmBackend(TheMips64Target, 211234353Sdim createMipsAsmBackendEB64); 212234353Sdim TargetRegistry::RegisterMCAsmBackend(TheMips64elTarget, 213234353Sdim createMipsAsmBackendEL64); 214226633Sdim 215226633Sdim // Register the MC subtarget info. 216224133Sdim TargetRegistry::RegisterMCSubtargetInfo(TheMipsTarget, 217224133Sdim createMipsMCSubtargetInfo); 218226633Sdim TargetRegistry::RegisterMCSubtargetInfo(TheMipselTarget, 219226633Sdim createMipsMCSubtargetInfo); 220226633Sdim TargetRegistry::RegisterMCSubtargetInfo(TheMips64Target, 221226633Sdim createMipsMCSubtargetInfo); 222226633Sdim TargetRegistry::RegisterMCSubtargetInfo(TheMips64elTarget, 223226633Sdim createMipsMCSubtargetInfo); 224224133Sdim 225226633Sdim // Register the MCInstPrinter. 226226633Sdim TargetRegistry::RegisterMCInstPrinter(TheMipsTarget, 227226633Sdim createMipsMCInstPrinter); 228226633Sdim TargetRegistry::RegisterMCInstPrinter(TheMipselTarget, 229226633Sdim createMipsMCInstPrinter); 230226633Sdim TargetRegistry::RegisterMCInstPrinter(TheMips64Target, 231226633Sdim createMipsMCInstPrinter); 232226633Sdim TargetRegistry::RegisterMCInstPrinter(TheMips64elTarget, 233226633Sdim createMipsMCInstPrinter); 234224133Sdim} 235