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