blob: 97d1dae4c807c0316f4ea7df57a592e3ffbb9b2b [file] [log] [blame]
Jia Liub22310f2012-02-18 12:03:15 +00001//===-- SparcMCTargetDesc.cpp - Sparc Target Descriptions -----------------===//
Evan Chengbc153d42011-07-14 20:59:42 +00002//
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"
Chandler Carruth8a8cd2b2014-01-07 11:48:04 +000015#include "InstPrinter/SparcInstPrinter.h"
Evan Cheng1705ab02011-07-14 23:50:31 +000016#include "SparcMCAsmInfo.h"
Venkatraman Govindarajubf683fd2013-12-26 01:49:59 +000017#include "SparcTargetStreamer.h"
Evan Cheng4d6c9d72011-08-23 20:15:21 +000018#include "llvm/MC/MCCodeGenInfo.h"
Evan Chengbc153d42011-07-14 20:59:42 +000019#include "llvm/MC/MCInstrInfo.h"
20#include "llvm/MC/MCRegisterInfo.h"
21#include "llvm/MC/MCSubtargetInfo.h"
Craig Topperc4965bc2012-02-05 07:21:30 +000022#include "llvm/Support/ErrorHandling.h"
Evan Cheng2bb40352011-08-24 18:08:43 +000023#include "llvm/Support/TargetRegistry.h"
Evan Chengbc153d42011-07-14 20:59:42 +000024
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
34using namespace llvm;
35
Evan Cheng1705ab02011-07-14 23:50:31 +000036static MCInstrInfo *createSparcMCInstrInfo() {
Evan Chengbc153d42011-07-14 20:59:42 +000037 MCInstrInfo *X = new MCInstrInfo();
38 InitSparcMCInstrInfo(X);
39 return X;
40}
41
Evan Chengd60fa58b2011-07-18 20:57:22 +000042static MCRegisterInfo *createSparcMCRegisterInfo(StringRef TT) {
43 MCRegisterInfo *X = new MCRegisterInfo();
44 InitSparcMCRegisterInfo(X, SP::I7);
45 return X;
46}
47
Evan Cheng1705ab02011-07-14 23:50:31 +000048static MCSubtargetInfo *createSparcMCSubtargetInfo(StringRef TT, StringRef CPU,
49 StringRef FS) {
Evan Chengbc153d42011-07-14 20:59:42 +000050 MCSubtargetInfo *X = new MCSubtargetInfo();
51 InitSparcMCSubtargetInfo(X, TT, CPU, FS);
52 return X;
53}
54
Jakob Stoklund Olesen15b3e902013-04-13 19:02:23 +000055// 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
Evan Cheng63765932011-07-23 00:01:04 +000066static MCCodeGenInfo *createSparcMCCodeGenInfo(StringRef TT, Reloc::Model RM,
Evan Chengecb29082011-11-16 08:38:26 +000067 CodeModel::Model CM,
68 CodeGenOpt::Level OL) {
Evan Cheng2129f592011-07-19 06:37:02 +000069 MCCodeGenInfo *X = new MCCodeGenInfo();
Jakob Stoklund Olesen15b3e902013-04-13 19:02:23 +000070
Venkatraman Govindarajudc3bcc12014-01-24 07:10:19 +000071 // 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 }
Jakob Stoklund Olesen15b3e902013-04-13 19:02:23 +000078
Evan Chengecb29082011-11-16 08:38:26 +000079 X->InitMCCodeGenInfo(RM, CM, OL);
Evan Cheng2129f592011-07-19 06:37:02 +000080 return X;
81}
82
Jakob Stoklund Olesen15b3e902013-04-13 19:02:23 +000083static MCCodeGenInfo *createSparcV9MCCodeGenInfo(StringRef TT, Reloc::Model RM,
84 CodeModel::Model CM,
85 CodeGenOpt::Level OL) {
86 MCCodeGenInfo *X = new MCCodeGenInfo();
87
Venkatraman Govindarajudc3bcc12014-01-24 07:10:19 +000088 // 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 }
Jakob Stoklund Olesen15b3e902013-04-13 19:02:23 +000099
100 X->InitMCCodeGenInfo(RM, CM, OL);
101 return X;
102}
Venkatraman Govindarajubf683fd2013-12-26 01:49:59 +0000103
Venkatraman Govindarajub73aeca2014-01-06 01:22:54 +0000104static MCStreamer *createMCStreamer(const Target &T, StringRef TT,
105 MCContext &Context, MCAsmBackend &MAB,
106 raw_ostream &OS, MCCodeEmitter *Emitter,
107 bool RelaxAll, bool NoExecStack) {
Rafael Espindola24ea09e2014-01-26 06:06:37 +0000108 MCStreamer *S =
109 createELFStreamer(Context, MAB, OS, Emitter, RelaxAll, NoExecStack);
110 new SparcTargetELFStreamer(*S);
111 return S;
Venkatraman Govindarajub73aeca2014-01-06 01:22:54 +0000112}
113
Venkatraman Govindarajubf683fd2013-12-26 01:49:59 +0000114static MCStreamer *
115createMCAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS,
116 bool isVerboseAsm, bool useLoc, bool useCFI,
117 bool useDwarfDirectory, MCInstPrinter *InstPrint,
118 MCCodeEmitter *CE, MCAsmBackend *TAB, bool ShowInst) {
Venkatraman Govindarajubf683fd2013-12-26 01:49:59 +0000119
Rafael Espindola24ea09e2014-01-26 06:06:37 +0000120 MCStreamer *S =
121 llvm::createAsmStreamer(Ctx, OS, isVerboseAsm, useLoc, useCFI,
122 useDwarfDirectory, InstPrint, CE, TAB, ShowInst);
123 new SparcTargetAsmStreamer(*S, OS);
124 return S;
Venkatraman Govindarajubf683fd2013-12-26 01:49:59 +0000125}
126
127static MCInstPrinter *createSparcMCInstPrinter(const Target &T,
128 unsigned SyntaxVariant,
129 const MCAsmInfo &MAI,
130 const MCInstrInfo &MII,
131 const MCRegisterInfo &MRI,
132 const MCSubtargetInfo &STI) {
133 return new SparcInstPrinter(MAI, MII, MRI);
134}
135
Evan Cheng8c886a42011-07-22 21:58:54 +0000136extern "C" void LLVMInitializeSparcTargetMC() {
137 // Register the MC asm info.
138 RegisterMCAsmInfo<SparcELFMCAsmInfo> X(TheSparcTarget);
139 RegisterMCAsmInfo<SparcELFMCAsmInfo> Y(TheSparcV9Target);
140
141 // Register the MC codegen info.
Evan Cheng2129f592011-07-19 06:37:02 +0000142 TargetRegistry::RegisterMCCodeGenInfo(TheSparcTarget,
143 createSparcMCCodeGenInfo);
144 TargetRegistry::RegisterMCCodeGenInfo(TheSparcV9Target,
Jakob Stoklund Olesen15b3e902013-04-13 19:02:23 +0000145 createSparcV9MCCodeGenInfo);
Evan Cheng2129f592011-07-19 06:37:02 +0000146
Evan Cheng8c886a42011-07-22 21:58:54 +0000147 // Register the MC instruction info.
148 TargetRegistry::RegisterMCInstrInfo(TheSparcTarget, createSparcMCInstrInfo);
Venkatraman Govindarajuc2dee7d2014-01-04 11:30:13 +0000149 TargetRegistry::RegisterMCInstrInfo(TheSparcV9Target, createSparcMCInstrInfo);
Evan Cheng8c886a42011-07-22 21:58:54 +0000150
151 // Register the MC register info.
152 TargetRegistry::RegisterMCRegInfo(TheSparcTarget, createSparcMCRegisterInfo);
Venkatraman Govindarajuc2dee7d2014-01-04 11:30:13 +0000153 TargetRegistry::RegisterMCRegInfo(TheSparcV9Target,
154 createSparcMCRegisterInfo);
Evan Cheng8c886a42011-07-22 21:58:54 +0000155
156 // Register the MC subtarget info.
157 TargetRegistry::RegisterMCSubtargetInfo(TheSparcTarget,
158 createSparcMCSubtargetInfo);
Venkatraman Govindarajuc2dee7d2014-01-04 11:30:13 +0000159 TargetRegistry::RegisterMCSubtargetInfo(TheSparcV9Target,
160 createSparcMCSubtargetInfo);
Venkatraman Govindarajubf683fd2013-12-26 01:49:59 +0000161
Venkatraman Govindaraju5f1cce52014-01-05 02:13:48 +0000162 // Register the MC Code Emitter.
163 TargetRegistry::RegisterMCCodeEmitter(TheSparcTarget,
164 createSparcMCCodeEmitter);
165 TargetRegistry::RegisterMCCodeEmitter(TheSparcV9Target,
166 createSparcMCCodeEmitter);
167
168 //Register the asm backend.
169 TargetRegistry::RegisterMCAsmBackend(TheSparcTarget,
170 createSparcAsmBackend);
171 TargetRegistry::RegisterMCAsmBackend(TheSparcV9Target,
172 createSparcAsmBackend);
173
Venkatraman Govindarajub73aeca2014-01-06 01:22:54 +0000174 // Register the object streamer.
175 TargetRegistry::RegisterMCObjectStreamer(TheSparcTarget,
176 createMCStreamer);
177 TargetRegistry::RegisterMCObjectStreamer(TheSparcV9Target,
178 createMCStreamer);
179
180 // Register the asm streamer.
Venkatraman Govindarajubf683fd2013-12-26 01:49:59 +0000181 TargetRegistry::RegisterAsmStreamer(TheSparcTarget,
182 createMCAsmStreamer);
183 TargetRegistry::RegisterAsmStreamer(TheSparcV9Target,
184 createMCAsmStreamer);
185
186 // Register the MCInstPrinter
187 TargetRegistry::RegisterMCInstPrinter(TheSparcTarget,
188 createSparcMCInstPrinter);
189 TargetRegistry::RegisterMCInstPrinter(TheSparcV9Target,
190 createSparcMCInstPrinter);
Evan Cheng8c886a42011-07-22 21:58:54 +0000191}