157 lines · cpp
1//===-- SparcMCTargetDesc.cpp - Sparc Target Descriptions -----------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file provides Sparc specific target descriptions.10//11//===----------------------------------------------------------------------===//12 13#include "SparcMCTargetDesc.h"14#include "SparcInstPrinter.h"15#include "SparcMCAsmInfo.h"16#include "SparcTargetStreamer.h"17#include "TargetInfo/SparcTargetInfo.h"18#include "llvm/MC/MCInstrInfo.h"19#include "llvm/MC/MCRegisterInfo.h"20#include "llvm/MC/MCSubtargetInfo.h"21#include "llvm/MC/TargetRegistry.h"22#include "llvm/Support/Compiler.h"23#include "llvm/Support/ErrorHandling.h"24 25namespace llvm {26namespace SparcASITag {27#define GET_ASITagsList_IMPL28#include "SparcGenSearchableTables.inc"29} // end namespace SparcASITag30 31namespace SparcPrefetchTag {32#define GET_PrefetchTagsList_IMPL33#include "SparcGenSearchableTables.inc"34} // end namespace SparcPrefetchTag35} // end namespace llvm36 37using namespace llvm;38 39#define GET_INSTRINFO_MC_DESC40#define ENABLE_INSTR_PREDICATE_VERIFIER41#include "SparcGenInstrInfo.inc"42 43#define GET_SUBTARGETINFO_MC_DESC44#include "SparcGenSubtargetInfo.inc"45 46#define GET_REGINFO_MC_DESC47#include "SparcGenRegisterInfo.inc"48 49static MCAsmInfo *createSparcMCAsmInfo(const MCRegisterInfo &MRI,50 const Triple &TT,51 const MCTargetOptions &Options) {52 MCAsmInfo *MAI = new SparcELFMCAsmInfo(TT);53 unsigned Reg = MRI.getDwarfRegNum(SP::O6, true);54 MCCFIInstruction Inst = MCCFIInstruction::cfiDefCfa(nullptr, Reg, 0);55 MAI->addInitialFrameState(Inst);56 return MAI;57}58 59static MCAsmInfo *createSparcV9MCAsmInfo(const MCRegisterInfo &MRI,60 const Triple &TT,61 const MCTargetOptions &Options) {62 MCAsmInfo *MAI = new SparcELFMCAsmInfo(TT);63 unsigned Reg = MRI.getDwarfRegNum(SP::O6, true);64 MCCFIInstruction Inst = MCCFIInstruction::cfiDefCfa(nullptr, Reg, 2047);65 MAI->addInitialFrameState(Inst);66 return MAI;67}68 69static MCInstrInfo *createSparcMCInstrInfo() {70 MCInstrInfo *X = new MCInstrInfo();71 InitSparcMCInstrInfo(X);72 return X;73}74 75static MCRegisterInfo *createSparcMCRegisterInfo(const Triple &TT) {76 MCRegisterInfo *X = new MCRegisterInfo();77 InitSparcMCRegisterInfo(X, SP::O7);78 return X;79}80 81static MCSubtargetInfo *82createSparcMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) {83 if (CPU.empty())84 CPU = TT.getArch() == Triple::sparcv9 ? "v9" : "v8";85 86 MCSubtargetInfo *STI =87 createSparcMCSubtargetInfoImpl(TT, CPU, /*TuneCPU=*/CPU, FS);88 if (TT.isSPARC64() && !STI->hasFeature(Sparc::Feature64Bit)) {89 FeatureBitset Features = STI->getFeatureBits();90 STI->setFeatureBits(Features.set(Sparc::Feature64Bit));91 }92 93 return STI;94}95 96static MCTargetStreamer *97createObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {98 return new SparcTargetELFStreamer(S, STI);99}100 101static MCTargetStreamer *createTargetAsmStreamer(MCStreamer &S,102 formatted_raw_ostream &OS,103 MCInstPrinter *InstPrint) {104 return new SparcTargetAsmStreamer(S, OS);105}106 107static MCTargetStreamer *createNullTargetStreamer(MCStreamer &S) {108 return new SparcTargetStreamer(S);109}110 111static MCInstPrinter *createSparcMCInstPrinter(const Triple &T,112 unsigned SyntaxVariant,113 const MCAsmInfo &MAI,114 const MCInstrInfo &MII,115 const MCRegisterInfo &MRI) {116 return new SparcInstPrinter(MAI, MII, MRI);117}118 119extern "C" LLVM_ABI LLVM_EXTERNAL_VISIBILITY void120LLVMInitializeSparcTargetMC() {121 // Register the MC asm info.122 RegisterMCAsmInfoFn X(getTheSparcTarget(), createSparcMCAsmInfo);123 RegisterMCAsmInfoFn Y(getTheSparcV9Target(), createSparcV9MCAsmInfo);124 RegisterMCAsmInfoFn Z(getTheSparcelTarget(), createSparcMCAsmInfo);125 126 for (Target *T :127 {&getTheSparcTarget(), &getTheSparcV9Target(), &getTheSparcelTarget()}) {128 // Register the MC instruction info.129 TargetRegistry::RegisterMCInstrInfo(*T, createSparcMCInstrInfo);130 131 // Register the MC register info.132 TargetRegistry::RegisterMCRegInfo(*T, createSparcMCRegisterInfo);133 134 // Register the MC subtarget info.135 TargetRegistry::RegisterMCSubtargetInfo(*T, createSparcMCSubtargetInfo);136 137 // Register the MC Code Emitter.138 TargetRegistry::RegisterMCCodeEmitter(*T, createSparcMCCodeEmitter);139 140 // Register the asm backend.141 TargetRegistry::RegisterMCAsmBackend(*T, createSparcAsmBackend);142 143 // Register the object target streamer.144 TargetRegistry::RegisterObjectTargetStreamer(*T,145 createObjectTargetStreamer);146 147 // Register the asm streamer.148 TargetRegistry::RegisterAsmTargetStreamer(*T, createTargetAsmStreamer);149 150 // Register the null streamer.151 TargetRegistry::RegisterNullTargetStreamer(*T, createNullTargetStreamer);152 153 // Register the MCInstPrinter154 TargetRegistry::RegisterMCInstPrinter(*T, createSparcMCInstPrinter);155 }156}157