blob: 737c2fae1a80fa326ed425ed4d4c7ffedc5d308e [file] [log] [blame]
Rafael Espindolaffdc24b2006-05-14 22:18:28 +00001//===-- ARMTargetMachine.h - Define TargetMachine for ARM -------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattnerf3ebc3f2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
Rafael Espindolaffdc24b2006-05-14 22:18:28 +00006// 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
Anton Korobeynikov2f931282011-01-10 12:39:04 +000017#include "ARMFrameLowering.h"
Evan Cheng818242b2007-03-13 01:20:42 +000018#include "ARMISelLowering.h"
Chandler Carruth802d7552012-12-04 07:12:27 +000019#include "ARMInstrInfo.h"
20#include "ARMJITInfo.h"
Dan Gohmanbb919df2010-05-11 17:31:57 +000021#include "ARMSelectionDAGInfo.h"
Chandler Carruth802d7552012-12-04 07:12:27 +000022#include "ARMSubtarget.h"
Anton Korobeynikov2f931282011-01-10 12:39:04 +000023#include "Thumb1FrameLowering.h"
Chandler Carruth802d7552012-12-04 07:12:27 +000024#include "Thumb1InstrInfo.h"
David Goodwinade05a32009-07-02 22:18:33 +000025#include "Thumb2InstrInfo.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000026#include "llvm/IR/DataLayout.h"
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000027#include "llvm/MC/MCStreamer.h"
Chandler Carruth802d7552012-12-04 07:12:27 +000028#include "llvm/Target/TargetMachine.h"
Rafael Espindolaffdc24b2006-05-14 22:18:28 +000029
30namespace llvm {
31
Anton Korobeynikov99152f32009-06-26 21:28:53 +000032class ARMBaseTargetMachine : public LLVMTargetMachine {
33protected:
Evan Cheng4e712de2009-06-19 01:51:50 +000034 ARMSubtarget Subtarget;
Rafael Espindolaffdc24b2006-05-14 22:18:28 +000035public:
Evan Cheng2129f592011-07-19 06:37:02 +000036 ARMBaseTargetMachine(const Target &T, StringRef TT,
Evan Chengefd9b422011-07-20 07:51:56 +000037 StringRef CPU, StringRef FS,
Nick Lewycky50f02cb2011-12-02 22:16:29 +000038 const TargetOptions &Options,
Evan Chengecb29082011-11-16 08:38:26 +000039 Reloc::Model RM, CodeModel::Model CM,
Christian Pirker2a111602014-03-28 14:35:30 +000040 CodeGenOpt::Level OL,
41 bool isLittle);
Rafael Espindolaffdc24b2006-05-14 22:18:28 +000042
Craig Topper6bc27bf2014-03-10 02:09:33 +000043 const ARMSubtarget *getSubtargetImpl() const override { return &Subtarget; }
44 const ARMTargetLowering *getTargetLowering() const override {
Renato Golin5e9d55e2013-01-29 23:31:38 +000045 // Implemented by derived classes
46 llvm_unreachable("getTargetLowering not implemented");
47 }
Craig Topper6bc27bf2014-03-10 02:09:33 +000048 const InstrItineraryData *getInstrItineraryData() const override {
Eric Christopherfb0c26c2014-06-13 23:11:13 +000049 return &getSubtargetImpl()->getInstrItineraryData();
Evan Cheng4e712de2009-06-19 01:51:50 +000050 }
Eric Christopherdaca3cc2014-06-16 21:18:27 +000051 const DataLayout *getDataLayout() const override {
52 return getSubtargetImpl()->getDataLayout();
53 }
Eric Christopher3d19f132014-06-18 22:48:09 +000054 ARMJITInfo *getJITInfo() override { return Subtarget.getJITInfo(); }
55
Jim Grosbach9dbf3ee2013-01-07 21:24:35 +000056 /// \brief Register ARM analysis passes with a pass manager.
Craig Topper6bc27bf2014-03-10 02:09:33 +000057 void addAnalysisPasses(PassManagerBase &PM) override;
Chandler Carruth664e3542013-01-07 01:37:14 +000058
Chris Lattner12e97302006-09-04 04:14:57 +000059 // Pass Pipeline Configuration
Craig Topper6bc27bf2014-03-10 02:09:33 +000060 TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
Andrew Trickccb67362012-02-03 05:12:41 +000061
Craig Topper6bc27bf2014-03-10 02:09:33 +000062 bool addCodeEmitter(PassManagerBase &PM, JITCodeEmitter &MCE) override;
Rafael Espindolaffdc24b2006-05-14 22:18:28 +000063};
64
Anton Korobeynikov99152f32009-06-26 21:28:53 +000065/// ARMTargetMachine - ARM target machine.
66///
67class ARMTargetMachine : public ARMBaseTargetMachine {
David Blaikiea379b1812011-12-20 02:50:00 +000068 virtual void anchor();
Anton Korobeynikov99152f32009-06-26 21:28:53 +000069 ARMInstrInfo InstrInfo;
Anton Korobeynikov99152f32009-06-26 21:28:53 +000070 ARMTargetLowering TLInfo;
Anton Korobeynikov2f931282011-01-10 12:39:04 +000071 ARMFrameLowering FrameLowering;
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000072 public:
Evan Cheng2129f592011-07-19 06:37:02 +000073 ARMTargetMachine(const Target &T, StringRef TT,
Evan Chengefd9b422011-07-20 07:51:56 +000074 StringRef CPU, StringRef FS,
Nick Lewycky50f02cb2011-12-02 22:16:29 +000075 const TargetOptions &Options,
Evan Chengecb29082011-11-16 08:38:26 +000076 Reloc::Model RM, CodeModel::Model CM,
Christian Pirker2a111602014-03-28 14:35:30 +000077 CodeGenOpt::Level OL,
78 bool isLittle);
Anton Korobeynikov99152f32009-06-26 21:28:53 +000079
Craig Topper6bc27bf2014-03-10 02:09:33 +000080 const ARMRegisterInfo *getRegisterInfo() const override {
Anton Korobeynikov99152f32009-06-26 21:28:53 +000081 return &InstrInfo.getRegisterInfo();
82 }
83
Craig Topper6bc27bf2014-03-10 02:09:33 +000084 const ARMTargetLowering *getTargetLowering() const override {
Dan Gohman21cea8a2010-04-17 15:26:15 +000085 return &TLInfo;
Anton Korobeynikov99152f32009-06-26 21:28:53 +000086 }
87
Craig Topper6bc27bf2014-03-10 02:09:33 +000088 const ARMSelectionDAGInfo *getSelectionDAGInfo() const override {
Eric Christopher030294e2014-06-13 00:20:39 +000089 return getSubtargetImpl()->getSelectionDAGInfo();
Dan Gohmanbb919df2010-05-11 17:31:57 +000090 }
Craig Topper6bc27bf2014-03-10 02:09:33 +000091 const ARMFrameLowering *getFrameLowering() const override {
Anton Korobeynikov2f931282011-01-10 12:39:04 +000092 return &FrameLowering;
93 }
Craig Topper6bc27bf2014-03-10 02:09:33 +000094 const ARMInstrInfo *getInstrInfo() const override { return &InstrInfo; }
Anton Korobeynikov99152f32009-06-26 21:28:53 +000095};
96
Christian Pirkerdc9ff752014-04-01 15:19:30 +000097/// ARMLETargetMachine - ARM little endian target machine.
Christian Pirker2a111602014-03-28 14:35:30 +000098///
Christian Pirkerdc9ff752014-04-01 15:19:30 +000099class ARMLETargetMachine : public ARMTargetMachine {
Craig Topper9d74a5a2014-04-29 07:58:41 +0000100 void anchor() override;
Christian Pirker2a111602014-03-28 14:35:30 +0000101public:
Christian Pirkerdc9ff752014-04-01 15:19:30 +0000102 ARMLETargetMachine(const Target &T, StringRef TT,
Christian Pirker2a111602014-03-28 14:35:30 +0000103 StringRef CPU, StringRef FS, const TargetOptions &Options,
104 Reloc::Model RM, CodeModel::Model CM,
105 CodeGenOpt::Level OL);
106};
107
Christian Pirkerdc9ff752014-04-01 15:19:30 +0000108/// ARMBETargetMachine - ARM big endian target machine.
Christian Pirker2a111602014-03-28 14:35:30 +0000109///
Christian Pirkerdc9ff752014-04-01 15:19:30 +0000110class ARMBETargetMachine : public ARMTargetMachine {
Craig Topper9d74a5a2014-04-29 07:58:41 +0000111 void anchor() override;
Christian Pirker2a111602014-03-28 14:35:30 +0000112public:
Christian Pirkerdc9ff752014-04-01 15:19:30 +0000113 ARMBETargetMachine(const Target &T, StringRef TT,
Christian Pirker2a111602014-03-28 14:35:30 +0000114 StringRef CPU, StringRef FS, const TargetOptions &Options,
115 Reloc::Model RM, CodeModel::Model CM,
116 CodeGenOpt::Level OL);
117};
118
Evan Cheng9f830142007-02-23 03:14:31 +0000119/// ThumbTargetMachine - Thumb target machine.
David Goodwinade05a32009-07-02 22:18:33 +0000120/// Due to the way architectures are handled, this represents both
121/// Thumb-1 and Thumb-2.
Evan Cheng9f830142007-02-23 03:14:31 +0000122///
Anton Korobeynikov99152f32009-06-26 21:28:53 +0000123class ThumbTargetMachine : public ARMBaseTargetMachine {
David Blaikiea379b1812011-12-20 02:50:00 +0000124 virtual void anchor();
Jeffrey Yasskin4822dfc2010-03-19 05:25:28 +0000125 // Either Thumb1InstrInfo or Thumb2InstrInfo.
Benjamin Kramerd2da7202014-04-21 09:34:48 +0000126 std::unique_ptr<ARMBaseInstrInfo> InstrInfo;
Anton Korobeynikov99152f32009-06-26 21:28:53 +0000127 ARMTargetLowering TLInfo;
Anton Korobeynikov2f931282011-01-10 12:39:04 +0000128 // Either Thumb1FrameLowering or ARMFrameLowering.
Benjamin Kramerd2da7202014-04-21 09:34:48 +0000129 std::unique_ptr<ARMFrameLowering> FrameLowering;
Evan Cheng9f830142007-02-23 03:14:31 +0000130public:
Evan Cheng2129f592011-07-19 06:37:02 +0000131 ThumbTargetMachine(const Target &T, StringRef TT,
Evan Chengefd9b422011-07-20 07:51:56 +0000132 StringRef CPU, StringRef FS,
Nick Lewycky50f02cb2011-12-02 22:16:29 +0000133 const TargetOptions &Options,
Evan Chengecb29082011-11-16 08:38:26 +0000134 Reloc::Model RM, CodeModel::Model CM,
Christian Pirker2a111602014-03-28 14:35:30 +0000135 CodeGenOpt::Level OL,
136 bool isLittle);
Evan Cheng9f830142007-02-23 03:14:31 +0000137
Jim Grosbach5bde1cb2009-10-25 19:14:48 +0000138 /// returns either Thumb1RegisterInfo or Thumb2RegisterInfo
Craig Topper6bc27bf2014-03-10 02:09:33 +0000139 const ARMBaseRegisterInfo *getRegisterInfo() const override {
David Goodwinade05a32009-07-02 22:18:33 +0000140 return &InstrInfo->getRegisterInfo();
Anton Korobeynikov99152f32009-06-26 21:28:53 +0000141 }
142
Craig Topper6bc27bf2014-03-10 02:09:33 +0000143 const ARMTargetLowering *getTargetLowering() const override {
Dan Gohman21cea8a2010-04-17 15:26:15 +0000144 return &TLInfo;
Anton Korobeynikov99152f32009-06-26 21:28:53 +0000145 }
146
Craig Topper6bc27bf2014-03-10 02:09:33 +0000147 const ARMSelectionDAGInfo *getSelectionDAGInfo() const override {
Eric Christopher030294e2014-06-13 00:20:39 +0000148 return getSubtargetImpl()->getSelectionDAGInfo();
Dan Gohmanbb919df2010-05-11 17:31:57 +0000149 }
150
David Goodwinade05a32009-07-02 22:18:33 +0000151 /// returns either Thumb1InstrInfo or Thumb2InstrInfo
Craig Topper6bc27bf2014-03-10 02:09:33 +0000152 const ARMBaseInstrInfo *getInstrInfo() const override {
Jeffrey Yasskin4822dfc2010-03-19 05:25:28 +0000153 return InstrInfo.get();
154 }
Anton Korobeynikov2f931282011-01-10 12:39:04 +0000155 /// returns either Thumb1FrameLowering or ARMFrameLowering
Craig Topper6bc27bf2014-03-10 02:09:33 +0000156 const ARMFrameLowering *getFrameLowering() const override {
Anton Korobeynikov2f931282011-01-10 12:39:04 +0000157 return FrameLowering.get();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000158 }
Evan Cheng9f830142007-02-23 03:14:31 +0000159};
160
Christian Pirkerdc9ff752014-04-01 15:19:30 +0000161/// ThumbLETargetMachine - Thumb little endian target machine.
Christian Pirker2a111602014-03-28 14:35:30 +0000162///
Christian Pirkerdc9ff752014-04-01 15:19:30 +0000163class ThumbLETargetMachine : public ThumbTargetMachine {
Craig Topper9d74a5a2014-04-29 07:58:41 +0000164 void anchor() override;
Christian Pirker2a111602014-03-28 14:35:30 +0000165public:
Christian Pirkerdc9ff752014-04-01 15:19:30 +0000166 ThumbLETargetMachine(const Target &T, StringRef TT,
Christian Pirker2a111602014-03-28 14:35:30 +0000167 StringRef CPU, StringRef FS, const TargetOptions &Options,
168 Reloc::Model RM, CodeModel::Model CM,
169 CodeGenOpt::Level OL);
170};
171
Christian Pirkerdc9ff752014-04-01 15:19:30 +0000172/// ThumbBETargetMachine - Thumb big endian target machine.
Christian Pirker2a111602014-03-28 14:35:30 +0000173///
Christian Pirkerdc9ff752014-04-01 15:19:30 +0000174class ThumbBETargetMachine : public ThumbTargetMachine {
Craig Topper9d74a5a2014-04-29 07:58:41 +0000175 void anchor() override;
Christian Pirker2a111602014-03-28 14:35:30 +0000176public:
Jim Grosbachbb1af942014-04-03 23:43:22 +0000177 ThumbBETargetMachine(const Target &T, StringRef TT, StringRef CPU,
178 StringRef FS, const TargetOptions &Options,
Christian Pirker2a111602014-03-28 14:35:30 +0000179 Reloc::Model RM, CodeModel::Model CM,
180 CodeGenOpt::Level OL);
181};
182
Rafael Espindolaffdc24b2006-05-14 22:18:28 +0000183} // end namespace llvm
184
185#endif