Move the data layout and selection dag info from the mips target machine
[oota-llvm.git] / lib / Target / Mips / MipsTargetMachine.h
1 //===-- MipsTargetMachine.h - Define TargetMachine for Mips -----*- C++ -*-===//
2 //
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 declares the Mips specific subclass of TargetMachine.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef MIPSTARGETMACHINE_H
15 #define MIPSTARGETMACHINE_H
16
17 #include "MipsFrameLowering.h"
18 #include "MipsISelLowering.h"
19 #include "MipsInstrInfo.h"
20 #include "MipsSubtarget.h"
21 #include "llvm/CodeGen/Passes.h"
22 #include "llvm/CodeGen/SelectionDAGISel.h"
23 #include "llvm/Target/TargetFrameLowering.h"
24 #include "llvm/Target/TargetMachine.h"
25
26 namespace llvm {
27 class formatted_raw_ostream;
28 class MipsRegisterInfo;
29
30 class MipsTargetMachine : public LLVMTargetMachine {
31   MipsSubtarget       Subtarget;
32   std::unique_ptr<const MipsInstrInfo> InstrInfo;
33   std::unique_ptr<const MipsFrameLowering> FrameLowering;
34   std::unique_ptr<const MipsTargetLowering> TLInfo;
35   std::unique_ptr<const MipsInstrInfo> InstrInfo16;
36   std::unique_ptr<const MipsFrameLowering> FrameLowering16;
37   std::unique_ptr<const MipsTargetLowering> TLInfo16;
38   std::unique_ptr<const MipsInstrInfo> InstrInfoSE;
39   std::unique_ptr<const MipsFrameLowering> FrameLoweringSE;
40   std::unique_ptr<const MipsTargetLowering> TLInfoSE;
41
42 public:
43   MipsTargetMachine(const Target &T, StringRef TT,
44                     StringRef CPU, StringRef FS, const TargetOptions &Options,
45                     Reloc::Model RM, CodeModel::Model CM,
46                     CodeGenOpt::Level OL,
47                     bool isLittle);
48
49   virtual ~MipsTargetMachine() {}
50
51   void addAnalysisPasses(PassManagerBase &PM) override;
52
53   const MipsInstrInfo *getInstrInfo() const override
54   { return InstrInfo.get(); }
55   const TargetFrameLowering *getFrameLowering() const override
56   { return FrameLowering.get(); }
57   const MipsSubtarget *getSubtargetImpl() const override
58   { return &Subtarget; }
59
60   const InstrItineraryData *getInstrItineraryData() const override {
61     return Subtarget.inMips16Mode()
62                ? nullptr
63                : &getSubtargetImpl()->getInstrItineraryData();
64   }
65
66   MipsJITInfo *getJITInfo() override {
67     return Subtarget.getJITInfo();
68   }
69
70   const MipsRegisterInfo *getRegisterInfo()  const override {
71     return &InstrInfo->getRegisterInfo();
72   }
73
74   const MipsTargetLowering *getTargetLowering() const override {
75     return TLInfo.get();
76   }
77
78   const DataLayout *getDataLayout() const override {
79     return getSubtargetImpl()->getDataLayout();
80   }
81   const MipsSelectionDAGInfo* getSelectionDAGInfo() const override {
82     return getSubtargetImpl()->getSelectionDAGInfo();
83   }
84
85   // Pass Pipeline Configuration
86   TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
87   bool addCodeEmitter(PassManagerBase &PM, JITCodeEmitter &JCE) override;
88
89   // Set helper classes
90   void setHelperClassesMips16();
91
92   void setHelperClassesMipsSE();
93
94
95 };
96
97 /// MipsebTargetMachine - Mips32/64 big endian target machine.
98 ///
99 class MipsebTargetMachine : public MipsTargetMachine {
100   virtual void anchor();
101 public:
102   MipsebTargetMachine(const Target &T, StringRef TT,
103                       StringRef CPU, StringRef FS, const TargetOptions &Options,
104                       Reloc::Model RM, CodeModel::Model CM,
105                       CodeGenOpt::Level OL);
106 };
107
108 /// MipselTargetMachine - Mips32/64 little endian target machine.
109 ///
110 class MipselTargetMachine : public MipsTargetMachine {
111   virtual void anchor();
112 public:
113   MipselTargetMachine(const Target &T, StringRef TT,
114                       StringRef CPU, StringRef FS, const TargetOptions &Options,
115                       Reloc::Model RM, CodeModel::Model CM,
116                       CodeGenOpt::Level OL);
117 };
118
119 } // End llvm namespace
120
121 #endif