xref: /aosp_15_r20/external/llvm/lib/Target/Sparc/MCTargetDesc/SparcMCTargetDesc.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-- SparcMCTargetDesc.cpp - Sparc Target Descriptions -----------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file provides Sparc specific target descriptions.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker 
14*9880d681SAndroid Build Coastguard Worker #include "SparcMCTargetDesc.h"
15*9880d681SAndroid Build Coastguard Worker #include "InstPrinter/SparcInstPrinter.h"
16*9880d681SAndroid Build Coastguard Worker #include "SparcMCAsmInfo.h"
17*9880d681SAndroid Build Coastguard Worker #include "SparcTargetStreamer.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCInstrInfo.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCRegisterInfo.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/MC/MCSubtargetInfo.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/TargetRegistry.h"
23*9880d681SAndroid Build Coastguard Worker 
24*9880d681SAndroid Build Coastguard Worker using namespace llvm;
25*9880d681SAndroid Build Coastguard Worker 
26*9880d681SAndroid Build Coastguard Worker #define GET_INSTRINFO_MC_DESC
27*9880d681SAndroid Build Coastguard Worker #include "SparcGenInstrInfo.inc"
28*9880d681SAndroid Build Coastguard Worker 
29*9880d681SAndroid Build Coastguard Worker #define GET_SUBTARGETINFO_MC_DESC
30*9880d681SAndroid Build Coastguard Worker #include "SparcGenSubtargetInfo.inc"
31*9880d681SAndroid Build Coastguard Worker 
32*9880d681SAndroid Build Coastguard Worker #define GET_REGINFO_MC_DESC
33*9880d681SAndroid Build Coastguard Worker #include "SparcGenRegisterInfo.inc"
34*9880d681SAndroid Build Coastguard Worker 
createSparcMCAsmInfo(const MCRegisterInfo & MRI,const Triple & TT)35*9880d681SAndroid Build Coastguard Worker static MCAsmInfo *createSparcMCAsmInfo(const MCRegisterInfo &MRI,
36*9880d681SAndroid Build Coastguard Worker                                        const Triple &TT) {
37*9880d681SAndroid Build Coastguard Worker   MCAsmInfo *MAI = new SparcELFMCAsmInfo(TT);
38*9880d681SAndroid Build Coastguard Worker   unsigned Reg = MRI.getDwarfRegNum(SP::O6, true);
39*9880d681SAndroid Build Coastguard Worker   MCCFIInstruction Inst = MCCFIInstruction::createDefCfa(nullptr, Reg, 0);
40*9880d681SAndroid Build Coastguard Worker   MAI->addInitialFrameState(Inst);
41*9880d681SAndroid Build Coastguard Worker   return MAI;
42*9880d681SAndroid Build Coastguard Worker }
43*9880d681SAndroid Build Coastguard Worker 
createSparcV9MCAsmInfo(const MCRegisterInfo & MRI,const Triple & TT)44*9880d681SAndroid Build Coastguard Worker static MCAsmInfo *createSparcV9MCAsmInfo(const MCRegisterInfo &MRI,
45*9880d681SAndroid Build Coastguard Worker                                          const Triple &TT) {
46*9880d681SAndroid Build Coastguard Worker   MCAsmInfo *MAI = new SparcELFMCAsmInfo(TT);
47*9880d681SAndroid Build Coastguard Worker   unsigned Reg = MRI.getDwarfRegNum(SP::O6, true);
48*9880d681SAndroid Build Coastguard Worker   MCCFIInstruction Inst = MCCFIInstruction::createDefCfa(nullptr, Reg, 2047);
49*9880d681SAndroid Build Coastguard Worker   MAI->addInitialFrameState(Inst);
50*9880d681SAndroid Build Coastguard Worker   return MAI;
51*9880d681SAndroid Build Coastguard Worker }
52*9880d681SAndroid Build Coastguard Worker 
createSparcMCInstrInfo()53*9880d681SAndroid Build Coastguard Worker static MCInstrInfo *createSparcMCInstrInfo() {
54*9880d681SAndroid Build Coastguard Worker   MCInstrInfo *X = new MCInstrInfo();
55*9880d681SAndroid Build Coastguard Worker   InitSparcMCInstrInfo(X);
56*9880d681SAndroid Build Coastguard Worker   return X;
57*9880d681SAndroid Build Coastguard Worker }
58*9880d681SAndroid Build Coastguard Worker 
createSparcMCRegisterInfo(const Triple & TT)59*9880d681SAndroid Build Coastguard Worker static MCRegisterInfo *createSparcMCRegisterInfo(const Triple &TT) {
60*9880d681SAndroid Build Coastguard Worker   MCRegisterInfo *X = new MCRegisterInfo();
61*9880d681SAndroid Build Coastguard Worker   InitSparcMCRegisterInfo(X, SP::O7);
62*9880d681SAndroid Build Coastguard Worker   return X;
63*9880d681SAndroid Build Coastguard Worker }
64*9880d681SAndroid Build Coastguard Worker 
65*9880d681SAndroid Build Coastguard Worker static MCSubtargetInfo *
createSparcMCSubtargetInfo(const Triple & TT,StringRef CPU,StringRef FS)66*9880d681SAndroid Build Coastguard Worker createSparcMCSubtargetInfo(const Triple &TT, StringRef CPU, StringRef FS) {
67*9880d681SAndroid Build Coastguard Worker   if (CPU.empty())
68*9880d681SAndroid Build Coastguard Worker     CPU = (TT.getArch() == Triple::sparcv9) ? "v9" : "v8";
69*9880d681SAndroid Build Coastguard Worker   return createSparcMCSubtargetInfoImpl(TT, CPU, FS);
70*9880d681SAndroid Build Coastguard Worker }
71*9880d681SAndroid Build Coastguard Worker 
72*9880d681SAndroid Build Coastguard Worker // Code models. Some only make sense for 64-bit code.
73*9880d681SAndroid Build Coastguard Worker //
74*9880d681SAndroid Build Coastguard Worker // SunCC  Reloc   CodeModel  Constraints
75*9880d681SAndroid Build Coastguard Worker // abs32  Static  Small      text+data+bss linked below 2^32 bytes
76*9880d681SAndroid Build Coastguard Worker // abs44  Static  Medium     text+data+bss linked below 2^44 bytes
77*9880d681SAndroid Build Coastguard Worker // abs64  Static  Large      text smaller than 2^31 bytes
78*9880d681SAndroid Build Coastguard Worker // pic13  PIC_    Small      GOT < 2^13 bytes
79*9880d681SAndroid Build Coastguard Worker // pic32  PIC_    Medium     GOT < 2^32 bytes
80*9880d681SAndroid Build Coastguard Worker //
81*9880d681SAndroid Build Coastguard Worker // All code models require that the text segment is smaller than 2GB.
82*9880d681SAndroid Build Coastguard Worker 
adjustCodeGenOpts(const Triple & TT,Reloc::Model RM,CodeModel::Model & CM)83*9880d681SAndroid Build Coastguard Worker static void adjustCodeGenOpts(const Triple &TT, Reloc::Model RM,
84*9880d681SAndroid Build Coastguard Worker                               CodeModel::Model &CM) {
85*9880d681SAndroid Build Coastguard Worker   // The default 32-bit code model is abs32/pic32 and the default 32-bit
86*9880d681SAndroid Build Coastguard Worker   // code model for JIT is abs32.
87*9880d681SAndroid Build Coastguard Worker   switch (CM) {
88*9880d681SAndroid Build Coastguard Worker   default: break;
89*9880d681SAndroid Build Coastguard Worker   case CodeModel::Default:
90*9880d681SAndroid Build Coastguard Worker   case CodeModel::JITDefault: CM = CodeModel::Small; break;
91*9880d681SAndroid Build Coastguard Worker   }
92*9880d681SAndroid Build Coastguard Worker }
93*9880d681SAndroid Build Coastguard Worker 
adjustCodeGenOptsV9(const Triple & TT,Reloc::Model RM,CodeModel::Model & CM)94*9880d681SAndroid Build Coastguard Worker static void adjustCodeGenOptsV9(const Triple &TT, Reloc::Model RM,
95*9880d681SAndroid Build Coastguard Worker                                 CodeModel::Model &CM) {
96*9880d681SAndroid Build Coastguard Worker   // The default 64-bit code model is abs44/pic32 and the default 64-bit
97*9880d681SAndroid Build Coastguard Worker   // code model for JIT is abs64.
98*9880d681SAndroid Build Coastguard Worker   switch (CM) {
99*9880d681SAndroid Build Coastguard Worker   default:  break;
100*9880d681SAndroid Build Coastguard Worker   case CodeModel::Default:
101*9880d681SAndroid Build Coastguard Worker     CM = RM == Reloc::PIC_ ? CodeModel::Small : CodeModel::Medium;
102*9880d681SAndroid Build Coastguard Worker     break;
103*9880d681SAndroid Build Coastguard Worker   case CodeModel::JITDefault:
104*9880d681SAndroid Build Coastguard Worker     CM = CodeModel::Large;
105*9880d681SAndroid Build Coastguard Worker     break;
106*9880d681SAndroid Build Coastguard Worker   }
107*9880d681SAndroid Build Coastguard Worker }
108*9880d681SAndroid Build Coastguard Worker 
109*9880d681SAndroid Build Coastguard Worker static MCTargetStreamer *
createObjectTargetStreamer(MCStreamer & S,const MCSubtargetInfo & STI)110*9880d681SAndroid Build Coastguard Worker createObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {
111*9880d681SAndroid Build Coastguard Worker   return new SparcTargetELFStreamer(S);
112*9880d681SAndroid Build Coastguard Worker }
113*9880d681SAndroid Build Coastguard Worker 
createTargetAsmStreamer(MCStreamer & S,formatted_raw_ostream & OS,MCInstPrinter * InstPrint,bool isVerboseAsm)114*9880d681SAndroid Build Coastguard Worker static MCTargetStreamer *createTargetAsmStreamer(MCStreamer &S,
115*9880d681SAndroid Build Coastguard Worker                                                  formatted_raw_ostream &OS,
116*9880d681SAndroid Build Coastguard Worker                                                  MCInstPrinter *InstPrint,
117*9880d681SAndroid Build Coastguard Worker                                                  bool isVerboseAsm) {
118*9880d681SAndroid Build Coastguard Worker   return new SparcTargetAsmStreamer(S, OS);
119*9880d681SAndroid Build Coastguard Worker }
120*9880d681SAndroid Build Coastguard Worker 
createSparcMCInstPrinter(const Triple & T,unsigned SyntaxVariant,const MCAsmInfo & MAI,const MCInstrInfo & MII,const MCRegisterInfo & MRI)121*9880d681SAndroid Build Coastguard Worker static MCInstPrinter *createSparcMCInstPrinter(const Triple &T,
122*9880d681SAndroid Build Coastguard Worker                                                unsigned SyntaxVariant,
123*9880d681SAndroid Build Coastguard Worker                                                const MCAsmInfo &MAI,
124*9880d681SAndroid Build Coastguard Worker                                                const MCInstrInfo &MII,
125*9880d681SAndroid Build Coastguard Worker                                                const MCRegisterInfo &MRI) {
126*9880d681SAndroid Build Coastguard Worker   return new SparcInstPrinter(MAI, MII, MRI);
127*9880d681SAndroid Build Coastguard Worker }
128*9880d681SAndroid Build Coastguard Worker 
LLVMInitializeSparcTargetMC()129*9880d681SAndroid Build Coastguard Worker extern "C" void LLVMInitializeSparcTargetMC() {
130*9880d681SAndroid Build Coastguard Worker   // Register the MC asm info.
131*9880d681SAndroid Build Coastguard Worker   RegisterMCAsmInfoFn X(TheSparcTarget, createSparcMCAsmInfo);
132*9880d681SAndroid Build Coastguard Worker   RegisterMCAsmInfoFn Y(TheSparcV9Target, createSparcV9MCAsmInfo);
133*9880d681SAndroid Build Coastguard Worker   RegisterMCAsmInfoFn Z(TheSparcelTarget, createSparcMCAsmInfo);
134*9880d681SAndroid Build Coastguard Worker 
135*9880d681SAndroid Build Coastguard Worker   for (Target *T : {&TheSparcTarget, &TheSparcV9Target, &TheSparcelTarget}) {
136*9880d681SAndroid Build Coastguard Worker     // Register the MC instruction info.
137*9880d681SAndroid Build Coastguard Worker     TargetRegistry::RegisterMCInstrInfo(*T, createSparcMCInstrInfo);
138*9880d681SAndroid Build Coastguard Worker 
139*9880d681SAndroid Build Coastguard Worker     // Register the MC register info.
140*9880d681SAndroid Build Coastguard Worker     TargetRegistry::RegisterMCRegInfo(*T, createSparcMCRegisterInfo);
141*9880d681SAndroid Build Coastguard Worker 
142*9880d681SAndroid Build Coastguard Worker     // Register the MC subtarget info.
143*9880d681SAndroid Build Coastguard Worker     TargetRegistry::RegisterMCSubtargetInfo(*T, createSparcMCSubtargetInfo);
144*9880d681SAndroid Build Coastguard Worker 
145*9880d681SAndroid Build Coastguard Worker     // Register the MC Code Emitter.
146*9880d681SAndroid Build Coastguard Worker     TargetRegistry::RegisterMCCodeEmitter(*T, createSparcMCCodeEmitter);
147*9880d681SAndroid Build Coastguard Worker 
148*9880d681SAndroid Build Coastguard Worker     // Register the asm backend.
149*9880d681SAndroid Build Coastguard Worker     TargetRegistry::RegisterMCAsmBackend(*T, createSparcAsmBackend);
150*9880d681SAndroid Build Coastguard Worker 
151*9880d681SAndroid Build Coastguard Worker     // Register the object target streamer.
152*9880d681SAndroid Build Coastguard Worker     TargetRegistry::RegisterObjectTargetStreamer(*T,
153*9880d681SAndroid Build Coastguard Worker                                                  createObjectTargetStreamer);
154*9880d681SAndroid Build Coastguard Worker 
155*9880d681SAndroid Build Coastguard Worker     // Register the asm streamer.
156*9880d681SAndroid Build Coastguard Worker     TargetRegistry::RegisterAsmTargetStreamer(*T, createTargetAsmStreamer);
157*9880d681SAndroid Build Coastguard Worker 
158*9880d681SAndroid Build Coastguard Worker     // Register the MCInstPrinter
159*9880d681SAndroid Build Coastguard Worker     TargetRegistry::RegisterMCInstPrinter(*T, createSparcMCInstPrinter);
160*9880d681SAndroid Build Coastguard Worker   }
161*9880d681SAndroid Build Coastguard Worker 
162*9880d681SAndroid Build Coastguard Worker   // Register the MC codegen info.
163*9880d681SAndroid Build Coastguard Worker   TargetRegistry::registerMCAdjustCodeGenOpts(TheSparcTarget,
164*9880d681SAndroid Build Coastguard Worker                                               adjustCodeGenOpts);
165*9880d681SAndroid Build Coastguard Worker   TargetRegistry::registerMCAdjustCodeGenOpts(TheSparcV9Target,
166*9880d681SAndroid Build Coastguard Worker                                               adjustCodeGenOptsV9);
167*9880d681SAndroid Build Coastguard Worker   TargetRegistry::registerMCAdjustCodeGenOpts(TheSparcelTarget,
168*9880d681SAndroid Build Coastguard Worker                                               adjustCodeGenOpts);
169*9880d681SAndroid Build Coastguard Worker }
170