Move subtarget dependent features into the subtarget from the target
[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 "MipsSubtarget.h"
18 #include "llvm/CodeGen/Passes.h"
19 #include "llvm/CodeGen/SelectionDAGISel.h"
20 #include "llvm/Target/TargetFrameLowering.h"
21 #include "llvm/Target/TargetMachine.h"
22
23 namespace llvm {
24 class formatted_raw_ostream;
25 class MipsRegisterInfo;
26
27 class MipsTargetMachine : public LLVMTargetMachine {
28   MipsSubtarget       Subtarget;
29
30 public:
31   MipsTargetMachine(const Target &T, StringRef TT, StringRef CPU, StringRef FS,
32                     const TargetOptions &Options, Reloc::Model RM,
33                     CodeModel::Model CM, CodeGenOpt::Level OL, bool isLittle);
34
35   virtual ~MipsTargetMachine() {}
36
37   void addAnalysisPasses(PassManagerBase &PM) override;
38
39   const MipsInstrInfo *getInstrInfo() const override {
40     return getSubtargetImpl()->getInstrInfo();
41   }
42   const TargetFrameLowering *getFrameLowering() const override {
43     return getSubtargetImpl()->getFrameLowering();
44   }
45   const MipsSubtarget *getSubtargetImpl() const override { return &Subtarget; }
46   const InstrItineraryData *getInstrItineraryData() const override {
47     return Subtarget.inMips16Mode()
48                ? nullptr
49                : &getSubtargetImpl()->getInstrItineraryData();
50   }
51   MipsJITInfo *getJITInfo() override {
52     return Subtarget.getJITInfo();
53   }
54   const MipsRegisterInfo *getRegisterInfo()  const override {
55     return getSubtargetImpl()->getRegisterInfo();
56   }
57   const MipsTargetLowering *getTargetLowering() const override {
58     return getSubtargetImpl()->getTargetLowering();
59   }
60   const DataLayout *getDataLayout() const override {
61     return getSubtargetImpl()->getDataLayout();
62   }
63   const MipsSelectionDAGInfo* getSelectionDAGInfo() const override {
64     return getSubtargetImpl()->getSelectionDAGInfo();
65   }
66
67   // Pass Pipeline Configuration
68   TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
69   bool addCodeEmitter(PassManagerBase &PM, JITCodeEmitter &JCE) override;
70 };
71
72 /// MipsebTargetMachine - Mips32/64 big endian target machine.
73 ///
74 class MipsebTargetMachine : public MipsTargetMachine {
75   virtual void anchor();
76 public:
77   MipsebTargetMachine(const Target &T, StringRef TT,
78                       StringRef CPU, StringRef FS, const TargetOptions &Options,
79                       Reloc::Model RM, CodeModel::Model CM,
80                       CodeGenOpt::Level OL);
81 };
82
83 /// MipselTargetMachine - Mips32/64 little endian target machine.
84 ///
85 class MipselTargetMachine : public MipsTargetMachine {
86   virtual void anchor();
87 public:
88   MipselTargetMachine(const Target &T, StringRef TT,
89                       StringRef CPU, StringRef FS, const TargetOptions &Options,
90                       Reloc::Model RM, CodeModel::Model CM,
91                       CodeGenOpt::Level OL);
92 };
93
94 } // End llvm namespace
95
96 #endif