1235633Sdim//===-- XCoreMCTargetDesc.cpp - XCore Target Descriptions -----------------===//
2224133Sdim//
3224133Sdim//                     The LLVM Compiler Infrastructure
4224133Sdim//
5224133Sdim// This file is distributed under the University of Illinois Open Source
6224133Sdim// License. See LICENSE.TXT for details.
7224133Sdim//
8224133Sdim//===----------------------------------------------------------------------===//
9224133Sdim//
10224133Sdim// This file provides XCore specific target descriptions.
11224133Sdim//
12224133Sdim//===----------------------------------------------------------------------===//
13224133Sdim
14224133Sdim#include "XCoreMCTargetDesc.h"
15252723Sdim#include "InstPrinter/XCoreInstPrinter.h"
16224133Sdim#include "XCoreMCAsmInfo.h"
17226890Sdim#include "llvm/MC/MCCodeGenInfo.h"
18224133Sdim#include "llvm/MC/MCInstrInfo.h"
19224133Sdim#include "llvm/MC/MCRegisterInfo.h"
20224133Sdim#include "llvm/MC/MCSubtargetInfo.h"
21235633Sdim#include "llvm/Support/ErrorHandling.h"
22226890Sdim#include "llvm/Support/TargetRegistry.h"
23224133Sdim
24224133Sdim#define GET_INSTRINFO_MC_DESC
25224133Sdim#include "XCoreGenInstrInfo.inc"
26224133Sdim
27224133Sdim#define GET_SUBTARGETINFO_MC_DESC
28224133Sdim#include "XCoreGenSubtargetInfo.inc"
29224133Sdim
30224133Sdim#define GET_REGINFO_MC_DESC
31224133Sdim#include "XCoreGenRegisterInfo.inc"
32224133Sdim
33224133Sdimusing namespace llvm;
34224133Sdim
35224133Sdimstatic MCInstrInfo *createXCoreMCInstrInfo() {
36224133Sdim  MCInstrInfo *X = new MCInstrInfo();
37224133Sdim  InitXCoreMCInstrInfo(X);
38224133Sdim  return X;
39224133Sdim}
40224133Sdim
41226890Sdimstatic MCRegisterInfo *createXCoreMCRegisterInfo(StringRef TT) {
42226890Sdim  MCRegisterInfo *X = new MCRegisterInfo();
43226890Sdim  InitXCoreMCRegisterInfo(X, XCore::LR);
44226890Sdim  return X;
45224133Sdim}
46224133Sdim
47224133Sdimstatic MCSubtargetInfo *createXCoreMCSubtargetInfo(StringRef TT, StringRef CPU,
48224133Sdim                                                   StringRef FS) {
49224133Sdim  MCSubtargetInfo *X = new MCSubtargetInfo();
50224133Sdim  InitXCoreMCSubtargetInfo(X, TT, CPU, FS);
51224133Sdim  return X;
52224133Sdim}
53224133Sdim
54263509Sdimstatic MCAsmInfo *createXCoreMCAsmInfo(const MCRegisterInfo &MRI,
55263509Sdim                                       StringRef TT) {
56263509Sdim  MCAsmInfo *MAI = new XCoreMCAsmInfo(TT);
57226890Sdim
58226890Sdim  // Initial state of the frame pointer is SP.
59263509Sdim  MCCFIInstruction Inst = MCCFIInstruction::createDefCfa(0, XCore::SP, 0);
60263509Sdim  MAI->addInitialFrameState(Inst);
61226890Sdim
62226890Sdim  return MAI;
63226890Sdim}
64226890Sdim
65226890Sdimstatic MCCodeGenInfo *createXCoreMCCodeGenInfo(StringRef TT, Reloc::Model RM,
66235633Sdim                                               CodeModel::Model CM,
67235633Sdim                                               CodeGenOpt::Level OL) {
68226890Sdim  MCCodeGenInfo *X = new MCCodeGenInfo();
69252723Sdim  if (RM == Reloc::Default) {
70252723Sdim    RM = Reloc::Static;
71252723Sdim  }
72235633Sdim  X->InitMCCodeGenInfo(RM, CM, OL);
73226890Sdim  return X;
74226890Sdim}
75226890Sdim
76252723Sdimstatic MCInstPrinter *createXCoreMCInstPrinter(const Target &T,
77252723Sdim                                               unsigned SyntaxVariant,
78252723Sdim                                               const MCAsmInfo &MAI,
79252723Sdim                                               const MCInstrInfo &MII,
80252723Sdim                                               const MCRegisterInfo &MRI,
81252723Sdim                                               const MCSubtargetInfo &STI) {
82252723Sdim  return new XCoreInstPrinter(MAI, MII, MRI);
83252723Sdim}
84252723Sdim
85226890Sdim// Force static initialization.
86226890Sdimextern "C" void LLVMInitializeXCoreTargetMC() {
87226890Sdim  // Register the MC asm info.
88226890Sdim  RegisterMCAsmInfoFn X(TheXCoreTarget, createXCoreMCAsmInfo);
89226890Sdim
90226890Sdim  // Register the MC codegen info.
91226890Sdim  TargetRegistry::RegisterMCCodeGenInfo(TheXCoreTarget,
92226890Sdim                                        createXCoreMCCodeGenInfo);
93226890Sdim
94226890Sdim  // Register the MC instruction info.
95226890Sdim  TargetRegistry::RegisterMCInstrInfo(TheXCoreTarget, createXCoreMCInstrInfo);
96226890Sdim
97226890Sdim  // Register the MC register info.
98226890Sdim  TargetRegistry::RegisterMCRegInfo(TheXCoreTarget, createXCoreMCRegisterInfo);
99226890Sdim
100226890Sdim  // Register the MC subtarget info.
101224133Sdim  TargetRegistry::RegisterMCSubtargetInfo(TheXCoreTarget,
102224133Sdim                                          createXCoreMCSubtargetInfo);
103252723Sdim
104252723Sdim  // Register the MCInstPrinter
105252723Sdim  TargetRegistry::RegisterMCInstPrinter(TheXCoreTarget,
106252723Sdim                                        createXCoreMCInstPrinter);
107224133Sdim}
108