blob: b77effc9c435066e1d5a2abe4a5a30f93079d553 [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 Carruth802d7552012-12-04 07:12:27 +000026#include "llvm/ADT/OwningPtr.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000027#include "llvm/IR/DataLayout.h"
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000028#include "llvm/MC/MCStreamer.h"
Chandler Carruth802d7552012-12-04 07:12:27 +000029#include "llvm/Target/TargetMachine.h"
Rafael Espindolaffdc24b2006-05-14 22:18:28 +000030
31namespace llvm {
32
Anton Korobeynikov99152f32009-06-26 21:28:53 +000033class ARMBaseTargetMachine : public LLVMTargetMachine {
34protected:
Evan Cheng4e712de2009-06-19 01:51:50 +000035 ARMSubtarget Subtarget;
Anton Korobeynikov99152f32009-06-26 21:28:53 +000036private:
Evan Cheng4e712de2009-06-19 01:51:50 +000037 ARMJITInfo JITInfo;
Evan Cheng4e712de2009-06-19 01:51:50 +000038 InstrItineraryData InstrItins;
Evan Cheng818242b2007-03-13 01:20:42 +000039
Rafael Espindolaffdc24b2006-05-14 22:18:28 +000040public:
Evan Cheng2129f592011-07-19 06:37:02 +000041 ARMBaseTargetMachine(const Target &T, StringRef TT,
Evan Chengefd9b422011-07-20 07:51:56 +000042 StringRef CPU, StringRef FS,
Nick Lewycky50f02cb2011-12-02 22:16:29 +000043 const TargetOptions &Options,
Evan Chengecb29082011-11-16 08:38:26 +000044 Reloc::Model RM, CodeModel::Model CM,
Christian Pirker2a111602014-03-28 14:35:30 +000045 CodeGenOpt::Level OL,
46 bool isLittle);
Rafael Espindolaffdc24b2006-05-14 22:18:28 +000047
Craig Topper6bc27bf2014-03-10 02:09:33 +000048 ARMJITInfo *getJITInfo() override { return &JITInfo; }
49 const ARMSubtarget *getSubtargetImpl() const override { return &Subtarget; }
50 const ARMTargetLowering *getTargetLowering() const override {
Renato Golin5e9d55e2013-01-29 23:31:38 +000051 // Implemented by derived classes
52 llvm_unreachable("getTargetLowering not implemented");
53 }
Craig Topper6bc27bf2014-03-10 02:09:33 +000054 const InstrItineraryData *getInstrItineraryData() const override {
Evan Chengbf407072010-09-10 01:29:16 +000055 return &InstrItins;
Evan Cheng4e712de2009-06-19 01:51:50 +000056 }
Anton Korobeynikov17d28de2008-08-17 13:55:10 +000057
Jim Grosbach9dbf3ee2013-01-07 21:24:35 +000058 /// \brief Register ARM analysis passes with a pass manager.
Craig Topper6bc27bf2014-03-10 02:09:33 +000059 void addAnalysisPasses(PassManagerBase &PM) override;
Chandler Carruth664e3542013-01-07 01:37:14 +000060
Chris Lattner12e97302006-09-04 04:14:57 +000061 // Pass Pipeline Configuration
Craig Topper6bc27bf2014-03-10 02:09:33 +000062 TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
Andrew Trickccb67362012-02-03 05:12:41 +000063
Craig Topper6bc27bf2014-03-10 02:09:33 +000064 bool addCodeEmitter(PassManagerBase &PM, JITCodeEmitter &MCE) override;
Rafael Espindolaffdc24b2006-05-14 22:18:28 +000065};
66
Anton Korobeynikov99152f32009-06-26 21:28:53 +000067/// ARMTargetMachine - ARM target machine.
68///
69class ARMTargetMachine : public ARMBaseTargetMachine {
David Blaikiea379b1812011-12-20 02:50:00 +000070 virtual void anchor();
Anton Korobeynikov99152f32009-06-26 21:28:53 +000071 ARMInstrInfo InstrInfo;
Micah Villmowcdfe20b2012-10-08 16:38:25 +000072 const DataLayout DL; // Calculates type size & alignment
Anton Korobeynikov99152f32009-06-26 21:28:53 +000073 ARMTargetLowering TLInfo;
Dan Gohmanbb919df2010-05-11 17:31:57 +000074 ARMSelectionDAGInfo TSInfo;
Anton Korobeynikov2f931282011-01-10 12:39:04 +000075 ARMFrameLowering FrameLowering;
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000076 public:
Evan Cheng2129f592011-07-19 06:37:02 +000077 ARMTargetMachine(const Target &T, StringRef TT,
Evan Chengefd9b422011-07-20 07:51:56 +000078 StringRef CPU, StringRef FS,
Nick Lewycky50f02cb2011-12-02 22:16:29 +000079 const TargetOptions &Options,
Evan Chengecb29082011-11-16 08:38:26 +000080 Reloc::Model RM, CodeModel::Model CM,
Christian Pirker2a111602014-03-28 14:35:30 +000081 CodeGenOpt::Level OL,
82 bool isLittle);
Anton Korobeynikov99152f32009-06-26 21:28:53 +000083
Craig Topper6bc27bf2014-03-10 02:09:33 +000084 const ARMRegisterInfo *getRegisterInfo() const override {
Anton Korobeynikov99152f32009-06-26 21:28:53 +000085 return &InstrInfo.getRegisterInfo();
86 }
87
Craig Topper6bc27bf2014-03-10 02:09:33 +000088 const ARMTargetLowering *getTargetLowering() const override {
Dan Gohman21cea8a2010-04-17 15:26:15 +000089 return &TLInfo;
Anton Korobeynikov99152f32009-06-26 21:28:53 +000090 }
91
Craig Topper6bc27bf2014-03-10 02:09:33 +000092 const ARMSelectionDAGInfo *getSelectionDAGInfo() const override {
Dan Gohmanbb919df2010-05-11 17:31:57 +000093 return &TSInfo;
94 }
Craig Topper6bc27bf2014-03-10 02:09:33 +000095 const ARMFrameLowering *getFrameLowering() const override {
Anton Korobeynikov2f931282011-01-10 12:39:04 +000096 return &FrameLowering;
97 }
Craig Topper6bc27bf2014-03-10 02:09:33 +000098 const ARMInstrInfo *getInstrInfo() const override { return &InstrInfo; }
99 const DataLayout *getDataLayout() const override { return &DL; }
Anton Korobeynikov99152f32009-06-26 21:28:53 +0000100};
101
Christian Pirkerdc9ff752014-04-01 15:19:30 +0000102/// ARMLETargetMachine - ARM little endian target machine.
Christian Pirker2a111602014-03-28 14:35:30 +0000103///
Christian Pirkerdc9ff752014-04-01 15:19:30 +0000104class ARMLETargetMachine : public ARMTargetMachine {
Christian Pirker2a111602014-03-28 14:35:30 +0000105 virtual void anchor();
106public:
Christian Pirkerdc9ff752014-04-01 15:19:30 +0000107 ARMLETargetMachine(const Target &T, StringRef TT,
Christian Pirker2a111602014-03-28 14:35:30 +0000108 StringRef CPU, StringRef FS, const TargetOptions &Options,
109 Reloc::Model RM, CodeModel::Model CM,
110 CodeGenOpt::Level OL);
111};
112
Christian Pirkerdc9ff752014-04-01 15:19:30 +0000113/// ARMBETargetMachine - ARM big endian target machine.
Christian Pirker2a111602014-03-28 14:35:30 +0000114///
Christian Pirkerdc9ff752014-04-01 15:19:30 +0000115class ARMBETargetMachine : public ARMTargetMachine {
Christian Pirker2a111602014-03-28 14:35:30 +0000116 virtual void anchor();
117public:
Christian Pirkerdc9ff752014-04-01 15:19:30 +0000118 ARMBETargetMachine(const Target &T, StringRef TT,
Christian Pirker2a111602014-03-28 14:35:30 +0000119 StringRef CPU, StringRef FS, const TargetOptions &Options,
120 Reloc::Model RM, CodeModel::Model CM,
121 CodeGenOpt::Level OL);
122};
123
Evan Cheng9f830142007-02-23 03:14:31 +0000124/// ThumbTargetMachine - Thumb target machine.
David Goodwinade05a32009-07-02 22:18:33 +0000125/// Due to the way architectures are handled, this represents both
126/// Thumb-1 and Thumb-2.
Evan Cheng9f830142007-02-23 03:14:31 +0000127///
Anton Korobeynikov99152f32009-06-26 21:28:53 +0000128class ThumbTargetMachine : public ARMBaseTargetMachine {
David Blaikiea379b1812011-12-20 02:50:00 +0000129 virtual void anchor();
Jeffrey Yasskin4822dfc2010-03-19 05:25:28 +0000130 // Either Thumb1InstrInfo or Thumb2InstrInfo.
131 OwningPtr<ARMBaseInstrInfo> InstrInfo;
Micah Villmowcdfe20b2012-10-08 16:38:25 +0000132 const DataLayout DL; // Calculates type size & alignment
Anton Korobeynikov99152f32009-06-26 21:28:53 +0000133 ARMTargetLowering TLInfo;
Dan Gohmanbb919df2010-05-11 17:31:57 +0000134 ARMSelectionDAGInfo TSInfo;
Anton Korobeynikov2f931282011-01-10 12:39:04 +0000135 // Either Thumb1FrameLowering or ARMFrameLowering.
136 OwningPtr<ARMFrameLowering> FrameLowering;
Evan Cheng9f830142007-02-23 03:14:31 +0000137public:
Evan Cheng2129f592011-07-19 06:37:02 +0000138 ThumbTargetMachine(const Target &T, StringRef TT,
Evan Chengefd9b422011-07-20 07:51:56 +0000139 StringRef CPU, StringRef FS,
Nick Lewycky50f02cb2011-12-02 22:16:29 +0000140 const TargetOptions &Options,
Evan Chengecb29082011-11-16 08:38:26 +0000141 Reloc::Model RM, CodeModel::Model CM,
Christian Pirker2a111602014-03-28 14:35:30 +0000142 CodeGenOpt::Level OL,
143 bool isLittle);
Evan Cheng9f830142007-02-23 03:14:31 +0000144
Jim Grosbach5bde1cb2009-10-25 19:14:48 +0000145 /// returns either Thumb1RegisterInfo or Thumb2RegisterInfo
Craig Topper6bc27bf2014-03-10 02:09:33 +0000146 const ARMBaseRegisterInfo *getRegisterInfo() const override {
David Goodwinade05a32009-07-02 22:18:33 +0000147 return &InstrInfo->getRegisterInfo();
Anton Korobeynikov99152f32009-06-26 21:28:53 +0000148 }
149
Craig Topper6bc27bf2014-03-10 02:09:33 +0000150 const ARMTargetLowering *getTargetLowering() const override {
Dan Gohman21cea8a2010-04-17 15:26:15 +0000151 return &TLInfo;
Anton Korobeynikov99152f32009-06-26 21:28:53 +0000152 }
153
Craig Topper6bc27bf2014-03-10 02:09:33 +0000154 const ARMSelectionDAGInfo *getSelectionDAGInfo() const override {
Dan Gohmanbb919df2010-05-11 17:31:57 +0000155 return &TSInfo;
156 }
157
David Goodwinade05a32009-07-02 22:18:33 +0000158 /// returns either Thumb1InstrInfo or Thumb2InstrInfo
Craig Topper6bc27bf2014-03-10 02:09:33 +0000159 const ARMBaseInstrInfo *getInstrInfo() const override {
Jeffrey Yasskin4822dfc2010-03-19 05:25:28 +0000160 return InstrInfo.get();
161 }
Anton Korobeynikov2f931282011-01-10 12:39:04 +0000162 /// returns either Thumb1FrameLowering or ARMFrameLowering
Craig Topper6bc27bf2014-03-10 02:09:33 +0000163 const ARMFrameLowering *getFrameLowering() const override {
Anton Korobeynikov2f931282011-01-10 12:39:04 +0000164 return FrameLowering.get();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000165 }
Craig Topper6bc27bf2014-03-10 02:09:33 +0000166 const DataLayout *getDataLayout() const override { return &DL; }
Evan Cheng9f830142007-02-23 03:14:31 +0000167};
168
Christian Pirkerdc9ff752014-04-01 15:19:30 +0000169/// ThumbLETargetMachine - Thumb little endian target machine.
Christian Pirker2a111602014-03-28 14:35:30 +0000170///
Christian Pirkerdc9ff752014-04-01 15:19:30 +0000171class ThumbLETargetMachine : public ThumbTargetMachine {
Christian Pirker2a111602014-03-28 14:35:30 +0000172 virtual void anchor();
173public:
Christian Pirkerdc9ff752014-04-01 15:19:30 +0000174 ThumbLETargetMachine(const Target &T, StringRef TT,
Christian Pirker2a111602014-03-28 14:35:30 +0000175 StringRef CPU, StringRef FS, const TargetOptions &Options,
176 Reloc::Model RM, CodeModel::Model CM,
177 CodeGenOpt::Level OL);
178};
179
Christian Pirkerdc9ff752014-04-01 15:19:30 +0000180/// ThumbBETargetMachine - Thumb big endian target machine.
Christian Pirker2a111602014-03-28 14:35:30 +0000181///
Christian Pirkerdc9ff752014-04-01 15:19:30 +0000182class ThumbBETargetMachine : public ThumbTargetMachine {
Christian Pirker2a111602014-03-28 14:35:30 +0000183 virtual void anchor();
184public:
Jim Grosbachbb1af942014-04-03 23:43:22 +0000185 ThumbBETargetMachine(const Target &T, StringRef TT, StringRef CPU,
186 StringRef FS, const TargetOptions &Options,
Christian Pirker2a111602014-03-28 14:35:30 +0000187 Reloc::Model RM, CodeModel::Model CM,
188 CodeGenOpt::Level OL);
189};
190
Rafael Espindolaffdc24b2006-05-14 22:18:28 +0000191} // end namespace llvm
192
193#endif