986789be8ddf840fbc98b4cbecdb92913a3b6a86
[oota-llvm.git] / lib / Target / ARM / ARMTargetMachine.h
1 //===-- ARMTargetMachine.h - Define TargetMachine for ARM -------*- 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 ARM specific subclass of TargetMachine.
11 //
12 //===----------------------------------------------------------------------===//
13
14 #ifndef ARMTARGETMACHINE_H
15 #define ARMTARGETMACHINE_H
16
17 #include "ARMFrameLowering.h"
18 #include "ARMISelLowering.h"
19 #include "ARMInstrInfo.h"
20 #include "ARMJITInfo.h"
21 #include "ARMSelectionDAGInfo.h"
22 #include "ARMSubtarget.h"
23 #include "Thumb1FrameLowering.h"
24 #include "Thumb1InstrInfo.h"
25 #include "Thumb2InstrInfo.h"
26 #include "llvm/IR/DataLayout.h"
27 #include "llvm/MC/MCStreamer.h"
28 #include "llvm/Target/TargetMachine.h"
29
30 namespace llvm {
31
32 class ARMBaseTargetMachine : public LLVMTargetMachine {
33 protected:
34   ARMSubtarget        Subtarget;
35 private:
36   InstrItineraryData  InstrItins;
37
38 public:
39   ARMBaseTargetMachine(const Target &T, StringRef TT,
40                        StringRef CPU, StringRef FS,
41                        const TargetOptions &Options,
42                        Reloc::Model RM, CodeModel::Model CM,
43                        CodeGenOpt::Level OL,
44                        bool isLittle);
45
46   const ARMSubtarget *getSubtargetImpl() const override { return &Subtarget; }
47   const ARMTargetLowering *getTargetLowering() const override {
48     // Implemented by derived classes
49     llvm_unreachable("getTargetLowering not implemented");
50   }
51   const InstrItineraryData *getInstrItineraryData() const override {
52     return &InstrItins;
53   }
54
55   /// \brief Register ARM analysis passes with a pass manager.
56   void addAnalysisPasses(PassManagerBase &PM) override;
57
58   // Pass Pipeline Configuration
59   TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
60
61   bool addCodeEmitter(PassManagerBase &PM, JITCodeEmitter &MCE) override;
62 };
63
64 /// ARMTargetMachine - ARM target machine.
65 ///
66 class ARMTargetMachine : public ARMBaseTargetMachine {
67   virtual void anchor();
68   ARMInstrInfo        InstrInfo;
69   ARMTargetLowering   TLInfo;
70   ARMFrameLowering    FrameLowering;
71  public:
72   ARMTargetMachine(const Target &T, StringRef TT,
73                    StringRef CPU, StringRef FS,
74                    const TargetOptions &Options,
75                    Reloc::Model RM, CodeModel::Model CM,
76                    CodeGenOpt::Level OL,
77                    bool isLittle);
78
79   const ARMRegisterInfo *getRegisterInfo() const override {
80     return &InstrInfo.getRegisterInfo();
81   }
82
83   const ARMTargetLowering *getTargetLowering() const override {
84     return &TLInfo;
85   }
86
87   const ARMSelectionDAGInfo *getSelectionDAGInfo() const override {
88     return getSubtargetImpl()->getSelectionDAGInfo();
89   }
90   const ARMFrameLowering *getFrameLowering() const override {
91     return &FrameLowering;
92   }
93   const ARMInstrInfo *getInstrInfo() const override { return &InstrInfo; }
94   const DataLayout *getDataLayout() const override {
95     return getSubtargetImpl()->getDataLayout();
96   }
97 };
98
99 /// ARMLETargetMachine - ARM little endian target machine.
100 ///
101 class ARMLETargetMachine : public ARMTargetMachine {
102   void anchor() override;
103 public:
104   ARMLETargetMachine(const Target &T, StringRef TT,
105                      StringRef CPU, StringRef FS, const TargetOptions &Options,
106                      Reloc::Model RM, CodeModel::Model CM,
107                      CodeGenOpt::Level OL);
108 };
109
110 /// ARMBETargetMachine - ARM big endian target machine.
111 ///
112 class ARMBETargetMachine : public ARMTargetMachine {
113   void anchor() override;
114 public:
115   ARMBETargetMachine(const Target &T, StringRef TT,
116                      StringRef CPU, StringRef FS, const TargetOptions &Options,
117                      Reloc::Model RM, CodeModel::Model CM,
118                      CodeGenOpt::Level OL);
119 };
120
121 /// ThumbTargetMachine - Thumb target machine.
122 /// Due to the way architectures are handled, this represents both
123 ///   Thumb-1 and Thumb-2.
124 ///
125 class ThumbTargetMachine : public ARMBaseTargetMachine {
126   virtual void anchor();
127   // Either Thumb1InstrInfo or Thumb2InstrInfo.
128   std::unique_ptr<ARMBaseInstrInfo> InstrInfo;
129   ARMTargetLowering   TLInfo;
130   // Either Thumb1FrameLowering or ARMFrameLowering.
131   std::unique_ptr<ARMFrameLowering> FrameLowering;
132 public:
133   ThumbTargetMachine(const Target &T, StringRef TT,
134                      StringRef CPU, StringRef FS,
135                      const TargetOptions &Options,
136                      Reloc::Model RM, CodeModel::Model CM,
137                      CodeGenOpt::Level OL,
138                      bool isLittle);
139
140   /// returns either Thumb1RegisterInfo or Thumb2RegisterInfo
141   const ARMBaseRegisterInfo *getRegisterInfo() const override {
142     return &InstrInfo->getRegisterInfo();
143   }
144
145   const ARMTargetLowering *getTargetLowering() const override {
146     return &TLInfo;
147   }
148
149   const ARMSelectionDAGInfo *getSelectionDAGInfo() const override {
150     return getSubtargetImpl()->getSelectionDAGInfo();
151   }
152
153   /// returns either Thumb1InstrInfo or Thumb2InstrInfo
154   const ARMBaseInstrInfo *getInstrInfo() const override {
155     return InstrInfo.get();
156   }
157   /// returns either Thumb1FrameLowering or ARMFrameLowering
158   const ARMFrameLowering *getFrameLowering() const override {
159     return FrameLowering.get();
160   }
161   const DataLayout *getDataLayout() const override {
162     return getSubtargetImpl()->getDataLayout();
163   }
164 };
165
166 /// ThumbLETargetMachine - Thumb little endian target machine.
167 ///
168 class ThumbLETargetMachine : public ThumbTargetMachine {
169   void anchor() override;
170 public:
171   ThumbLETargetMachine(const Target &T, StringRef TT,
172                      StringRef CPU, StringRef FS, const TargetOptions &Options,
173                      Reloc::Model RM, CodeModel::Model CM,
174                      CodeGenOpt::Level OL);
175 };
176
177 /// ThumbBETargetMachine - Thumb big endian target machine.
178 ///
179 class ThumbBETargetMachine : public ThumbTargetMachine {
180   void anchor() override;
181 public:
182   ThumbBETargetMachine(const Target &T, StringRef TT, StringRef CPU,
183                        StringRef FS, const TargetOptions &Options,
184                        Reloc::Model RM, CodeModel::Model CM,
185                        CodeGenOpt::Level OL);
186 };
187
188 } // end namespace llvm
189
190 #endif