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