blob: 4e8e514d4188356921e4b5d981600e0a802ea1f0 [file] [log] [blame]
Erich Keaneebba5922017-07-21 22:37:03 +00001//===--- ARM.h - Declare ARM target feature support -------------*- 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 ARM TargetInfo objects.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CLANG_LIB_BASIC_TARGETS_ARM_H
15#define LLVM_CLANG_LIB_BASIC_TARGETS_ARM_H
16
17#include "OSTargets.h"
18#include "clang/Basic/TargetInfo.h"
19#include "clang/Basic/TargetOptions.h"
20#include "llvm/ADT/Triple.h"
21#include "llvm/Support/Compiler.h"
22#include "llvm/Support/TargetParser.h"
23
24namespace clang {
25namespace targets {
26
27class LLVM_LIBRARY_VISIBILITY ARMTargetInfo : public TargetInfo {
28 // Possible FPU choices.
29 enum FPUMode {
30 VFP2FPU = (1 << 0),
31 VFP3FPU = (1 << 1),
32 VFP4FPU = (1 << 2),
33 NeonFPU = (1 << 3),
34 FPARMV8 = (1 << 4)
35 };
36
37 // Possible HWDiv features.
38 enum HWDivMode { HWDivThumb = (1 << 0), HWDivARM = (1 << 1) };
39
40 static bool FPUModeIsVFP(FPUMode Mode) {
41 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
42 }
43
44 static const TargetInfo::GCCRegAlias GCCRegAliases[];
45 static const char *const GCCRegNames[];
46
47 std::string ABI, CPU;
48
49 StringRef CPUProfile;
50 StringRef CPUAttr;
51
52 enum { FP_Default, FP_VFP, FP_Neon } FPMath;
53
Florian Hahnef5bbd62017-07-27 16:28:39 +000054 llvm::ARM::ISAKind ArchISA;
55 llvm::ARM::ArchKind ArchKind = llvm::ARM::ArchKind::ARMV4T;
56 llvm::ARM::ProfileKind ArchProfile;
Erich Keaneebba5922017-07-21 22:37:03 +000057 unsigned ArchVersion;
58
59 unsigned FPU : 5;
60
61 unsigned IsAAPCS : 1;
62 unsigned HWDiv : 2;
63
64 // Initialized via features.
65 unsigned SoftFloat : 1;
66 unsigned SoftFloatABI : 1;
67
68 unsigned CRC : 1;
69 unsigned Crypto : 1;
70 unsigned DSP : 1;
71 unsigned Unaligned : 1;
Oliver Stannard39ee9de2018-04-27 13:56:02 +000072 unsigned DotProd : 1;
Erich Keaneebba5922017-07-21 22:37:03 +000073
74 enum {
75 LDREX_B = (1 << 0), /// byte (8-bit)
76 LDREX_H = (1 << 1), /// half (16-bit)
77 LDREX_W = (1 << 2), /// word (32-bit)
78 LDREX_D = (1 << 3), /// double (64-bit)
79 };
80
81 uint32_t LDREX;
82
83 // ACLE 6.5.1 Hardware floating point
84 enum {
85 HW_FP_HP = (1 << 1), /// half (16-bit)
86 HW_FP_SP = (1 << 2), /// single (32-bit)
87 HW_FP_DP = (1 << 3), /// double (64-bit)
88 };
89 uint32_t HW_FP;
90
91 static const Builtin::Info BuiltinInfo[];
92
Tim Northoverad4c5db2017-07-24 17:06:23 +000093 void setABIAAPCS();
94 void setABIAPCS(bool IsAAPCS16);
Erich Keaneebba5922017-07-21 22:37:03 +000095
Tim Northoverad4c5db2017-07-24 17:06:23 +000096 void setArchInfo();
Florian Hahnef5bbd62017-07-27 16:28:39 +000097 void setArchInfo(llvm::ARM::ArchKind Kind);
Erich Keaneebba5922017-07-21 22:37:03 +000098
Tim Northoverad4c5db2017-07-24 17:06:23 +000099 void setAtomic();
Erich Keaneebba5922017-07-21 22:37:03 +0000100
Tim Northoverad4c5db2017-07-24 17:06:23 +0000101 bool isThumb() const;
102 bool supportsThumb() const;
103 bool supportsThumb2() const;
Erich Keaneebba5922017-07-21 22:37:03 +0000104
Tim Northoverad4c5db2017-07-24 17:06:23 +0000105 StringRef getCPUAttr() const;
106 StringRef getCPUProfile() const;
Erich Keaneebba5922017-07-21 22:37:03 +0000107
108public:
Tim Northoverad4c5db2017-07-24 17:06:23 +0000109 ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
Erich Keaneebba5922017-07-21 22:37:03 +0000110
Tim Northoverad4c5db2017-07-24 17:06:23 +0000111 StringRef getABI() const override;
112 bool setABI(const std::string &Name) override;
Erich Keaneebba5922017-07-21 22:37:03 +0000113
114 // FIXME: This should be based on Arch attributes, not CPU names.
115 bool
116 initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags,
117 StringRef CPU,
Tim Northoverad4c5db2017-07-24 17:06:23 +0000118 const std::vector<std::string> &FeaturesVec) const override;
Erich Keaneebba5922017-07-21 22:37:03 +0000119
120 bool handleTargetFeatures(std::vector<std::string> &Features,
121 DiagnosticsEngine &Diags) override;
122
123 bool hasFeature(StringRef Feature) const override;
Erich Keaneebba5922017-07-21 22:37:03 +0000124
Tim Northoverad4c5db2017-07-24 17:06:23 +0000125 bool isValidCPUName(StringRef Name) const override;
Erich Keane3ec17432018-02-08 23:14:15 +0000126 void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override;
127
Tim Northoverad4c5db2017-07-24 17:06:23 +0000128 bool setCPU(const std::string &Name) override;
Erich Keaneebba5922017-07-21 22:37:03 +0000129
130 bool setFPMath(StringRef Name) override;
131
Akira Hatanaka502775a2017-12-09 00:02:37 +0000132 bool useFP16ConversionIntrinsics() const override {
133 return false;
134 }
135
Erich Keaneebba5922017-07-21 22:37:03 +0000136 void getTargetDefinesARMV81A(const LangOptions &Opts,
137 MacroBuilder &Builder) const;
138
139 void getTargetDefinesARMV82A(const LangOptions &Opts,
Tim Northoverad4c5db2017-07-24 17:06:23 +0000140 MacroBuilder &Builder) const;
Erich Keaneebba5922017-07-21 22:37:03 +0000141 void getTargetDefines(const LangOptions &Opts,
142 MacroBuilder &Builder) const override;
Tim Northoverad4c5db2017-07-24 17:06:23 +0000143
Erich Keaneebba5922017-07-21 22:37:03 +0000144 ArrayRef<Builtin::Info> getTargetBuiltins() const override;
Tim Northoverad4c5db2017-07-24 17:06:23 +0000145
146 bool isCLZForZeroUndef() const override;
147 BuiltinVaListKind getBuiltinVaListKind() const override;
148
Erich Keaneebba5922017-07-21 22:37:03 +0000149 ArrayRef<const char *> getGCCRegNames() const override;
150 ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override;
151 bool validateAsmConstraint(const char *&Name,
Tim Northoverad4c5db2017-07-24 17:06:23 +0000152 TargetInfo::ConstraintInfo &Info) const override;
153 std::string convertConstraint(const char *&Constraint) const override;
Erich Keaneebba5922017-07-21 22:37:03 +0000154 bool
155 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
Tim Northoverad4c5db2017-07-24 17:06:23 +0000156 std::string &SuggestedModifier) const override;
157 const char *getClobbers() const override;
Erich Keaneebba5922017-07-21 22:37:03 +0000158
Tim Northoverad4c5db2017-07-24 17:06:23 +0000159 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override;
Erich Keaneebba5922017-07-21 22:37:03 +0000160
Tim Northoverad4c5db2017-07-24 17:06:23 +0000161 int getEHDataRegisterNumber(unsigned RegNo) const override;
Erich Keaneebba5922017-07-21 22:37:03 +0000162
Tim Northoverad4c5db2017-07-24 17:06:23 +0000163 bool hasSjLjLowering() const override;
Erich Keaneebba5922017-07-21 22:37:03 +0000164};
165
166class LLVM_LIBRARY_VISIBILITY ARMleTargetInfo : public ARMTargetInfo {
167public:
Tim Northoverad4c5db2017-07-24 17:06:23 +0000168 ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
Erich Keaneebba5922017-07-21 22:37:03 +0000169 void getTargetDefines(const LangOptions &Opts,
170 MacroBuilder &Builder) const override;
171};
172
173class LLVM_LIBRARY_VISIBILITY ARMbeTargetInfo : public ARMTargetInfo {
174public:
Tim Northoverad4c5db2017-07-24 17:06:23 +0000175 ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
Erich Keaneebba5922017-07-21 22:37:03 +0000176 void getTargetDefines(const LangOptions &Opts,
177 MacroBuilder &Builder) const override;
178};
179
180class LLVM_LIBRARY_VISIBILITY WindowsARMTargetInfo
181 : public WindowsTargetInfo<ARMleTargetInfo> {
182 const llvm::Triple Triple;
183
184public:
Tim Northoverad4c5db2017-07-24 17:06:23 +0000185 WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
186
Erich Keaneebba5922017-07-21 22:37:03 +0000187 void getVisualStudioDefines(const LangOptions &Opts,
188 MacroBuilder &Builder) const;
Tim Northoverad4c5db2017-07-24 17:06:23 +0000189
190 BuiltinVaListKind getBuiltinVaListKind() const override;
191
192 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override;
Erich Keaneebba5922017-07-21 22:37:03 +0000193};
194
195// Windows ARM + Itanium C++ ABI Target
196class LLVM_LIBRARY_VISIBILITY ItaniumWindowsARMleTargetInfo
197 : public WindowsARMTargetInfo {
198public:
199 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple,
Tim Northoverad4c5db2017-07-24 17:06:23 +0000200 const TargetOptions &Opts);
Erich Keaneebba5922017-07-21 22:37:03 +0000201
202 void getTargetDefines(const LangOptions &Opts,
Tim Northoverad4c5db2017-07-24 17:06:23 +0000203 MacroBuilder &Builder) const override;
Erich Keaneebba5922017-07-21 22:37:03 +0000204};
205
206// Windows ARM, MS (C++) ABI
207class LLVM_LIBRARY_VISIBILITY MicrosoftARMleTargetInfo
208 : public WindowsARMTargetInfo {
209public:
210 MicrosoftARMleTargetInfo(const llvm::Triple &Triple,
Tim Northoverad4c5db2017-07-24 17:06:23 +0000211 const TargetOptions &Opts);
Erich Keaneebba5922017-07-21 22:37:03 +0000212
213 void getTargetDefines(const LangOptions &Opts,
Tim Northoverad4c5db2017-07-24 17:06:23 +0000214 MacroBuilder &Builder) const override;
Erich Keaneebba5922017-07-21 22:37:03 +0000215};
216
217// ARM MinGW target
218class LLVM_LIBRARY_VISIBILITY MinGWARMTargetInfo : public WindowsARMTargetInfo {
219public:
Tim Northoverad4c5db2017-07-24 17:06:23 +0000220 MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
Erich Keaneebba5922017-07-21 22:37:03 +0000221
222 void getTargetDefines(const LangOptions &Opts,
223 MacroBuilder &Builder) const override;
224};
225
226// ARM Cygwin target
227class LLVM_LIBRARY_VISIBILITY CygwinARMTargetInfo : public ARMleTargetInfo {
228public:
Tim Northoverad4c5db2017-07-24 17:06:23 +0000229 CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
230
Erich Keaneebba5922017-07-21 22:37:03 +0000231 void getTargetDefines(const LangOptions &Opts,
232 MacroBuilder &Builder) const override;
233};
234
235class LLVM_LIBRARY_VISIBILITY DarwinARMTargetInfo
236 : public DarwinTargetInfo<ARMleTargetInfo> {
237protected:
238 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
Tim Northoverad4c5db2017-07-24 17:06:23 +0000239 MacroBuilder &Builder) const override;
Erich Keaneebba5922017-07-21 22:37:03 +0000240
241public:
Tim Northoverad4c5db2017-07-24 17:06:23 +0000242 DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts);
Erich Keaneebba5922017-07-21 22:37:03 +0000243};
Tim Northoverad4c5db2017-07-24 17:06:23 +0000244
Erich Keaneebba5922017-07-21 22:37:03 +0000245// 32-bit RenderScript is armv7 with width and align of 'long' set to 8-bytes
246class LLVM_LIBRARY_VISIBILITY RenderScript32TargetInfo
247 : public ARMleTargetInfo {
248public:
249 RenderScript32TargetInfo(const llvm::Triple &Triple,
Tim Northoverad4c5db2017-07-24 17:06:23 +0000250 const TargetOptions &Opts);
251
Erich Keaneebba5922017-07-21 22:37:03 +0000252 void getTargetDefines(const LangOptions &Opts,
253 MacroBuilder &Builder) const override;
254};
255
256} // namespace targets
257} // namespace clang
258
259#endif // LLVM_CLANG_LIB_BASIC_TARGETS_ARM_H