1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | #ifndef LLVM_CLANG_LIB_BASIC_TARGETS_ARM_H |
14 | #define LLVM_CLANG_LIB_BASIC_TARGETS_ARM_H |
15 | |
16 | #include "OSTargets.h" |
17 | #include "clang/Basic/TargetInfo.h" |
18 | #include "clang/Basic/TargetOptions.h" |
19 | #include "llvm/ADT/Triple.h" |
20 | #include "llvm/Support/Compiler.h" |
21 | #include "llvm/Support/TargetParser.h" |
22 | |
23 | namespace clang { |
24 | namespace targets { |
25 | |
26 | class LLVM_LIBRARY_VISIBILITY ARMTargetInfo : public TargetInfo { |
27 | |
28 | enum FPUMode { |
29 | VFP2FPU = (1 << 0), |
30 | VFP3FPU = (1 << 1), |
31 | VFP4FPU = (1 << 2), |
32 | NeonFPU = (1 << 3), |
33 | FPARMV8 = (1 << 4) |
34 | }; |
35 | |
36 | |
37 | enum HWDivMode { HWDivThumb = (1 << 0), HWDivARM = (1 << 1) }; |
38 | |
39 | static bool FPUModeIsVFP(FPUMode Mode) { |
40 | return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8); |
41 | } |
42 | |
43 | static const TargetInfo::GCCRegAlias GCCRegAliases[]; |
44 | static const char *const GCCRegNames[]; |
45 | |
46 | std::string ABI, CPU; |
47 | |
48 | StringRef CPUProfile; |
49 | StringRef CPUAttr; |
50 | |
51 | enum { FP_Default, FP_VFP, FP_Neon } FPMath; |
52 | |
53 | llvm::ARM::ISAKind ArchISA; |
54 | llvm::ARM::ArchKind ArchKind = llvm::ARM::ArchKind::ARMV4T; |
55 | llvm::ARM::ProfileKind ArchProfile; |
56 | unsigned ArchVersion; |
57 | |
58 | unsigned FPU : 5; |
59 | |
60 | unsigned IsAAPCS : 1; |
61 | unsigned HWDiv : 2; |
62 | |
63 | |
64 | unsigned SoftFloat : 1; |
65 | unsigned SoftFloatABI : 1; |
66 | |
67 | unsigned CRC : 1; |
68 | unsigned Crypto : 1; |
69 | unsigned DSP : 1; |
70 | unsigned Unaligned : 1; |
71 | unsigned DotProd : 1; |
72 | |
73 | enum { |
74 | LDREX_B = (1 << 0), |
75 | LDREX_H = (1 << 1), |
76 | LDREX_W = (1 << 2), |
77 | LDREX_D = (1 << 3), |
78 | }; |
79 | |
80 | uint32_t LDREX; |
81 | |
82 | |
83 | enum { |
84 | HW_FP_HP = (1 << 1), |
85 | HW_FP_SP = (1 << 2), |
86 | HW_FP_DP = (1 << 3), |
87 | }; |
88 | uint32_t HW_FP; |
89 | |
90 | static const Builtin::Info BuiltinInfo[]; |
91 | |
92 | void setABIAAPCS(); |
93 | void setABIAPCS(bool IsAAPCS16); |
94 | |
95 | void setArchInfo(); |
96 | void setArchInfo(llvm::ARM::ArchKind Kind); |
97 | |
98 | void setAtomic(); |
99 | |
100 | bool isThumb() const; |
101 | bool supportsThumb() const; |
102 | bool supportsThumb2() const; |
103 | |
104 | StringRef getCPUAttr() const; |
105 | StringRef getCPUProfile() const; |
106 | |
107 | public: |
108 | ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); |
109 | |
110 | StringRef getABI() const override; |
111 | bool setABI(const std::string &Name) override; |
112 | |
113 | |
114 | bool |
115 | initFeatureMap(llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, |
116 | StringRef CPU, |
117 | const std::vector<std::string> &FeaturesVec) const override; |
118 | |
119 | bool handleTargetFeatures(std::vector<std::string> &Features, |
120 | DiagnosticsEngine &Diags) override; |
121 | |
122 | bool hasFeature(StringRef Feature) const override; |
123 | |
124 | bool isValidCPUName(StringRef Name) const override; |
125 | void fillValidCPUList(SmallVectorImpl<StringRef> &Values) const override; |
126 | |
127 | bool setCPU(const std::string &Name) override; |
128 | |
129 | bool setFPMath(StringRef Name) override; |
130 | |
131 | bool useFP16ConversionIntrinsics() const override { |
132 | return false; |
133 | } |
134 | |
135 | void getTargetDefinesARMV81A(const LangOptions &Opts, |
136 | MacroBuilder &Builder) const; |
137 | |
138 | void getTargetDefinesARMV82A(const LangOptions &Opts, |
139 | MacroBuilder &Builder) const; |
140 | void getTargetDefines(const LangOptions &Opts, |
141 | MacroBuilder &Builder) const override; |
142 | |
143 | ArrayRef<Builtin::Info> getTargetBuiltins() const override; |
144 | |
145 | bool isCLZForZeroUndef() const override; |
146 | BuiltinVaListKind getBuiltinVaListKind() const override; |
147 | |
148 | ArrayRef<const char *> getGCCRegNames() const override; |
149 | ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override; |
150 | bool validateAsmConstraint(const char *&Name, |
151 | TargetInfo::ConstraintInfo &Info) const override; |
152 | std::string convertConstraint(const char *&Constraint) const override; |
153 | bool |
154 | validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size, |
155 | std::string &SuggestedModifier) const override; |
156 | const char *getClobbers() const override; |
157 | |
158 | StringRef getConstraintRegister(StringRef Constraint, |
159 | StringRef Expression) const override { |
160 | return Expression; |
161 | } |
162 | |
163 | CallingConvCheckResult checkCallingConvention(CallingConv CC) const override; |
164 | |
165 | int getEHDataRegisterNumber(unsigned RegNo) const override; |
166 | |
167 | bool hasSjLjLowering() const override; |
168 | }; |
169 | |
170 | class LLVM_LIBRARY_VISIBILITY ARMleTargetInfo : public ARMTargetInfo { |
171 | public: |
172 | ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); |
173 | void getTargetDefines(const LangOptions &Opts, |
174 | MacroBuilder &Builder) const override; |
175 | }; |
176 | |
177 | class LLVM_LIBRARY_VISIBILITY ARMbeTargetInfo : public ARMTargetInfo { |
178 | public: |
179 | ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); |
180 | void getTargetDefines(const LangOptions &Opts, |
181 | MacroBuilder &Builder) const override; |
182 | }; |
183 | |
184 | class LLVM_LIBRARY_VISIBILITY WindowsARMTargetInfo |
185 | : public WindowsTargetInfo<ARMleTargetInfo> { |
186 | const llvm::Triple Triple; |
187 | |
188 | public: |
189 | WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); |
190 | |
191 | void getVisualStudioDefines(const LangOptions &Opts, |
192 | MacroBuilder &Builder) const; |
193 | |
194 | BuiltinVaListKind getBuiltinVaListKind() const override; |
195 | |
196 | CallingConvCheckResult checkCallingConvention(CallingConv CC) const override; |
197 | }; |
198 | |
199 | |
200 | class LLVM_LIBRARY_VISIBILITY ItaniumWindowsARMleTargetInfo |
201 | : public WindowsARMTargetInfo { |
202 | public: |
203 | ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple, |
204 | const TargetOptions &Opts); |
205 | |
206 | void getTargetDefines(const LangOptions &Opts, |
207 | MacroBuilder &Builder) const override; |
208 | }; |
209 | |
210 | |
211 | class LLVM_LIBRARY_VISIBILITY MicrosoftARMleTargetInfo |
212 | : public WindowsARMTargetInfo { |
213 | public: |
214 | MicrosoftARMleTargetInfo(const llvm::Triple &Triple, |
215 | const TargetOptions &Opts); |
216 | |
217 | void getTargetDefines(const LangOptions &Opts, |
218 | MacroBuilder &Builder) const override; |
219 | }; |
220 | |
221 | |
222 | class LLVM_LIBRARY_VISIBILITY MinGWARMTargetInfo : public WindowsARMTargetInfo { |
223 | public: |
224 | MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); |
225 | |
226 | void getTargetDefines(const LangOptions &Opts, |
227 | MacroBuilder &Builder) const override; |
228 | }; |
229 | |
230 | |
231 | class LLVM_LIBRARY_VISIBILITY CygwinARMTargetInfo : public ARMleTargetInfo { |
232 | public: |
233 | CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); |
234 | |
235 | void getTargetDefines(const LangOptions &Opts, |
236 | MacroBuilder &Builder) const override; |
237 | }; |
238 | |
239 | class LLVM_LIBRARY_VISIBILITY DarwinARMTargetInfo |
240 | : public DarwinTargetInfo<ARMleTargetInfo> { |
241 | protected: |
242 | void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, |
243 | MacroBuilder &Builder) const override; |
244 | |
245 | public: |
246 | DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts); |
247 | }; |
248 | |
249 | |
250 | class LLVM_LIBRARY_VISIBILITY RenderScript32TargetInfo |
251 | : public ARMleTargetInfo { |
252 | public: |
253 | RenderScript32TargetInfo(const llvm::Triple &Triple, |
254 | const TargetOptions &Opts); |
255 | |
256 | void getTargetDefines(const LangOptions &Opts, |
257 | MacroBuilder &Builder) const override; |
258 | }; |
259 | |
260 | } |
261 | } |
262 | |
263 | #endif |
264 | |