SparcMCTargetDesc.cpp revision 360784
12061Sjkh//===-- SparcMCTargetDesc.cpp - Sparc Target Descriptions -----------------===// 228531Sbde// 32061Sjkh// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42061Sjkh// See https://llvm.org/LICENSE.txt for license information. 515603Smarkm// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 63197Scsgr// 720710Sasami//===----------------------------------------------------------------------===// 820710Sasami// 93197Scsgr// This file provides Sparc specific target descriptions. 102061Sjkh// 1112483Speter//===----------------------------------------------------------------------===// 122160Scsgr 132834Swollman#include "SparcMCTargetDesc.h" 142061Sjkh#include "SparcInstPrinter.h" 152061Sjkh#include "SparcMCAsmInfo.h" 162160Scsgr#include "SparcTargetStreamer.h" 1717308Speter#include "TargetInfo/SparcTargetInfo.h" 1819320Sadam#include "llvm/MC/MCInstrInfo.h" 1927788Sasami#include "llvm/MC/MCRegisterInfo.h" 2027788Sasami#include "llvm/MC/MCSubtargetInfo.h" 2125980Sasami#include "llvm/Support/ErrorHandling.h" 221594Srgrimes#include "llvm/Support/TargetRegistry.h" 2317308Speter 2417308Speterusing namespace llvm; 2527910Sasami 2627910Sasami#define GET_INSTRINFO_MC_DESC 2727910Sasami#include "SparcGenInstrInfo.inc" 2817308Speter 2917308Speter#define GET_SUBTARGETINFO_MC_DESC 3017308Speter#include "SparcGenSubtargetInfo.inc" 3119175Sbde 3219175Sbde#define GET_REGINFO_MC_DESC 3319175Sbde#include "SparcGenRegisterInfo.inc" 3419175Sbde 3517308Speterstatic MCAsmInfo *createSparcMCAsmInfo(const MCRegisterInfo &MRI, 3627910Sasami const Triple &TT, 3725647Sbde const MCTargetOptions &Options) { 3827910Sasami MCAsmInfo *MAI = new SparcELFMCAsmInfo(TT); 3917308Speter unsigned Reg = MRI.getDwarfRegNum(SP::O6, true); 402061Sjkh MCCFIInstruction Inst = MCCFIInstruction::createDefCfa(nullptr, Reg, 0); 412061Sjkh MAI->addInitialFrameState(Inst); 421594Srgrimes return MAI; 4328531Sbde} 4428531Sbde 4528531Sbdestatic MCAsmInfo *createSparcV9MCAsmInfo(const MCRegisterInfo &MRI, 4628531Sbde const Triple &TT, 4728531Sbde const MCTargetOptions &Options) { 4828531Sbde MCAsmInfo *MAI = new SparcELFMCAsmInfo(TT); 4928531Sbde unsigned Reg = MRI.getDwarfRegNum(SP::O6, true); 5028531Sbde MCCFIInstruction Inst = MCCFIInstruction::createDefCfa(nullptr, Reg, 2047); 517407Srgrimes MAI->addInitialFrameState(Inst); 527108Sphk return MAI; 537108Sphk} 547108Sphk 557407Srgrimesstatic MCInstrInfo *createSparcMCInstrInfo() { 567407Srgrimes MCInstrInfo *X = new MCInstrInfo(); 577407Srgrimes InitSparcMCInstrInfo(X); 587108Sphk return X; 592061Sjkh} 602061Sjkh 612061Sjkhstatic MCRegisterInfo *createSparcMCRegisterInfo(const Triple &TT) { 6217308Speter MCRegisterInfo *X = new MCRegisterInfo(); 632061Sjkh InitSparcMCRegisterInfo(X, SP::O7); 642061Sjkh return X; 652061Sjkh} 662061Sjkh 672061Sjkhstatic MCSubtargetInfo * 683197ScsgrcreateSparcMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) { 692626Scsgr if (CPU.empty()) 702626Scsgr CPU = (TT.getArch() == Triple::sparcv9) ? "v9" : "v8"; 712061Sjkh return createSparcMCSubtargetInfoImpl(TT, CPU, FS); 722061Sjkh} 732061Sjkh 742061Sjkhstatic MCTargetStreamer * 752061SjkhcreateObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) { 762061Sjkh return new SparcTargetELFStreamer(S); 7719320Sadam} 782061Sjkh 792061Sjkhstatic MCTargetStreamer *createTargetAsmStreamer(MCStreamer &S, 802061Sjkh formatted_raw_ostream &OS, 812061Sjkh MCInstPrinter *InstPrint, 822061Sjkh bool isVerboseAsm) { 832061Sjkh return new SparcTargetAsmStreamer(S, OS); 842061Sjkh} 852061Sjkh 862061Sjkhstatic MCInstPrinter *createSparcMCInstPrinter(const Triple &T, 872061Sjkh unsigned SyntaxVariant, 882061Sjkh const MCAsmInfo &MAI, 892834Swollman const MCInstrInfo &MII, 902834Swollman const MCRegisterInfo &MRI) { 912834Swollman return new SparcInstPrinter(MAI, MII, MRI); 922834Swollman} 932834Swollman 942834Swollmanextern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeSparcTargetMC() { 951594Srgrimes // Register the MC asm info. 964486Sphk RegisterMCAsmInfoFn X(getTheSparcTarget(), createSparcMCAsmInfo); 974486Sphk RegisterMCAsmInfoFn Y(getTheSparcV9Target(), createSparcV9MCAsmInfo); 984486Sphk RegisterMCAsmInfoFn Z(getTheSparcelTarget(), createSparcMCAsmInfo); 994486Sphk 1004486Sphk for (Target *T : 1012061Sjkh {&getTheSparcTarget(), &getTheSparcV9Target(), &getTheSparcelTarget()}) { 1022061Sjkh // Register the MC instruction info. 10325979Sjkh TargetRegistry::RegisterMCInstrInfo(*T, createSparcMCInstrInfo); 10425979Sjkh 10525979Sjkh // Register the MC register info. 10625979Sjkh TargetRegistry::RegisterMCRegInfo(*T, createSparcMCRegisterInfo); 1072061Sjkh 10825979Sjkh // Register the MC subtarget info. 1092061Sjkh TargetRegistry::RegisterMCSubtargetInfo(*T, createSparcMCSubtargetInfo); 1102061Sjkh 11117308Speter // Register the MC Code Emitter. 1122061Sjkh TargetRegistry::RegisterMCCodeEmitter(*T, createSparcMCCodeEmitter); 1132061Sjkh 1142061Sjkh // Register the asm backend. 1152061Sjkh TargetRegistry::RegisterMCAsmBackend(*T, createSparcAsmBackend); 1162061Sjkh 11712483Speter // Register the object target streamer. 11812483Speter TargetRegistry::RegisterObjectTargetStreamer(*T, 11912483Speter createObjectTargetStreamer); 12012483Speter 1212061Sjkh // Register the asm streamer. 1222061Sjkh TargetRegistry::RegisterAsmTargetStreamer(*T, createTargetAsmStreamer); 1238854Srgrimes 1242061Sjkh // Register the MCInstPrinter 1252061Sjkh TargetRegistry::RegisterMCInstPrinter(*T, createSparcMCInstPrinter); 12612483Speter } 1272061Sjkh} 12827910Sasami