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-exception
6//
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/Support/ErrorHandling.h"
22#include "llvm/Support/TargetRegistry.h"
23
24using namespace llvm;
25
26#define GET_INSTRINFO_MC_DESC
27#include "SparcGenInstrInfo.inc"
28
29#define GET_SUBTARGETINFO_MC_DESC
30#include "SparcGenSubtargetInfo.inc"
31
32#define GET_REGINFO_MC_DESC
33#include "SparcGenRegisterInfo.inc"
34
35static MCAsmInfo *createSparcMCAsmInfo(const MCRegisterInfo &MRI,
36                                       const Triple &TT,
37                                       const MCTargetOptions &Options) {
38  MCAsmInfo *MAI = new SparcELFMCAsmInfo(TT);
39  unsigned Reg = MRI.getDwarfRegNum(SP::O6, true);
40  MCCFIInstruction Inst = MCCFIInstruction::createDefCfa(nullptr, Reg, 0);
41  MAI->addInitialFrameState(Inst);
42  return MAI;
43}
44
45static MCAsmInfo *createSparcV9MCAsmInfo(const MCRegisterInfo &MRI,
46                                         const Triple &TT,
47                                         const MCTargetOptions &Options) {
48  MCAsmInfo *MAI = new SparcELFMCAsmInfo(TT);
49  unsigned Reg = MRI.getDwarfRegNum(SP::O6, true);
50  MCCFIInstruction Inst = MCCFIInstruction::createDefCfa(nullptr, Reg, 2047);
51  MAI->addInitialFrameState(Inst);
52  return MAI;
53}
54
55static MCInstrInfo *createSparcMCInstrInfo() {
56  MCInstrInfo *X = new MCInstrInfo();
57  InitSparcMCInstrInfo(X);
58  return X;
59}
60
61static MCRegisterInfo *createSparcMCRegisterInfo(const Triple &TT) {
62  MCRegisterInfo *X = new MCRegisterInfo();
63  InitSparcMCRegisterInfo(X, SP::O7);
64  return X;
65}
66
67static MCSubtargetInfo *
68createSparcMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) {
69  if (CPU.empty())
70    CPU = (TT.getArch() == Triple::sparcv9) ? "v9" : "v8";
71  return createSparcMCSubtargetInfoImpl(TT, CPU, FS);
72}
73
74static MCTargetStreamer *
75createObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {
76  return new SparcTargetELFStreamer(S);
77}
78
79static MCTargetStreamer *createTargetAsmStreamer(MCStreamer &S,
80                                                 formatted_raw_ostream &OS,
81                                                 MCInstPrinter *InstPrint,
82                                                 bool isVerboseAsm) {
83  return new SparcTargetAsmStreamer(S, OS);
84}
85
86static MCInstPrinter *createSparcMCInstPrinter(const Triple &T,
87                                               unsigned SyntaxVariant,
88                                               const MCAsmInfo &MAI,
89                                               const MCInstrInfo &MII,
90                                               const MCRegisterInfo &MRI) {
91  return new SparcInstPrinter(MAI, MII, MRI);
92}
93
94extern "C" LLVM_EXTERNAL_VISIBILITY void LLVMInitializeSparcTargetMC() {
95  // Register the MC asm info.
96  RegisterMCAsmInfoFn X(getTheSparcTarget(), createSparcMCAsmInfo);
97  RegisterMCAsmInfoFn Y(getTheSparcV9Target(), createSparcV9MCAsmInfo);
98  RegisterMCAsmInfoFn Z(getTheSparcelTarget(), createSparcMCAsmInfo);
99
100  for (Target *T :
101       {&getTheSparcTarget(), &getTheSparcV9Target(), &getTheSparcelTarget()}) {
102    // Register the MC instruction info.
103    TargetRegistry::RegisterMCInstrInfo(*T, createSparcMCInstrInfo);
104
105    // Register the MC register info.
106    TargetRegistry::RegisterMCRegInfo(*T, createSparcMCRegisterInfo);
107
108    // Register the MC subtarget info.
109    TargetRegistry::RegisterMCSubtargetInfo(*T, createSparcMCSubtargetInfo);
110
111    // Register the MC Code Emitter.
112    TargetRegistry::RegisterMCCodeEmitter(*T, createSparcMCCodeEmitter);
113
114    // Register the asm backend.
115    TargetRegistry::RegisterMCAsmBackend(*T, createSparcAsmBackend);
116
117    // Register the object target streamer.
118    TargetRegistry::RegisterObjectTargetStreamer(*T,
119                                                 createObjectTargetStreamer);
120
121    // Register the asm streamer.
122    TargetRegistry::RegisterAsmTargetStreamer(*T, createTargetAsmStreamer);
123
124    // Register the MCInstPrinter
125    TargetRegistry::RegisterMCInstPrinter(*T, createSparcMCInstPrinter);
126  }
127}
128