1234285Sdim//===-- HexagonMCTargetDesc.cpp - Hexagon Target Descriptions -------------===// 2234285Sdim// 3234285Sdim// The LLVM Compiler Infrastructure 4234285Sdim// 5234285Sdim// This file is distributed under the University of Illinois Open Source 6234285Sdim// License. See LICENSE.TXT for details. 7234285Sdim// 8234285Sdim//===----------------------------------------------------------------------===// 9234285Sdim// 10234285Sdim// This file provides Hexagon specific target descriptions. 11234285Sdim// 12234285Sdim//===----------------------------------------------------------------------===// 13234285Sdim 14234285Sdim#include "HexagonMCTargetDesc.h" 15234285Sdim#include "HexagonMCAsmInfo.h" 16252723Sdim#include "InstPrinter/HexagonInstPrinter.h" 17234285Sdim#include "llvm/MC/MachineLocation.h" 18234285Sdim#include "llvm/MC/MCCodeGenInfo.h" 19234285Sdim#include "llvm/MC/MCInstrInfo.h" 20234285Sdim#include "llvm/MC/MCRegisterInfo.h" 21252723Sdim#include "llvm/MC/MCStreamer.h" 22234285Sdim#include "llvm/MC/MCSubtargetInfo.h" 23234285Sdim#include "llvm/Support/ErrorHandling.h" 24234285Sdim#include "llvm/Support/TargetRegistry.h" 25234285Sdim 26234285Sdim#define GET_INSTRINFO_MC_DESC 27234285Sdim#include "HexagonGenInstrInfo.inc" 28234285Sdim 29234285Sdim#define GET_SUBTARGETINFO_MC_DESC 30234285Sdim#include "HexagonGenSubtargetInfo.inc" 31234285Sdim 32234285Sdim#define GET_REGINFO_MC_DESC 33234285Sdim#include "HexagonGenRegisterInfo.inc" 34234285Sdim 35234285Sdimusing namespace llvm; 36234285Sdim 37234285Sdimstatic MCInstrInfo *createHexagonMCInstrInfo() { 38234285Sdim MCInstrInfo *X = new MCInstrInfo(); 39234285Sdim InitHexagonMCInstrInfo(X); 40234285Sdim return X; 41234285Sdim} 42234285Sdim 43234285Sdimstatic MCRegisterInfo *createHexagonMCRegisterInfo(StringRef TT) { 44234285Sdim MCRegisterInfo *X = new MCRegisterInfo(); 45234285Sdim InitHexagonMCRegisterInfo(X, Hexagon::R0); 46234285Sdim return X; 47234285Sdim} 48234285Sdim 49234285Sdimstatic MCSubtargetInfo *createHexagonMCSubtargetInfo(StringRef TT, 50234285Sdim StringRef CPU, 51234285Sdim StringRef FS) { 52234285Sdim MCSubtargetInfo *X = new MCSubtargetInfo(); 53234285Sdim InitHexagonMCSubtargetInfo(X, TT, CPU, FS); 54234285Sdim return X; 55234285Sdim} 56234285Sdim 57263509Sdimstatic MCAsmInfo *createHexagonMCAsmInfo(const MCRegisterInfo &MRI, 58263509Sdim StringRef TT) { 59263509Sdim MCAsmInfo *MAI = new HexagonMCAsmInfo(TT); 60234285Sdim 61234285Sdim // VirtualFP = (R30 + #0). 62263509Sdim MCCFIInstruction Inst = MCCFIInstruction::createDefCfa( 63263509Sdim 0, Hexagon::R30, 0); 64263509Sdim MAI->addInitialFrameState(Inst); 65234285Sdim 66234285Sdim return MAI; 67234285Sdim} 68234285Sdim 69234285Sdimstatic MCCodeGenInfo *createHexagonMCCodeGenInfo(StringRef TT, Reloc::Model RM, 70234285Sdim CodeModel::Model CM, 71234285Sdim CodeGenOpt::Level OL) { 72234285Sdim MCCodeGenInfo *X = new MCCodeGenInfo(); 73234285Sdim // For the time being, use static relocations, since there's really no 74234285Sdim // support for PIC yet. 75234285Sdim X->InitMCCodeGenInfo(Reloc::Static, CM, OL); 76234285Sdim return X; 77234285Sdim} 78234285Sdim 79234285Sdim// Force static initialization. 80234285Sdimextern "C" void LLVMInitializeHexagonTargetMC() { 81234285Sdim // Register the MC asm info. 82234285Sdim RegisterMCAsmInfoFn X(TheHexagonTarget, createHexagonMCAsmInfo); 83234285Sdim 84234285Sdim // Register the MC codegen info. 85234285Sdim TargetRegistry::RegisterMCCodeGenInfo(TheHexagonTarget, 86234285Sdim createHexagonMCCodeGenInfo); 87234285Sdim 88234285Sdim // Register the MC instruction info. 89234285Sdim TargetRegistry::RegisterMCInstrInfo(TheHexagonTarget, createHexagonMCInstrInfo); 90234285Sdim 91234285Sdim // Register the MC register info. 92234285Sdim TargetRegistry::RegisterMCRegInfo(TheHexagonTarget, 93234285Sdim createHexagonMCRegisterInfo); 94234285Sdim 95234285Sdim // Register the MC subtarget info. 96234285Sdim TargetRegistry::RegisterMCSubtargetInfo(TheHexagonTarget, 97234285Sdim createHexagonMCSubtargetInfo); 98234285Sdim} 99