1 //===-- SparcMCTargetDesc.cpp - Sparc Target Descriptions -----------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file provides Sparc specific target descriptions.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "SparcMCTargetDesc.h"
15 #include "InstPrinter/SparcInstPrinter.h"
16 #include "SparcMCAsmInfo.h"
17 #include "SparcTargetStreamer.h"
18 #include "llvm/MC/MCCodeGenInfo.h"
19 #include "llvm/MC/MCInstrInfo.h"
20 #include "llvm/MC/MCRegisterInfo.h"
21 #include "llvm/MC/MCSubtargetInfo.h"
22 #include "llvm/Support/ErrorHandling.h"
23 #include "llvm/Support/TargetRegistry.h"
24 
25 #define GET_INSTRINFO_MC_DESC
26 #include "SparcGenInstrInfo.inc"
27 
28 #define GET_SUBTARGETINFO_MC_DESC
29 #include "SparcGenSubtargetInfo.inc"
30 
31 #define GET_REGINFO_MC_DESC
32 #include "SparcGenRegisterInfo.inc"
33 
34 using namespace llvm;
35 
36 static MCInstrInfo *createSparcMCInstrInfo() {
37   MCInstrInfo *X = new MCInstrInfo();
38   InitSparcMCInstrInfo(X);
39   return X;
40 }
41 
42 static MCRegisterInfo *createSparcMCRegisterInfo(StringRef TT) {
43   MCRegisterInfo *X = new MCRegisterInfo();
44   InitSparcMCRegisterInfo(X, SP::I7);
45   return X;
46 }
47 
48 static MCSubtargetInfo *createSparcMCSubtargetInfo(StringRef TT, StringRef CPU,
49                                                    StringRef FS) {
50   MCSubtargetInfo *X = new MCSubtargetInfo();
51   InitSparcMCSubtargetInfo(X, TT, CPU, FS);
52   return X;
53 }
54 
55 // Code models. Some only make sense for 64-bit code.
56 //
57 // SunCC  Reloc   CodeModel  Constraints
58 // abs32  Static  Small      text+data+bss linked below 2^32 bytes
59 // abs44  Static  Medium     text+data+bss linked below 2^44 bytes
60 // abs64  Static  Large      text smaller than 2^31 bytes
61 // pic13  PIC_    Small      GOT < 2^13 bytes
62 // pic32  PIC_    Medium     GOT < 2^32 bytes
63 //
64 // All code models require that the text segment is smaller than 2GB.
65 
66 static MCCodeGenInfo *createSparcMCCodeGenInfo(StringRef TT, Reloc::Model RM,
67                                                CodeModel::Model CM,
68                                                CodeGenOpt::Level OL) {
69   MCCodeGenInfo *X = new MCCodeGenInfo();
70 
71   // The default 32-bit code model is abs32/pic32 and the default 32-bit
72   // code model for JIT is abs32.
73   switch (CM) {
74   default: break;
75   case CodeModel::Default:
76   case CodeModel::JITDefault: CM = CodeModel::Small; break;
77   }
78 
79   X->InitMCCodeGenInfo(RM, CM, OL);
80   return X;
81 }
82 
83 static MCCodeGenInfo *createSparcV9MCCodeGenInfo(StringRef TT, Reloc::Model RM,
84                                                  CodeModel::Model CM,
85                                                  CodeGenOpt::Level OL) {
86   MCCodeGenInfo *X = new MCCodeGenInfo();
87 
88   // The default 64-bit code model is abs44/pic32 and the default 64-bit
89   // code model for JIT is abs64.
90   switch (CM) {
91   default:  break;
92   case CodeModel::Default:
93     CM = RM == Reloc::PIC_ ? CodeModel::Small : CodeModel::Medium;
94     break;
95   case CodeModel::JITDefault:
96     CM = CodeModel::Large;
97     break;
98   }
99 
100   X->InitMCCodeGenInfo(RM, CM, OL);
101   return X;
102 }
103 
104 static MCStreamer *createMCStreamer(const Target &T, StringRef TT,
105                                     MCContext &Context, MCAsmBackend &MAB,
106                                     raw_ostream &OS, MCCodeEmitter *Emitter,
107                                     const MCSubtargetInfo &STI, bool RelaxAll,
108                                     bool NoExecStack) {
109   MCStreamer *S =
110       createELFStreamer(Context, MAB, OS, Emitter, RelaxAll, NoExecStack);
111   new SparcTargetELFStreamer(*S);
112   return S;
113 }
114 
115 static MCStreamer *
116 createMCAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS,
117                     bool isVerboseAsm, bool useLoc, bool useCFI,
118                     bool useDwarfDirectory, MCInstPrinter *InstPrint,
119                     MCCodeEmitter *CE, MCAsmBackend *TAB, bool ShowInst) {
120 
121   MCStreamer *S =
122       llvm::createAsmStreamer(Ctx, OS, isVerboseAsm, useLoc, useCFI,
123                               useDwarfDirectory, InstPrint, CE, TAB, ShowInst);
124   new SparcTargetAsmStreamer(*S, OS);
125   return S;
126 }
127 
128 static MCInstPrinter *createSparcMCInstPrinter(const Target &T,
129                                               unsigned SyntaxVariant,
130                                               const MCAsmInfo &MAI,
131                                               const MCInstrInfo &MII,
132                                               const MCRegisterInfo &MRI,
133                                               const MCSubtargetInfo &STI) {
134   return new SparcInstPrinter(MAI, MII, MRI);
135 }
136 
137 extern "C" void LLVMInitializeSparcTargetMC() {
138   // Register the MC asm info.
139   RegisterMCAsmInfo<SparcELFMCAsmInfo> X(TheSparcTarget);
140   RegisterMCAsmInfo<SparcELFMCAsmInfo> Y(TheSparcV9Target);
141 
142   // Register the MC codegen info.
143   TargetRegistry::RegisterMCCodeGenInfo(TheSparcTarget,
144                                        createSparcMCCodeGenInfo);
145   TargetRegistry::RegisterMCCodeGenInfo(TheSparcV9Target,
146                                        createSparcV9MCCodeGenInfo);
147 
148   // Register the MC instruction info.
149   TargetRegistry::RegisterMCInstrInfo(TheSparcTarget, createSparcMCInstrInfo);
150   TargetRegistry::RegisterMCInstrInfo(TheSparcV9Target, createSparcMCInstrInfo);
151 
152   // Register the MC register info.
153   TargetRegistry::RegisterMCRegInfo(TheSparcTarget, createSparcMCRegisterInfo);
154   TargetRegistry::RegisterMCRegInfo(TheSparcV9Target,
155                                     createSparcMCRegisterInfo);
156 
157   // Register the MC subtarget info.
158   TargetRegistry::RegisterMCSubtargetInfo(TheSparcTarget,
159                                           createSparcMCSubtargetInfo);
160   TargetRegistry::RegisterMCSubtargetInfo(TheSparcV9Target,
161                                           createSparcMCSubtargetInfo);
162 
163   // Register the MC Code Emitter.
164   TargetRegistry::RegisterMCCodeEmitter(TheSparcTarget,
165                                         createSparcMCCodeEmitter);
166   TargetRegistry::RegisterMCCodeEmitter(TheSparcV9Target,
167                                         createSparcMCCodeEmitter);
168 
169   //Register the asm backend.
170   TargetRegistry::RegisterMCAsmBackend(TheSparcTarget,
171                                        createSparcAsmBackend);
172   TargetRegistry::RegisterMCAsmBackend(TheSparcV9Target,
173                                        createSparcAsmBackend);
174 
175   // Register the object streamer.
176   TargetRegistry::RegisterMCObjectStreamer(TheSparcTarget,
177                                            createMCStreamer);
178   TargetRegistry::RegisterMCObjectStreamer(TheSparcV9Target,
179                                            createMCStreamer);
180 
181   // Register the asm streamer.
182   TargetRegistry::RegisterAsmStreamer(TheSparcTarget,
183                                       createMCAsmStreamer);
184   TargetRegistry::RegisterAsmStreamer(TheSparcV9Target,
185                                       createMCAsmStreamer);
186 
187   // Register the MCInstPrinter
188   TargetRegistry::RegisterMCInstPrinter(TheSparcTarget,
189                                         createSparcMCInstPrinter);
190   TargetRegistry::RegisterMCInstPrinter(TheSparcV9Target,
191                                         createSparcMCInstPrinter);
192 }
193