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