blob: 8ad1f3dc2c340982232c5d945f41d35a07a712fc [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
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000014#ifndef LLVM_LIB_TARGET_ARM_ARMTARGETMACHINE_H
15#define LLVM_LIB_TARGET_ARM_ARMTARGETMACHINE_H
Rafael Espindolaffdc24b2006-05-14 22:18:28 +000016
Chandler Carruth802d7552012-12-04 07:12:27 +000017#include "ARMInstrInfo.h"
Chandler Carruth802d7552012-12-04 07:12:27 +000018#include "ARMSubtarget.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000019#include "llvm/IR/DataLayout.h"
Chandler Carruth802d7552012-12-04 07:12:27 +000020#include "llvm/Target/TargetMachine.h"
Rafael Espindolaffdc24b2006-05-14 22:18:28 +000021
22namespace llvm {
23
Anton Korobeynikov99152f32009-06-26 21:28:53 +000024class ARMBaseTargetMachine : public LLVMTargetMachine {
Eric Christopher661f2d12014-12-18 02:20:58 +000025public:
26 enum ARMABI {
27 ARM_ABI_UNKNOWN,
28 ARM_ABI_APCS,
Tim Northovere0ccdc62015-10-28 22:46:43 +000029 ARM_ABI_AAPCS, // ARM EABI
30 ARM_ABI_AAPCS16
Eric Christopher661f2d12014-12-18 02:20:58 +000031 } TargetABI;
32
Anton Korobeynikov99152f32009-06-26 21:28:53 +000033protected:
Aditya Nandakumara2719322014-11-13 09:26:31 +000034 std::unique_ptr<TargetLoweringObjectFile> TLOF;
Evan Cheng4e712de2009-06-19 01:51:50 +000035 ARMSubtarget Subtarget;
Eric Christopher3faf2f12014-10-06 06:45:36 +000036 bool isLittle;
37 mutable StringMap<std::unique_ptr<ARMSubtarget>> SubtargetMap;
38
Rafael Espindolaffdc24b2006-05-14 22:18:28 +000039public:
Daniel Sanders3e5de882015-06-11 19:41:26 +000040 ARMBaseTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
41 StringRef FS, const TargetOptions &Options,
Evan Chengecb29082011-11-16 08:38:26 +000042 Reloc::Model RM, CodeModel::Model CM,
Daniel Sanders3e5de882015-06-11 19:41:26 +000043 CodeGenOpt::Level OL, bool isLittle);
Reid Kleckner357600e2014-11-20 23:37:18 +000044 ~ARMBaseTargetMachine() override;
Rafael Espindolaffdc24b2006-05-14 22:18:28 +000045
Eric Christopher4d0f35a2015-03-21 04:22:23 +000046 const ARMSubtarget *getSubtargetImpl() const { return &Subtarget; }
Eric Christopher3faf2f12014-10-06 06:45:36 +000047 const ARMSubtarget *getSubtargetImpl(const Function &F) const override;
Eric Christophera49d68e2015-02-17 20:02:32 +000048 bool isLittleEndian() const { return isLittle; }
Eric Christopher3d19f132014-06-18 22:48:09 +000049
Chandler Carruth8b04c0d2015-02-01 13:20:00 +000050 /// \brief Get the TargetIRAnalysis for this target.
51 TargetIRAnalysis getTargetIRAnalysis() override;
Chandler Carruth664e3542013-01-07 01:37:14 +000052
Chris Lattner12e97302006-09-04 04:14:57 +000053 // Pass Pipeline Configuration
Craig Topper6bc27bf2014-03-10 02:09:33 +000054 TargetPassConfig *createPassConfig(PassManagerBase &PM) override;
Aditya Nandakumara2719322014-11-13 09:26:31 +000055
56 TargetLoweringObjectFile *getObjFileLowering() const override {
57 return TLOF.get();
58 }
Rafael Espindolaffdc24b2006-05-14 22:18:28 +000059};
60
Anton Korobeynikov99152f32009-06-26 21:28:53 +000061/// ARMTargetMachine - ARM target machine.
62///
63class ARMTargetMachine : public ARMBaseTargetMachine {
David Blaikiea379b1812011-12-20 02:50:00 +000064 virtual void anchor();
Anton Korobeynikovf7183ed2010-11-15 00:06:54 +000065 public:
Daniel Sanders3e5de882015-06-11 19:41:26 +000066 ARMTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
67 StringRef FS, const TargetOptions &Options, Reloc::Model RM,
Eric Christopher80b24ef2014-06-26 19:30:02 +000068 CodeModel::Model CM, CodeGenOpt::Level OL, bool isLittle);
Anton Korobeynikov99152f32009-06-26 21:28:53 +000069};
70
Christian Pirkerdc9ff752014-04-01 15:19:30 +000071/// ARMLETargetMachine - ARM little endian target machine.
Christian Pirker2a111602014-03-28 14:35:30 +000072///
Christian Pirkerdc9ff752014-04-01 15:19:30 +000073class ARMLETargetMachine : public ARMTargetMachine {
Craig Topper9d74a5a2014-04-29 07:58:41 +000074 void anchor() override;
Christian Pirker2a111602014-03-28 14:35:30 +000075public:
Daniel Sanders3e5de882015-06-11 19:41:26 +000076 ARMLETargetMachine(const Target &T, const Triple &TT, StringRef CPU,
77 StringRef FS, const TargetOptions &Options,
Christian Pirker2a111602014-03-28 14:35:30 +000078 Reloc::Model RM, CodeModel::Model CM,
79 CodeGenOpt::Level OL);
80};
81
Christian Pirkerdc9ff752014-04-01 15:19:30 +000082/// ARMBETargetMachine - ARM big endian target machine.
Christian Pirker2a111602014-03-28 14:35:30 +000083///
Christian Pirkerdc9ff752014-04-01 15:19:30 +000084class ARMBETargetMachine : public ARMTargetMachine {
Craig Topper9d74a5a2014-04-29 07:58:41 +000085 void anchor() override;
Christian Pirker2a111602014-03-28 14:35:30 +000086public:
Daniel Sanders3e5de882015-06-11 19:41:26 +000087 ARMBETargetMachine(const Target &T, const Triple &TT, StringRef CPU,
88 StringRef FS, const TargetOptions &Options,
89 Reloc::Model RM, CodeModel::Model CM,
90 CodeGenOpt::Level OL);
Christian Pirker2a111602014-03-28 14:35:30 +000091};
92
Evan Cheng9f830142007-02-23 03:14:31 +000093/// ThumbTargetMachine - Thumb target machine.
David Goodwinade05a32009-07-02 22:18:33 +000094/// Due to the way architectures are handled, this represents both
95/// Thumb-1 and Thumb-2.
Evan Cheng9f830142007-02-23 03:14:31 +000096///
Anton Korobeynikov99152f32009-06-26 21:28:53 +000097class ThumbTargetMachine : public ARMBaseTargetMachine {
David Blaikiea379b1812011-12-20 02:50:00 +000098 virtual void anchor();
Evan Cheng9f830142007-02-23 03:14:31 +000099public:
Daniel Sanders3e5de882015-06-11 19:41:26 +0000100 ThumbTargetMachine(const Target &T, const Triple &TT, StringRef CPU,
101 StringRef FS, const TargetOptions &Options,
102 Reloc::Model RM, CodeModel::Model CM, CodeGenOpt::Level OL,
103 bool isLittle);
Evan Cheng9f830142007-02-23 03:14:31 +0000104};
105
Christian Pirkerdc9ff752014-04-01 15:19:30 +0000106/// ThumbLETargetMachine - Thumb little endian target machine.
Christian Pirker2a111602014-03-28 14:35:30 +0000107///
Christian Pirkerdc9ff752014-04-01 15:19:30 +0000108class ThumbLETargetMachine : public ThumbTargetMachine {
Craig Topper9d74a5a2014-04-29 07:58:41 +0000109 void anchor() override;
Christian Pirker2a111602014-03-28 14:35:30 +0000110public:
Daniel Sanders3e5de882015-06-11 19:41:26 +0000111 ThumbLETargetMachine(const Target &T, const Triple &TT, StringRef CPU,
Eric Christopher80b24ef2014-06-26 19:30:02 +0000112 StringRef FS, const TargetOptions &Options,
113 Reloc::Model RM, CodeModel::Model CM,
114 CodeGenOpt::Level OL);
Christian Pirker2a111602014-03-28 14:35:30 +0000115};
116
Christian Pirkerdc9ff752014-04-01 15:19:30 +0000117/// ThumbBETargetMachine - Thumb big endian target machine.
Christian Pirker2a111602014-03-28 14:35:30 +0000118///
Christian Pirkerdc9ff752014-04-01 15:19:30 +0000119class ThumbBETargetMachine : public ThumbTargetMachine {
Craig Topper9d74a5a2014-04-29 07:58:41 +0000120 void anchor() override;
Christian Pirker2a111602014-03-28 14:35:30 +0000121public:
Daniel Sanders3e5de882015-06-11 19:41:26 +0000122 ThumbBETargetMachine(const Target &T, const Triple &TT, StringRef CPU,
Jim Grosbachbb1af942014-04-03 23:43:22 +0000123 StringRef FS, const TargetOptions &Options,
Christian Pirker2a111602014-03-28 14:35:30 +0000124 Reloc::Model RM, CodeModel::Model CM,
125 CodeGenOpt::Level OL);
126};
127
Rafael Espindolaffdc24b2006-05-14 22:18:28 +0000128} // end namespace llvm
129
130#endif