blob: 0322ddcf4d0e2ee92c047154d80e4336bb090947 [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"
Evan Cheng1705ab02011-07-14 23:50:31 +000015#include "SparcMCAsmInfo.h"
Venkatraman Govindarajubf683fd2013-12-26 01:49:59 +000016#include "SparcTargetStreamer.h"
17#include "InstPrinter/SparcInstPrinter.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
71 // The default 32-bit code model is abs32/pic32.
72 if (CM == CodeModel::Default)
73 CM = RM == Reloc::PIC_ ? CodeModel::Medium : CodeModel::Small;
74
Evan Chengecb29082011-11-16 08:38:26 +000075 X->InitMCCodeGenInfo(RM, CM, OL);
Evan Cheng2129f592011-07-19 06:37:02 +000076 return X;
77}
78
Jakob Stoklund Olesen15b3e902013-04-13 19:02:23 +000079static MCCodeGenInfo *createSparcV9MCCodeGenInfo(StringRef TT, Reloc::Model RM,
80 CodeModel::Model CM,
81 CodeGenOpt::Level OL) {
82 MCCodeGenInfo *X = new MCCodeGenInfo();
83
84 // The default 64-bit code model is abs44/pic32.
85 if (CM == CodeModel::Default)
86 CM = CodeModel::Medium;
87
88 X->InitMCCodeGenInfo(RM, CM, OL);
89 return X;
90}
Venkatraman Govindarajubf683fd2013-12-26 01:49:59 +000091
92static MCStreamer *
93createMCAsmStreamer(MCContext &Ctx, formatted_raw_ostream &OS,
94 bool isVerboseAsm, bool useLoc, bool useCFI,
95 bool useDwarfDirectory, MCInstPrinter *InstPrint,
96 MCCodeEmitter *CE, MCAsmBackend *TAB, bool ShowInst) {
97 SparcTargetAsmStreamer *S = new SparcTargetAsmStreamer(OS);
98
99 return llvm::createAsmStreamer(Ctx, S, OS, isVerboseAsm, useLoc, useCFI,
100 useDwarfDirectory, InstPrint, CE, TAB,
101 ShowInst);
102}
103
104static MCInstPrinter *createSparcMCInstPrinter(const Target &T,
105 unsigned SyntaxVariant,
106 const MCAsmInfo &MAI,
107 const MCInstrInfo &MII,
108 const MCRegisterInfo &MRI,
109 const MCSubtargetInfo &STI) {
110 return new SparcInstPrinter(MAI, MII, MRI);
111}
112
Evan Cheng8c886a42011-07-22 21:58:54 +0000113extern "C" void LLVMInitializeSparcTargetMC() {
114 // Register the MC asm info.
115 RegisterMCAsmInfo<SparcELFMCAsmInfo> X(TheSparcTarget);
116 RegisterMCAsmInfo<SparcELFMCAsmInfo> Y(TheSparcV9Target);
117
118 // Register the MC codegen info.
Evan Cheng2129f592011-07-19 06:37:02 +0000119 TargetRegistry::RegisterMCCodeGenInfo(TheSparcTarget,
120 createSparcMCCodeGenInfo);
121 TargetRegistry::RegisterMCCodeGenInfo(TheSparcV9Target,
Jakob Stoklund Olesen15b3e902013-04-13 19:02:23 +0000122 createSparcV9MCCodeGenInfo);
Evan Cheng2129f592011-07-19 06:37:02 +0000123
Evan Cheng8c886a42011-07-22 21:58:54 +0000124 // Register the MC instruction info.
125 TargetRegistry::RegisterMCInstrInfo(TheSparcTarget, createSparcMCInstrInfo);
Venkatraman Govindarajuc2dee7d2014-01-04 11:30:13 +0000126 TargetRegistry::RegisterMCInstrInfo(TheSparcV9Target, createSparcMCInstrInfo);
Evan Cheng8c886a42011-07-22 21:58:54 +0000127
128 // Register the MC register info.
129 TargetRegistry::RegisterMCRegInfo(TheSparcTarget, createSparcMCRegisterInfo);
Venkatraman Govindarajuc2dee7d2014-01-04 11:30:13 +0000130 TargetRegistry::RegisterMCRegInfo(TheSparcV9Target,
131 createSparcMCRegisterInfo);
Evan Cheng8c886a42011-07-22 21:58:54 +0000132
133 // Register the MC subtarget info.
134 TargetRegistry::RegisterMCSubtargetInfo(TheSparcTarget,
135 createSparcMCSubtargetInfo);
Venkatraman Govindarajuc2dee7d2014-01-04 11:30:13 +0000136 TargetRegistry::RegisterMCSubtargetInfo(TheSparcV9Target,
137 createSparcMCSubtargetInfo);
Venkatraman Govindarajubf683fd2013-12-26 01:49:59 +0000138
Venkatraman Govindaraju5f1cce52014-01-05 02:13:48 +0000139 // Register the MC Code Emitter.
140 TargetRegistry::RegisterMCCodeEmitter(TheSparcTarget,
141 createSparcMCCodeEmitter);
142 TargetRegistry::RegisterMCCodeEmitter(TheSparcV9Target,
143 createSparcMCCodeEmitter);
144
145 //Register the asm backend.
146 TargetRegistry::RegisterMCAsmBackend(TheSparcTarget,
147 createSparcAsmBackend);
148 TargetRegistry::RegisterMCAsmBackend(TheSparcV9Target,
149 createSparcAsmBackend);
150
Venkatraman Govindarajubf683fd2013-12-26 01:49:59 +0000151 TargetRegistry::RegisterAsmStreamer(TheSparcTarget,
152 createMCAsmStreamer);
153 TargetRegistry::RegisterAsmStreamer(TheSparcV9Target,
154 createMCAsmStreamer);
155
156 // Register the MCInstPrinter
157 TargetRegistry::RegisterMCInstPrinter(TheSparcTarget,
158 createSparcMCInstPrinter);
159 TargetRegistry::RegisterMCInstPrinter(TheSparcV9Target,
160 createSparcMCInstPrinter);
Evan Cheng8c886a42011-07-22 21:58:54 +0000161}