Fundamentally change the MipsSubtarget replacement machinery:
[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   MipsSubtarget DefaultSubtarget;
30   MipsSubtarget NoMips16Subtarget;
31   MipsSubtarget Mips16Subtarget;
32
33 public:
34   MipsTargetMachine(const Target &T, StringRef TT, StringRef CPU, StringRef FS,
35                     const TargetOptions &Options, Reloc::Model RM,
36                     CodeModel::Model CM, CodeGenOpt::Level OL, bool isLittle);
37
38   virtual ~MipsTargetMachine() {}
39
40   void addAnalysisPasses(PassManagerBase &PM) override;
41
42   const MipsInstrInfo *getInstrInfo() const override {
43     return getSubtargetImpl()->getInstrInfo();
44   }
45   const TargetFrameLowering *getFrameLowering() const override {
46     return getSubtargetImpl()->getFrameLowering();
47   }
48   const MipsSubtarget *getSubtargetImpl() const override {
49     if (Subtarget)
50       return Subtarget;
51     return &DefaultSubtarget;
52   }
53   const InstrItineraryData *getInstrItineraryData() const override {
54     return Subtarget->inMips16Mode()
55                ? nullptr
56                : &getSubtargetImpl()->getInstrItineraryData();
57   }
58   MipsJITInfo *getJITInfo() override {
59     return Subtarget->getJITInfo();
60   }
61   const MipsRegisterInfo *getRegisterInfo()  const override {
62     return getSubtargetImpl()->getRegisterInfo();
63   }
64   const MipsTargetLowering *getTargetLowering() const override {
65     return getSubtargetImpl()->getTargetLowering();
66   }
67   const DataLayout *getDataLayout() const override {
68     return getSubtargetImpl()->getDataLayout();
69   }
70   const MipsSelectionDAGInfo* getSelectionDAGInfo() const override {
71     return getSubtargetImpl()->getSelectionDAGInfo();
72   }
73   /// \brief Reset the subtarget for the Mips target.
74   void resetSubtarget(MachineFunction *MF);
75
76   // Pass Pipeline Configuration
77   TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
78   bool addCodeEmitter(PassManagerBase &PM, JITCodeEmitter &JCE) override;
79 };
80
81 /// MipsebTargetMachine - Mips32/64 big endian target machine.
82 ///
83 class MipsebTargetMachine : public MipsTargetMachine {
84   virtual void anchor();
85 public:
86   MipsebTargetMachine(const Target &T, StringRef TT,
87                       StringRef CPU, StringRef FS, const TargetOptions &Options,
88                       Reloc::Model RM, CodeModel::Model CM,
89                       CodeGenOpt::Level OL);
90 };
91
92 /// MipselTargetMachine - Mips32/64 little endian target machine.
93 ///
94 class MipselTargetMachine : public MipsTargetMachine {
95   virtual void anchor();
96 public:
97   MipselTargetMachine(const Target &T, StringRef TT,
98                       StringRef CPU, StringRef FS, const TargetOptions &Options,
99                       Reloc::Model RM, CodeModel::Model CM,
100                       CodeGenOpt::Level OL);
101 };
102
103 } // End llvm namespace
104
105 #endif