blob: 2dbfff2014ae50d1df92efb274598153212022d8 [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) {
108 SparcTargetELFStreamer *S = new SparcTargetELFStreamer();
109 return createELFStreamer(Context, S, MAB, OS, Emitter, RelaxAll, NoExecStack);
110}
111
Venkatraman Govindarajubf683fd2013-12-26 01:49:59 +0000112static MCStreamer *
113createMCAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS,
114 bool isVerboseAsm, bool useLoc, bool useCFI,
115 bool useDwarfDirectory, MCInstPrinter *InstPrint,
116 MCCodeEmitter *CE, MCAsmBackend *TAB, bool ShowInst) {
117 SparcTargetAsmStreamer *S = new SparcTargetAsmStreamer(OS);
118
119 return llvm::createAsmStreamer(Ctx, S, OS, isVerboseAsm, useLoc, useCFI,
120 useDwarfDirectory, InstPrint, CE, TAB,
121 ShowInst);
122}
123
124static MCInstPrinter *createSparcMCInstPrinter(const Target &T,
125 unsigned SyntaxVariant,
126 const MCAsmInfo &MAI,
127 const MCInstrInfo &MII,
128 const MCRegisterInfo &MRI,
129 const MCSubtargetInfo &STI) {
130 return new SparcInstPrinter(MAI, MII, MRI);
131}
132
Evan Cheng8c886a42011-07-22 21:58:54 +0000133extern "C" void LLVMInitializeSparcTargetMC() {
134 // Register the MC asm info.
135 RegisterMCAsmInfo<SparcELFMCAsmInfo> X(TheSparcTarget);
136 RegisterMCAsmInfo<SparcELFMCAsmInfo> Y(TheSparcV9Target);
137
138 // Register the MC codegen info.
Evan Cheng2129f592011-07-19 06:37:02 +0000139 TargetRegistry::RegisterMCCodeGenInfo(TheSparcTarget,
140 createSparcMCCodeGenInfo);
141 TargetRegistry::RegisterMCCodeGenInfo(TheSparcV9Target,
Jakob Stoklund Olesen15b3e902013-04-13 19:02:23 +0000142 createSparcV9MCCodeGenInfo);
Evan Cheng2129f592011-07-19 06:37:02 +0000143
Evan Cheng8c886a42011-07-22 21:58:54 +0000144 // Register the MC instruction info.
145 TargetRegistry::RegisterMCInstrInfo(TheSparcTarget, createSparcMCInstrInfo);
Venkatraman Govindarajuc2dee7d2014-01-04 11:30:13 +0000146 TargetRegistry::RegisterMCInstrInfo(TheSparcV9Target, createSparcMCInstrInfo);
Evan Cheng8c886a42011-07-22 21:58:54 +0000147
148 // Register the MC register info.
149 TargetRegistry::RegisterMCRegInfo(TheSparcTarget, createSparcMCRegisterInfo);
Venkatraman Govindarajuc2dee7d2014-01-04 11:30:13 +0000150 TargetRegistry::RegisterMCRegInfo(TheSparcV9Target,
151 createSparcMCRegisterInfo);
Evan Cheng8c886a42011-07-22 21:58:54 +0000152
153 // Register the MC subtarget info.
154 TargetRegistry::RegisterMCSubtargetInfo(TheSparcTarget,
155 createSparcMCSubtargetInfo);
Venkatraman Govindarajuc2dee7d2014-01-04 11:30:13 +0000156 TargetRegistry::RegisterMCSubtargetInfo(TheSparcV9Target,
157 createSparcMCSubtargetInfo);
Venkatraman Govindarajubf683fd2013-12-26 01:49:59 +0000158
Venkatraman Govindaraju5f1cce52014-01-05 02:13:48 +0000159 // Register the MC Code Emitter.
160 TargetRegistry::RegisterMCCodeEmitter(TheSparcTarget,
161 createSparcMCCodeEmitter);
162 TargetRegistry::RegisterMCCodeEmitter(TheSparcV9Target,
163 createSparcMCCodeEmitter);
164
165 //Register the asm backend.
166 TargetRegistry::RegisterMCAsmBackend(TheSparcTarget,
167 createSparcAsmBackend);
168 TargetRegistry::RegisterMCAsmBackend(TheSparcV9Target,
169 createSparcAsmBackend);
170
Venkatraman Govindarajub73aeca2014-01-06 01:22:54 +0000171 // Register the object streamer.
172 TargetRegistry::RegisterMCObjectStreamer(TheSparcTarget,
173 createMCStreamer);
174 TargetRegistry::RegisterMCObjectStreamer(TheSparcV9Target,
175 createMCStreamer);
176
177 // Register the asm streamer.
Venkatraman Govindarajubf683fd2013-12-26 01:49:59 +0000178 TargetRegistry::RegisterAsmStreamer(TheSparcTarget,
179 createMCAsmStreamer);
180 TargetRegistry::RegisterAsmStreamer(TheSparcV9Target,
181 createMCAsmStreamer);
182
183 // Register the MCInstPrinter
184 TargetRegistry::RegisterMCInstPrinter(TheSparcTarget,
185 createSparcMCInstPrinter);
186 TargetRegistry::RegisterMCInstPrinter(TheSparcV9Target,
187 createSparcMCInstPrinter);
Evan Cheng8c886a42011-07-22 21:58:54 +0000188}