MipsMCTargetDesc.cpp revision 234353
1193323Sed//===-- MipsMCTargetDesc.cpp - Mips Target Descriptions -------------------===//
2193323Sed//
3193323Sed//                     The LLVM Compiler Infrastructure
4193323Sed//
5193323Sed// This file is distributed under the University of Illinois Open Source
6193323Sed// License. See LICENSE.TXT for details.
7193323Sed//
8193323Sed//===----------------------------------------------------------------------===//
9193323Sed//
10193323Sed// This file provides Mips specific target descriptions.
11193323Sed//
12193323Sed//===----------------------------------------------------------------------===//
13193323Sed
14193323Sed#include "MipsMCAsmInfo.h"
15193323Sed#include "MipsMCTargetDesc.h"
16193323Sed#include "InstPrinter/MipsInstPrinter.h"
17193323Sed#include "llvm/MC/MachineLocation.h"
18193323Sed#include "llvm/MC/MCCodeGenInfo.h"
19193323Sed#include "llvm/MC/MCInstrInfo.h"
20194612Sed#include "llvm/MC/MCRegisterInfo.h"
21193323Sed#include "llvm/MC/MCStreamer.h"
22193323Sed#include "llvm/MC/MCSubtargetInfo.h"
23193323Sed#include "llvm/Support/ErrorHandling.h"
24193323Sed#include "llvm/Support/TargetRegistry.h"
25194178Sed
26193323Sed#define GET_INSTRINFO_MC_DESC
27194612Sed#include "MipsGenInstrInfo.inc"
28193323Sed
29193323Sed#define GET_SUBTARGETINFO_MC_DESC
30194612Sed#include "MipsGenSubtargetInfo.inc"
31194178Sed
32194178Sed#define GET_REGINFO_MC_DESC
33194178Sed#include "MipsGenRegisterInfo.inc"
34194178Sed
35194612Sedusing namespace llvm;
36194178Sed
37194178Sedstatic MCInstrInfo *createMipsMCInstrInfo() {
38193323Sed  MCInstrInfo *X = new MCInstrInfo();
39193323Sed  InitMipsMCInstrInfo(X);
40193323Sed  return X;
41193323Sed}
42193323Sed
43193323Sedstatic MCRegisterInfo *createMipsMCRegisterInfo(StringRef TT) {
44194178Sed  MCRegisterInfo *X = new MCRegisterInfo();
45194612Sed  InitMipsMCRegisterInfo(X, Mips::RA);
46194612Sed  return X;
47194612Sed}
48194612Sed
49194612Sedstatic MCSubtargetInfo *createMipsMCSubtargetInfo(StringRef TT, StringRef CPU,
50194612Sed                                                  StringRef FS) {
51193323Sed  MCSubtargetInfo *X = new MCSubtargetInfo();
52194178Sed  InitMipsMCSubtargetInfo(X, TT, CPU, FS);
53194178Sed  return X;
54194178Sed}
55193323Sed
56193323Sedstatic MCAsmInfo *createMipsMCAsmInfo(const Target &T, StringRef TT) {
57193323Sed  MCAsmInfo *MAI = new MipsMCAsmInfo(T, TT);
58193323Sed
59193323Sed  MachineLocation Dst(MachineLocation::VirtualFP);
60193323Sed  MachineLocation Src(Mips::SP, 0);
61193323Sed  MAI->addInitialFrameState(0, Dst, Src);
62193323Sed
63193323Sed  return MAI;
64193323Sed}
65193323Sed
66193323Sedstatic MCCodeGenInfo *createMipsMCCodeGenInfo(StringRef TT, Reloc::Model RM,
67193323Sed                                              CodeModel::Model CM,
68193323Sed                                              CodeGenOpt::Level OL) {
69193323Sed  MCCodeGenInfo *X = new MCCodeGenInfo();
70193323Sed  if (CM == CodeModel::JITDefault)
71193323Sed    RM = Reloc::Static;
72193323Sed  else if (RM == Reloc::Default)
73193323Sed    RM = Reloc::PIC_;
74193323Sed  X->InitMCCodeGenInfo(RM, CM, OL);
75193323Sed  return X;
76193323Sed}
77193323Sed
78193323Sedstatic MCInstPrinter *createMipsMCInstPrinter(const Target &T,
79193323Sed                                              unsigned SyntaxVariant,
80193323Sed                                              const MCAsmInfo &MAI,
81193323Sed                                              const MCInstrInfo &MII,
82193323Sed                                              const MCRegisterInfo &MRI,
83193574Sed                                              const MCSubtargetInfo &STI) {
84193574Sed  return new MipsInstPrinter(MAI, MII, MRI);
85193574Sed}
86193574Sed
87193574Sedstatic MCStreamer *createMCStreamer(const Target &T, StringRef TT,
88193574Sed                                    MCContext &Ctx, MCAsmBackend &MAB,
89193574Sed                                    raw_ostream &_OS,
90193574Sed                                    MCCodeEmitter *_Emitter,
91193574Sed                                    bool RelaxAll,
92193323Sed                                    bool NoExecStack) {
93193323Sed  Triple TheTriple(TT);
94194612Sed
95194612Sed  return createELFStreamer(Ctx, MAB, _OS, _Emitter, RelaxAll, NoExecStack);
96193323Sed}
97193323Sed
98193323Sedextern "C" void LLVMInitializeMipsTargetMC() {
99193323Sed  // Register the MC asm info.
100193323Sed  RegisterMCAsmInfoFn X(TheMipsTarget, createMipsMCAsmInfo);
101193323Sed  RegisterMCAsmInfoFn Y(TheMipselTarget, createMipsMCAsmInfo);
102193323Sed  RegisterMCAsmInfoFn A(TheMips64Target, createMipsMCAsmInfo);
103193323Sed  RegisterMCAsmInfoFn B(TheMips64elTarget, createMipsMCAsmInfo);
104193323Sed
105193323Sed  // Register the MC codegen info.
106193323Sed  TargetRegistry::RegisterMCCodeGenInfo(TheMipsTarget,
107193323Sed                                        createMipsMCCodeGenInfo);
108193323Sed  TargetRegistry::RegisterMCCodeGenInfo(TheMipselTarget,
109193323Sed                                        createMipsMCCodeGenInfo);
110193323Sed  TargetRegistry::RegisterMCCodeGenInfo(TheMips64Target,
111193323Sed                                        createMipsMCCodeGenInfo);
112193323Sed  TargetRegistry::RegisterMCCodeGenInfo(TheMips64elTarget,
113193323Sed                                        createMipsMCCodeGenInfo);
114193323Sed
115193323Sed  // Register the MC instruction info.
116193323Sed  TargetRegistry::RegisterMCInstrInfo(TheMipsTarget, createMipsMCInstrInfo);
117193323Sed  TargetRegistry::RegisterMCInstrInfo(TheMipselTarget, createMipsMCInstrInfo);
118193323Sed  TargetRegistry::RegisterMCInstrInfo(TheMips64Target, createMipsMCInstrInfo);
119193323Sed  TargetRegistry::RegisterMCInstrInfo(TheMips64elTarget,
120193323Sed                                      createMipsMCInstrInfo);
121193323Sed
122193323Sed  // Register the MC register info.
123193323Sed  TargetRegistry::RegisterMCRegInfo(TheMipsTarget, createMipsMCRegisterInfo);
124193323Sed  TargetRegistry::RegisterMCRegInfo(TheMipselTarget, createMipsMCRegisterInfo);
125193323Sed  TargetRegistry::RegisterMCRegInfo(TheMips64Target, createMipsMCRegisterInfo);
126193323Sed  TargetRegistry::RegisterMCRegInfo(TheMips64elTarget,
127193574Sed                                    createMipsMCRegisterInfo);
128193323Sed
129193323Sed  // Register the MC Code Emitter
130193574Sed  TargetRegistry::RegisterMCCodeEmitter(TheMipsTarget,
131193574Sed                                        createMipsMCCodeEmitterEB);
132193574Sed  TargetRegistry::RegisterMCCodeEmitter(TheMipselTarget,
133193574Sed                                        createMipsMCCodeEmitterEL);
134193574Sed  TargetRegistry::RegisterMCCodeEmitter(TheMips64Target,
135193574Sed                                        createMipsMCCodeEmitterEB);
136193574Sed  TargetRegistry::RegisterMCCodeEmitter(TheMips64elTarget,
137193323Sed                                        createMipsMCCodeEmitterEL);
138193323Sed
139193323Sed  // Register the object streamer.
140193323Sed  TargetRegistry::RegisterMCObjectStreamer(TheMipsTarget, createMCStreamer);
141193323Sed  TargetRegistry::RegisterMCObjectStreamer(TheMipselTarget, createMCStreamer);
142193323Sed  TargetRegistry::RegisterMCObjectStreamer(TheMips64Target, createMCStreamer);
143193323Sed  TargetRegistry::RegisterMCObjectStreamer(TheMips64elTarget,
144193323Sed                                           createMCStreamer);
145193323Sed
146193323Sed  // Register the asm backend.
147193323Sed  TargetRegistry::RegisterMCAsmBackend(TheMipsTarget,
148193323Sed                                       createMipsAsmBackendEB32);
149193323Sed  TargetRegistry::RegisterMCAsmBackend(TheMipselTarget,
150193323Sed                                       createMipsAsmBackendEL32);
151193323Sed  TargetRegistry::RegisterMCAsmBackend(TheMips64Target,
152193323Sed                                       createMipsAsmBackendEB64);
153193323Sed  TargetRegistry::RegisterMCAsmBackend(TheMips64elTarget,
154193323Sed                                       createMipsAsmBackendEL64);
155193323Sed
156193323Sed  // Register the MC subtarget info.
157193323Sed  TargetRegistry::RegisterMCSubtargetInfo(TheMipsTarget,
158193323Sed                                          createMipsMCSubtargetInfo);
159193323Sed  TargetRegistry::RegisterMCSubtargetInfo(TheMipselTarget,
160193323Sed                                          createMipsMCSubtargetInfo);
161193323Sed  TargetRegistry::RegisterMCSubtargetInfo(TheMips64Target,
162193323Sed                                          createMipsMCSubtargetInfo);
163193323Sed  TargetRegistry::RegisterMCSubtargetInfo(TheMips64elTarget,
164193323Sed                                          createMipsMCSubtargetInfo);
165193323Sed
166193323Sed  // Register the MCInstPrinter.
167193323Sed  TargetRegistry::RegisterMCInstPrinter(TheMipsTarget,
168193323Sed                                        createMipsMCInstPrinter);
169193323Sed  TargetRegistry::RegisterMCInstPrinter(TheMipselTarget,
170193323Sed                                        createMipsMCInstPrinter);
171193323Sed  TargetRegistry::RegisterMCInstPrinter(TheMips64Target,
172193323Sed                                        createMipsMCInstPrinter);
173193323Sed  TargetRegistry::RegisterMCInstPrinter(TheMips64elTarget,
174193323Sed                                        createMipsMCInstPrinter);
175193323Sed}
176193323Sed