blob: d4caf5ca6e1980a4d99ebfb749907e18318e886e [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,
45 CodeGenOpt::Level OL);
Rafael Espindolaffdc24b2006-05-14 22:18:28 +000046
Dan Gohmaneabd6472008-05-14 01:58:56 +000047 virtual ARMJITInfo *getJITInfo() { return &JITInfo; }
Evan Cheng10043e22007-01-19 07:51:42 +000048 virtual const ARMSubtarget *getSubtargetImpl() const { return &Subtarget; }
Renato Golin5e9d55e2013-01-29 23:31:38 +000049 virtual const ARMTargetLowering *getTargetLowering() const {
50 // Implemented by derived classes
51 llvm_unreachable("getTargetLowering not implemented");
52 }
Evan Chengbf407072010-09-10 01:29:16 +000053 virtual const InstrItineraryData *getInstrItineraryData() const {
54 return &InstrItins;
Evan Cheng4e712de2009-06-19 01:51:50 +000055 }
Anton Korobeynikov17d28de2008-08-17 13:55:10 +000056
Jim Grosbach9dbf3ee2013-01-07 21:24:35 +000057 /// \brief Register ARM analysis passes with a pass manager.
Chandler Carruth664e3542013-01-07 01:37:14 +000058 virtual void addAnalysisPasses(PassManagerBase &PM);
59
Chris Lattner12e97302006-09-04 04:14:57 +000060 // Pass Pipeline Configuration
Andrew Trickf8ea1082012-02-04 02:56:59 +000061 virtual TargetPassConfig *createPassConfig(PassManagerBase &PM);
Andrew Trickccb67362012-02-03 05:12:41 +000062
Evan Chengecb29082011-11-16 08:38:26 +000063 virtual bool addCodeEmitter(PassManagerBase &PM, JITCodeEmitter &MCE);
Rafael Espindolaffdc24b2006-05-14 22:18:28 +000064};
65
Anton Korobeynikov99152f32009-06-26 21:28:53 +000066/// ARMTargetMachine - ARM target machine.
67///
68class ARMTargetMachine : public ARMBaseTargetMachine {
David Blaikiea379b1812011-12-20 02:50:00 +000069 virtual void anchor();
Anton Korobeynikov99152f32009-06-26 21:28:53 +000070 ARMInstrInfo InstrInfo;
Micah Villmowcdfe20b2012-10-08 16:38:25 +000071 const DataLayout DL; // Calculates type size & alignment
Anton Korobeynikov99152f32009-06-26 21:28:53 +000072 ARMTargetLowering TLInfo;
Dan Gohmanbb919df2010-05-11 17:31:57 +000073 ARMSelectionDAGInfo TSInfo;
Anton Korobeynikov2f931282011-01-10 12:39:04 +000074 ARMFrameLowering FrameLowering;
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000075 public:
Evan Cheng2129f592011-07-19 06:37:02 +000076 ARMTargetMachine(const Target &T, StringRef TT,
Evan Chengefd9b422011-07-20 07:51:56 +000077 StringRef CPU, StringRef FS,
Nick Lewycky50f02cb2011-12-02 22:16:29 +000078 const TargetOptions &Options,
Evan Chengecb29082011-11-16 08:38:26 +000079 Reloc::Model RM, CodeModel::Model CM,
80 CodeGenOpt::Level OL);
Anton Korobeynikov99152f32009-06-26 21:28:53 +000081
82 virtual const ARMRegisterInfo *getRegisterInfo() const {
83 return &InstrInfo.getRegisterInfo();
84 }
85
Dan Gohman21cea8a2010-04-17 15:26:15 +000086 virtual const ARMTargetLowering *getTargetLowering() const {
87 return &TLInfo;
Anton Korobeynikov99152f32009-06-26 21:28:53 +000088 }
89
Dan Gohmanbb919df2010-05-11 17:31:57 +000090 virtual const ARMSelectionDAGInfo* getSelectionDAGInfo() const {
91 return &TSInfo;
92 }
Anton Korobeynikov2f931282011-01-10 12:39:04 +000093 virtual const ARMFrameLowering *getFrameLowering() const {
94 return &FrameLowering;
95 }
Anton Korobeynikov99152f32009-06-26 21:28:53 +000096 virtual const ARMInstrInfo *getInstrInfo() const { return &InstrInfo; }
Micah Villmowcdfe20b2012-10-08 16:38:25 +000097 virtual const DataLayout *getDataLayout() const { return &DL; }
Anton Korobeynikov99152f32009-06-26 21:28:53 +000098};
99
Evan Cheng9f830142007-02-23 03:14:31 +0000100/// ThumbTargetMachine - Thumb target machine.
David Goodwinade05a32009-07-02 22:18:33 +0000101/// Due to the way architectures are handled, this represents both
102/// Thumb-1 and Thumb-2.
Evan Cheng9f830142007-02-23 03:14:31 +0000103///
Anton Korobeynikov99152f32009-06-26 21:28:53 +0000104class ThumbTargetMachine : public ARMBaseTargetMachine {
David Blaikiea379b1812011-12-20 02:50:00 +0000105 virtual void anchor();
Jeffrey Yasskin4822dfc2010-03-19 05:25:28 +0000106 // Either Thumb1InstrInfo or Thumb2InstrInfo.
107 OwningPtr<ARMBaseInstrInfo> InstrInfo;
Micah Villmowcdfe20b2012-10-08 16:38:25 +0000108 const DataLayout DL; // Calculates type size & alignment
Anton Korobeynikov99152f32009-06-26 21:28:53 +0000109 ARMTargetLowering TLInfo;
Dan Gohmanbb919df2010-05-11 17:31:57 +0000110 ARMSelectionDAGInfo TSInfo;
Anton Korobeynikov2f931282011-01-10 12:39:04 +0000111 // Either Thumb1FrameLowering or ARMFrameLowering.
112 OwningPtr<ARMFrameLowering> FrameLowering;
Evan Cheng9f830142007-02-23 03:14:31 +0000113public:
Evan Cheng2129f592011-07-19 06:37:02 +0000114 ThumbTargetMachine(const Target &T, StringRef TT,
Evan Chengefd9b422011-07-20 07:51:56 +0000115 StringRef CPU, StringRef FS,
Nick Lewycky50f02cb2011-12-02 22:16:29 +0000116 const TargetOptions &Options,
Evan Chengecb29082011-11-16 08:38:26 +0000117 Reloc::Model RM, CodeModel::Model CM,
118 CodeGenOpt::Level OL);
Evan Cheng9f830142007-02-23 03:14:31 +0000119
Jim Grosbach5bde1cb2009-10-25 19:14:48 +0000120 /// returns either Thumb1RegisterInfo or Thumb2RegisterInfo
David Goodwinade05a32009-07-02 22:18:33 +0000121 virtual const ARMBaseRegisterInfo *getRegisterInfo() const {
122 return &InstrInfo->getRegisterInfo();
Anton Korobeynikov99152f32009-06-26 21:28:53 +0000123 }
124
Dan Gohman21cea8a2010-04-17 15:26:15 +0000125 virtual const ARMTargetLowering *getTargetLowering() const {
126 return &TLInfo;
Anton Korobeynikov99152f32009-06-26 21:28:53 +0000127 }
128
Dan Gohmanbb919df2010-05-11 17:31:57 +0000129 virtual const ARMSelectionDAGInfo *getSelectionDAGInfo() const {
130 return &TSInfo;
131 }
132
David Goodwinade05a32009-07-02 22:18:33 +0000133 /// returns either Thumb1InstrInfo or Thumb2InstrInfo
Jeffrey Yasskin4822dfc2010-03-19 05:25:28 +0000134 virtual const ARMBaseInstrInfo *getInstrInfo() const {
135 return InstrInfo.get();
136 }
Anton Korobeynikov2f931282011-01-10 12:39:04 +0000137 /// returns either Thumb1FrameLowering or ARMFrameLowering
138 virtual const ARMFrameLowering *getFrameLowering() const {
139 return FrameLowering.get();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +0000140 }
Micah Villmowcdfe20b2012-10-08 16:38:25 +0000141 virtual const DataLayout *getDataLayout() const { return &DL; }
Evan Cheng9f830142007-02-23 03:14:31 +0000142};
143
Rafael Espindolaffdc24b2006-05-14 22:18:28 +0000144} // end namespace llvm
145
146#endif