Path: blob/main/contrib/llvm-project/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp
35294 views
//===-- SparcMCTargetDesc.cpp - Sparc Target Descriptions -----------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file provides Sparc specific target descriptions.9//10//===----------------------------------------------------------------------===//1112#include "SparcMCTargetDesc.h"13#include "SparcInstPrinter.h"14#include "SparcMCAsmInfo.h"15#include "SparcTargetStreamer.h"16#include "TargetInfo/SparcTargetInfo.h"17#include "llvm/MC/MCInstrInfo.h"18#include "llvm/MC/MCRegisterInfo.h"19#include "llvm/MC/MCSubtargetInfo.h"20#include "llvm/MC/TargetRegistry.h"21#include "llvm/Support/ErrorHandling.h"2223namespace llvm {24namespace SparcASITag {25#define GET_ASITagsList_IMPL26#include "SparcGenSearchableTables.inc"27} // end namespace SparcASITag2829namespace SparcPrefetchTag {30#define GET_PrefetchTagsList_IMPL31#include "SparcGenSearchableTables.inc"32} // end namespace SparcPrefetchTag33} // end namespace llvm3435using namespace llvm;3637#define GET_INSTRINFO_MC_DESC38#define ENABLE_INSTR_PREDICATE_VERIFIER39#include "SparcGenInstrInfo.inc"4041#define GET_SUBTARGETINFO_MC_DESC42#include "SparcGenSubtargetInfo.inc"4344#define GET_REGINFO_MC_DESC45#include "SparcGenRegisterInfo.inc"4647static MCAsmInfo *createSparcMCAsmInfo(const MCRegisterInfo &MRI,48const Triple &TT,49const MCTargetOptions &Options) {50MCAsmInfo *MAI = new SparcELFMCAsmInfo(TT);51unsigned Reg = MRI.getDwarfRegNum(SP::O6, true);52MCCFIInstruction Inst = MCCFIInstruction::cfiDefCfa(nullptr, Reg, 0);53MAI->addInitialFrameState(Inst);54return MAI;55}5657static MCAsmInfo *createSparcV9MCAsmInfo(const MCRegisterInfo &MRI,58const Triple &TT,59const MCTargetOptions &Options) {60MCAsmInfo *MAI = new SparcELFMCAsmInfo(TT);61unsigned Reg = MRI.getDwarfRegNum(SP::O6, true);62MCCFIInstruction Inst = MCCFIInstruction::cfiDefCfa(nullptr, Reg, 2047);63MAI->addInitialFrameState(Inst);64return MAI;65}6667static MCInstrInfo *createSparcMCInstrInfo() {68MCInstrInfo *X = new MCInstrInfo();69InitSparcMCInstrInfo(X);70return X;71}7273static MCRegisterInfo *createSparcMCRegisterInfo(const Triple &TT) {74MCRegisterInfo *X = new MCRegisterInfo();75InitSparcMCRegisterInfo(X, SP::O7);76return X;77}7879static MCSubtargetInfo *80createSparcMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) {81if (CPU.empty())82CPU = (TT.getArch() == Triple::sparcv9) ? "v9" : "v8";83return createSparcMCSubtargetInfoImpl(TT, CPU, /*TuneCPU*/ CPU, FS);84}8586static MCTargetStreamer *87createObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {88return new SparcTargetELFStreamer(S);89}9091static MCTargetStreamer *createTargetAsmStreamer(MCStreamer &S,92formatted_raw_ostream &OS,93MCInstPrinter *InstPrint) {94return new SparcTargetAsmStreamer(S, OS);95}9697static MCTargetStreamer *createNullTargetStreamer(MCStreamer &S) {98return new SparcTargetStreamer(S);99}100101static MCInstPrinter *createSparcMCInstPrinter(const Triple &T,102unsigned SyntaxVariant,103const MCAsmInfo &MAI,104const MCInstrInfo &MII,105const MCRegisterInfo &MRI) {106return new SparcInstPrinter(MAI, MII, MRI);107}108109extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeSparcTargetMC() {110// Register the MC asm info.111RegisterMCAsmInfoFn X(getTheSparcTarget(), createSparcMCAsmInfo);112RegisterMCAsmInfoFn Y(getTheSparcV9Target(), createSparcV9MCAsmInfo);113RegisterMCAsmInfoFn Z(getTheSparcelTarget(), createSparcMCAsmInfo);114115for (Target *T :116{&getTheSparcTarget(), &getTheSparcV9Target(), &getTheSparcelTarget()}) {117// Register the MC instruction info.118TargetRegistry::RegisterMCInstrInfo(*T, createSparcMCInstrInfo);119120// Register the MC register info.121TargetRegistry::RegisterMCRegInfo(*T, createSparcMCRegisterInfo);122123// Register the MC subtarget info.124TargetRegistry::RegisterMCSubtargetInfo(*T, createSparcMCSubtargetInfo);125126// Register the MC Code Emitter.127TargetRegistry::RegisterMCCodeEmitter(*T, createSparcMCCodeEmitter);128129// Register the asm backend.130TargetRegistry::RegisterMCAsmBackend(*T, createSparcAsmBackend);131132// Register the object target streamer.133TargetRegistry::RegisterObjectTargetStreamer(*T,134createObjectTargetStreamer);135136// Register the asm streamer.137TargetRegistry::RegisterAsmTargetStreamer(*T, createTargetAsmStreamer);138139// Register the null streamer.140TargetRegistry::RegisterNullTargetStreamer(*T, createNullTargetStreamer);141142// Register the MCInstPrinter143TargetRegistry::RegisterMCInstPrinter(*T, createSparcMCInstPrinter);144}145}146147148