brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.3 KiB · 9fa60ee Raw
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