Deleted Added
full compact
Targets.cpp (280031) Targets.cpp (283526)
1//===--- Targets.cpp - Implement -arch option and targets -----------------===//
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 implements construction of a TargetInfo object from a
11// target triple.
12//
13//===----------------------------------------------------------------------===//
14
15#include "clang/Basic/TargetInfo.h"
16#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
18#include "clang/Basic/LangOptions.h"
19#include "clang/Basic/MacroBuilder.h"
20#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
22#include "llvm/ADT/APFloat.h"
23#include "llvm/ADT/STLExtras.h"
24#include "llvm/ADT/StringExtras.h"
25#include "llvm/ADT/StringRef.h"
26#include "llvm/ADT/StringSwitch.h"
27#include "llvm/ADT/Triple.h"
28#include "llvm/IR/Type.h"
29#include "llvm/MC/MCSectionMachO.h"
30#include "llvm/Support/ErrorHandling.h"
31#include <algorithm>
32#include <memory>
33using namespace clang;
34
35//===----------------------------------------------------------------------===//
36// Common code shared among targets.
37//===----------------------------------------------------------------------===//
38
39/// DefineStd - Define a macro name and standard variants. For example if
40/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
41/// when in GNU mode.
42static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
43 const LangOptions &Opts) {
44 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
45
46 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
47 // in the user's namespace.
48 if (Opts.GNUMode)
49 Builder.defineMacro(MacroName);
50
51 // Define __unix.
52 Builder.defineMacro("__" + MacroName);
53
54 // Define __unix__.
55 Builder.defineMacro("__" + MacroName + "__");
56}
57
58static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
59 bool Tuning = true) {
60 Builder.defineMacro("__" + CPUName);
61 Builder.defineMacro("__" + CPUName + "__");
62 if (Tuning)
63 Builder.defineMacro("__tune_" + CPUName + "__");
64}
65
66//===----------------------------------------------------------------------===//
67// Defines specific to certain operating systems.
68//===----------------------------------------------------------------------===//
69
70namespace {
71template<typename TgtInfo>
72class OSTargetInfo : public TgtInfo {
73protected:
74 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
75 MacroBuilder &Builder) const=0;
76public:
77 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
78 void getTargetDefines(const LangOptions &Opts,
79 MacroBuilder &Builder) const override {
80 TgtInfo::getTargetDefines(Opts, Builder);
81 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
82 }
83
84};
85} // end anonymous namespace
86
87
88static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
89 const llvm::Triple &Triple,
90 StringRef &PlatformName,
91 VersionTuple &PlatformMinVersion) {
92 Builder.defineMacro("__APPLE_CC__", "6000");
93 Builder.defineMacro("__APPLE__");
94 Builder.defineMacro("OBJC_NEW_PROPERTIES");
95 // AddressSanitizer doesn't play well with source fortification, which is on
96 // by default on Darwin.
97 if (Opts.Sanitize.has(SanitizerKind::Address))
98 Builder.defineMacro("_FORTIFY_SOURCE", "0");
99
100 if (!Opts.ObjCAutoRefCount) {
101 // __weak is always defined, for use in blocks and with objc pointers.
102 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
103
104 // Darwin defines __strong even in C mode (just to nothing).
105 if (Opts.getGC() != LangOptions::NonGC)
106 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
107 else
108 Builder.defineMacro("__strong", "");
109
110 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
111 // allow this in C, since one might have block pointers in structs that
112 // are used in pure C code and in Objective-C ARC.
113 Builder.defineMacro("__unsafe_unretained", "");
114 }
115
116 if (Opts.Static)
117 Builder.defineMacro("__STATIC__");
118 else
119 Builder.defineMacro("__DYNAMIC__");
120
121 if (Opts.POSIXThreads)
122 Builder.defineMacro("_REENTRANT");
123
124 // Get the platform type and version number from the triple.
125 unsigned Maj, Min, Rev;
126 if (Triple.isMacOSX()) {
127 Triple.getMacOSXVersion(Maj, Min, Rev);
128 PlatformName = "macosx";
129 } else {
130 Triple.getOSVersion(Maj, Min, Rev);
131 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
132 }
133
134 // If -target arch-pc-win32-macho option specified, we're
135 // generating code for Win32 ABI. No need to emit
136 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
137 if (PlatformName == "win32") {
138 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
139 return;
140 }
141
142 // Set the appropriate OS version define.
143 if (Triple.isiOS()) {
144 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
145 char Str[6];
146 Str[0] = '0' + Maj;
147 Str[1] = '0' + (Min / 10);
148 Str[2] = '0' + (Min % 10);
149 Str[3] = '0' + (Rev / 10);
150 Str[4] = '0' + (Rev % 10);
151 Str[5] = '\0';
152 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
153 Str);
154 } else if (Triple.isMacOSX()) {
155 // Note that the Driver allows versions which aren't representable in the
156 // define (because we only get a single digit for the minor and micro
157 // revision numbers). So, we limit them to the maximum representable
158 // version.
159 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
160 char Str[7];
161 if (Maj < 10 || (Maj == 10 && Min < 10)) {
162 Str[0] = '0' + (Maj / 10);
163 Str[1] = '0' + (Maj % 10);
164 Str[2] = '0' + std::min(Min, 9U);
165 Str[3] = '0' + std::min(Rev, 9U);
166 Str[4] = '\0';
167 } else {
168 // Handle versions > 10.9.
169 Str[0] = '0' + (Maj / 10);
170 Str[1] = '0' + (Maj % 10);
171 Str[2] = '0' + (Min / 10);
172 Str[3] = '0' + (Min % 10);
173 Str[4] = '0' + (Rev / 10);
174 Str[5] = '0' + (Rev % 10);
175 Str[6] = '\0';
176 }
177 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
178 }
179
180 // Tell users about the kernel if there is one.
181 if (Triple.isOSDarwin())
182 Builder.defineMacro("__MACH__");
183
184 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
185}
186
187namespace {
188template<typename Target>
189class DarwinTargetInfo : public OSTargetInfo<Target> {
190protected:
191 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
192 MacroBuilder &Builder) const override {
193 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
194 this->PlatformMinVersion);
195 }
196
197public:
198 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
199 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
200 this->MCountName = "\01mcount";
201 }
202
203 std::string isValidSectionSpecifier(StringRef SR) const override {
204 // Let MCSectionMachO validate this.
205 StringRef Segment, Section;
206 unsigned TAA, StubSize;
207 bool HasTAA;
208 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
209 TAA, HasTAA, StubSize);
210 }
211
212 const char *getStaticInitSectionSpecifier() const override {
213 // FIXME: We should return 0 when building kexts.
214 return "__TEXT,__StaticInit,regular,pure_instructions";
215 }
216
217 /// Darwin does not support protected visibility. Darwin's "default"
218 /// is very similar to ELF's "protected"; Darwin requires a "weak"
219 /// attribute on declarations that can be dynamically replaced.
220 bool hasProtectedVisibility() const override {
221 return false;
222 }
223};
224
225
226// DragonFlyBSD Target
227template<typename Target>
228class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
229protected:
230 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
231 MacroBuilder &Builder) const override {
232 // DragonFly defines; list based off of gcc output
233 Builder.defineMacro("__DragonFly__");
234 Builder.defineMacro("__DragonFly_cc_version", "100001");
235 Builder.defineMacro("__ELF__");
236 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
237 Builder.defineMacro("__tune_i386__");
238 DefineStd(Builder, "unix", Opts);
239 }
240public:
241 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
242 : OSTargetInfo<Target>(Triple) {
243 this->UserLabelPrefix = "";
244
245 switch (Triple.getArch()) {
246 default:
247 case llvm::Triple::x86:
248 case llvm::Triple::x86_64:
249 this->MCountName = ".mcount";
250 break;
251 }
252 }
253};
254
255// FreeBSD Target
256template<typename Target>
257class FreeBSDTargetInfo : public OSTargetInfo<Target> {
258protected:
259 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
260 MacroBuilder &Builder) const override {
261 // FreeBSD defines; list based off of gcc output
262
263 unsigned Release = Triple.getOSMajorVersion();
264 if (Release == 0U)
265 Release = 8;
266
267 Builder.defineMacro("__FreeBSD__", Twine(Release));
268 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
269 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
270 DefineStd(Builder, "unix", Opts);
271 Builder.defineMacro("__ELF__");
272
273 // On FreeBSD, wchar_t contains the number of the code point as
274 // used by the character set of the locale. These character sets are
275 // not necessarily a superset of ASCII.
276 //
277 // FIXME: This is wrong; the macro refers to the numerical values
278 // of wchar_t *literals*, which are not locale-dependent. However,
279 // FreeBSD systems apparently depend on us getting this wrong, and
280 // setting this to 1 is conforming even if all the basic source
281 // character literals have the same encoding as char and wchar_t.
282 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
283 }
284public:
285 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
286 this->UserLabelPrefix = "";
287
288 switch (Triple.getArch()) {
289 default:
290 case llvm::Triple::x86:
291 case llvm::Triple::x86_64:
292 this->MCountName = ".mcount";
293 break;
294 case llvm::Triple::mips:
295 case llvm::Triple::mipsel:
296 case llvm::Triple::ppc:
297 case llvm::Triple::ppc64:
298 case llvm::Triple::ppc64le:
299 this->MCountName = "_mcount";
300 break;
301 case llvm::Triple::arm:
302 this->MCountName = "__mcount";
303 break;
304 }
305 }
306};
307
308// GNU/kFreeBSD Target
309template<typename Target>
310class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
311protected:
312 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
313 MacroBuilder &Builder) const override {
314 // GNU/kFreeBSD defines; list based off of gcc output
315
316 DefineStd(Builder, "unix", Opts);
317 Builder.defineMacro("__FreeBSD_kernel__");
318 Builder.defineMacro("__GLIBC__");
319 Builder.defineMacro("__ELF__");
320 if (Opts.POSIXThreads)
321 Builder.defineMacro("_REENTRANT");
322 if (Opts.CPlusPlus)
323 Builder.defineMacro("_GNU_SOURCE");
324 }
325public:
326 KFreeBSDTargetInfo(const llvm::Triple &Triple)
327 : OSTargetInfo<Target>(Triple) {
328 this->UserLabelPrefix = "";
329 }
330};
331
332// Minix Target
333template<typename Target>
334class MinixTargetInfo : public OSTargetInfo<Target> {
335protected:
336 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
337 MacroBuilder &Builder) const override {
338 // Minix defines
339
340 Builder.defineMacro("__minix", "3");
341 Builder.defineMacro("_EM_WSIZE", "4");
342 Builder.defineMacro("_EM_PSIZE", "4");
343 Builder.defineMacro("_EM_SSIZE", "2");
344 Builder.defineMacro("_EM_LSIZE", "4");
345 Builder.defineMacro("_EM_FSIZE", "4");
346 Builder.defineMacro("_EM_DSIZE", "8");
347 Builder.defineMacro("__ELF__");
348 DefineStd(Builder, "unix", Opts);
349 }
350public:
351 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
352 this->UserLabelPrefix = "";
353 }
354};
355
356// Linux target
357template<typename Target>
358class LinuxTargetInfo : public OSTargetInfo<Target> {
359protected:
360 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
361 MacroBuilder &Builder) const override {
362 // Linux defines; list based off of gcc output
363 DefineStd(Builder, "unix", Opts);
364 DefineStd(Builder, "linux", Opts);
365 Builder.defineMacro("__gnu_linux__");
366 Builder.defineMacro("__ELF__");
367 if (Triple.getEnvironment() == llvm::Triple::Android)
368 Builder.defineMacro("__ANDROID__", "1");
369 if (Opts.POSIXThreads)
370 Builder.defineMacro("_REENTRANT");
371 if (Opts.CPlusPlus)
372 Builder.defineMacro("_GNU_SOURCE");
373 }
374public:
375 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
376 this->UserLabelPrefix = "";
377 this->WIntType = TargetInfo::UnsignedInt;
378
379 switch (Triple.getArch()) {
380 default:
381 break;
382 case llvm::Triple::ppc:
383 case llvm::Triple::ppc64:
384 case llvm::Triple::ppc64le:
385 this->MCountName = "_mcount";
386 break;
387 }
388 }
389
390 const char *getStaticInitSectionSpecifier() const override {
391 return ".text.startup";
392 }
393};
394
395// NetBSD Target
396template<typename Target>
397class NetBSDTargetInfo : public OSTargetInfo<Target> {
398protected:
399 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
400 MacroBuilder &Builder) const override {
401 // NetBSD defines; list based off of gcc output
402 Builder.defineMacro("__NetBSD__");
403 Builder.defineMacro("__unix__");
404 Builder.defineMacro("__ELF__");
405 if (Opts.POSIXThreads)
406 Builder.defineMacro("_POSIX_THREADS");
407
408 switch (Triple.getArch()) {
409 default:
410 break;
411 case llvm::Triple::arm:
412 case llvm::Triple::armeb:
413 case llvm::Triple::thumb:
414 case llvm::Triple::thumbeb:
415 Builder.defineMacro("__ARM_DWARF_EH__");
416 break;
417 }
418 }
419public:
420 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
421 this->UserLabelPrefix = "";
1//===--- Targets.cpp - Implement -arch option and targets -----------------===//
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 implements construction of a TargetInfo object from a
11// target triple.
12//
13//===----------------------------------------------------------------------===//
14
15#include "clang/Basic/TargetInfo.h"
16#include "clang/Basic/Builtins.h"
17#include "clang/Basic/Diagnostic.h"
18#include "clang/Basic/LangOptions.h"
19#include "clang/Basic/MacroBuilder.h"
20#include "clang/Basic/TargetBuiltins.h"
21#include "clang/Basic/TargetOptions.h"
22#include "llvm/ADT/APFloat.h"
23#include "llvm/ADT/STLExtras.h"
24#include "llvm/ADT/StringExtras.h"
25#include "llvm/ADT/StringRef.h"
26#include "llvm/ADT/StringSwitch.h"
27#include "llvm/ADT/Triple.h"
28#include "llvm/IR/Type.h"
29#include "llvm/MC/MCSectionMachO.h"
30#include "llvm/Support/ErrorHandling.h"
31#include <algorithm>
32#include <memory>
33using namespace clang;
34
35//===----------------------------------------------------------------------===//
36// Common code shared among targets.
37//===----------------------------------------------------------------------===//
38
39/// DefineStd - Define a macro name and standard variants. For example if
40/// MacroName is "unix", then this will define "__unix", "__unix__", and "unix"
41/// when in GNU mode.
42static void DefineStd(MacroBuilder &Builder, StringRef MacroName,
43 const LangOptions &Opts) {
44 assert(MacroName[0] != '_' && "Identifier should be in the user's namespace");
45
46 // If in GNU mode (e.g. -std=gnu99 but not -std=c99) define the raw identifier
47 // in the user's namespace.
48 if (Opts.GNUMode)
49 Builder.defineMacro(MacroName);
50
51 // Define __unix.
52 Builder.defineMacro("__" + MacroName);
53
54 // Define __unix__.
55 Builder.defineMacro("__" + MacroName + "__");
56}
57
58static void defineCPUMacros(MacroBuilder &Builder, StringRef CPUName,
59 bool Tuning = true) {
60 Builder.defineMacro("__" + CPUName);
61 Builder.defineMacro("__" + CPUName + "__");
62 if (Tuning)
63 Builder.defineMacro("__tune_" + CPUName + "__");
64}
65
66//===----------------------------------------------------------------------===//
67// Defines specific to certain operating systems.
68//===----------------------------------------------------------------------===//
69
70namespace {
71template<typename TgtInfo>
72class OSTargetInfo : public TgtInfo {
73protected:
74 virtual void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
75 MacroBuilder &Builder) const=0;
76public:
77 OSTargetInfo(const llvm::Triple &Triple) : TgtInfo(Triple) {}
78 void getTargetDefines(const LangOptions &Opts,
79 MacroBuilder &Builder) const override {
80 TgtInfo::getTargetDefines(Opts, Builder);
81 getOSDefines(Opts, TgtInfo::getTriple(), Builder);
82 }
83
84};
85} // end anonymous namespace
86
87
88static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts,
89 const llvm::Triple &Triple,
90 StringRef &PlatformName,
91 VersionTuple &PlatformMinVersion) {
92 Builder.defineMacro("__APPLE_CC__", "6000");
93 Builder.defineMacro("__APPLE__");
94 Builder.defineMacro("OBJC_NEW_PROPERTIES");
95 // AddressSanitizer doesn't play well with source fortification, which is on
96 // by default on Darwin.
97 if (Opts.Sanitize.has(SanitizerKind::Address))
98 Builder.defineMacro("_FORTIFY_SOURCE", "0");
99
100 if (!Opts.ObjCAutoRefCount) {
101 // __weak is always defined, for use in blocks and with objc pointers.
102 Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))");
103
104 // Darwin defines __strong even in C mode (just to nothing).
105 if (Opts.getGC() != LangOptions::NonGC)
106 Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))");
107 else
108 Builder.defineMacro("__strong", "");
109
110 // __unsafe_unretained is defined to nothing in non-ARC mode. We even
111 // allow this in C, since one might have block pointers in structs that
112 // are used in pure C code and in Objective-C ARC.
113 Builder.defineMacro("__unsafe_unretained", "");
114 }
115
116 if (Opts.Static)
117 Builder.defineMacro("__STATIC__");
118 else
119 Builder.defineMacro("__DYNAMIC__");
120
121 if (Opts.POSIXThreads)
122 Builder.defineMacro("_REENTRANT");
123
124 // Get the platform type and version number from the triple.
125 unsigned Maj, Min, Rev;
126 if (Triple.isMacOSX()) {
127 Triple.getMacOSXVersion(Maj, Min, Rev);
128 PlatformName = "macosx";
129 } else {
130 Triple.getOSVersion(Maj, Min, Rev);
131 PlatformName = llvm::Triple::getOSTypeName(Triple.getOS());
132 }
133
134 // If -target arch-pc-win32-macho option specified, we're
135 // generating code for Win32 ABI. No need to emit
136 // __ENVIRONMENT_XX_OS_VERSION_MIN_REQUIRED__.
137 if (PlatformName == "win32") {
138 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
139 return;
140 }
141
142 // Set the appropriate OS version define.
143 if (Triple.isiOS()) {
144 assert(Maj < 10 && Min < 100 && Rev < 100 && "Invalid version!");
145 char Str[6];
146 Str[0] = '0' + Maj;
147 Str[1] = '0' + (Min / 10);
148 Str[2] = '0' + (Min % 10);
149 Str[3] = '0' + (Rev / 10);
150 Str[4] = '0' + (Rev % 10);
151 Str[5] = '\0';
152 Builder.defineMacro("__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__",
153 Str);
154 } else if (Triple.isMacOSX()) {
155 // Note that the Driver allows versions which aren't representable in the
156 // define (because we only get a single digit for the minor and micro
157 // revision numbers). So, we limit them to the maximum representable
158 // version.
159 assert(Maj < 100 && Min < 100 && Rev < 100 && "Invalid version!");
160 char Str[7];
161 if (Maj < 10 || (Maj == 10 && Min < 10)) {
162 Str[0] = '0' + (Maj / 10);
163 Str[1] = '0' + (Maj % 10);
164 Str[2] = '0' + std::min(Min, 9U);
165 Str[3] = '0' + std::min(Rev, 9U);
166 Str[4] = '\0';
167 } else {
168 // Handle versions > 10.9.
169 Str[0] = '0' + (Maj / 10);
170 Str[1] = '0' + (Maj % 10);
171 Str[2] = '0' + (Min / 10);
172 Str[3] = '0' + (Min % 10);
173 Str[4] = '0' + (Rev / 10);
174 Str[5] = '0' + (Rev % 10);
175 Str[6] = '\0';
176 }
177 Builder.defineMacro("__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__", Str);
178 }
179
180 // Tell users about the kernel if there is one.
181 if (Triple.isOSDarwin())
182 Builder.defineMacro("__MACH__");
183
184 PlatformMinVersion = VersionTuple(Maj, Min, Rev);
185}
186
187namespace {
188template<typename Target>
189class DarwinTargetInfo : public OSTargetInfo<Target> {
190protected:
191 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
192 MacroBuilder &Builder) const override {
193 getDarwinDefines(Builder, Opts, Triple, this->PlatformName,
194 this->PlatformMinVersion);
195 }
196
197public:
198 DarwinTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
199 this->TLSSupported = Triple.isMacOSX() && !Triple.isMacOSXVersionLT(10, 7);
200 this->MCountName = "\01mcount";
201 }
202
203 std::string isValidSectionSpecifier(StringRef SR) const override {
204 // Let MCSectionMachO validate this.
205 StringRef Segment, Section;
206 unsigned TAA, StubSize;
207 bool HasTAA;
208 return llvm::MCSectionMachO::ParseSectionSpecifier(SR, Segment, Section,
209 TAA, HasTAA, StubSize);
210 }
211
212 const char *getStaticInitSectionSpecifier() const override {
213 // FIXME: We should return 0 when building kexts.
214 return "__TEXT,__StaticInit,regular,pure_instructions";
215 }
216
217 /// Darwin does not support protected visibility. Darwin's "default"
218 /// is very similar to ELF's "protected"; Darwin requires a "weak"
219 /// attribute on declarations that can be dynamically replaced.
220 bool hasProtectedVisibility() const override {
221 return false;
222 }
223};
224
225
226// DragonFlyBSD Target
227template<typename Target>
228class DragonFlyBSDTargetInfo : public OSTargetInfo<Target> {
229protected:
230 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
231 MacroBuilder &Builder) const override {
232 // DragonFly defines; list based off of gcc output
233 Builder.defineMacro("__DragonFly__");
234 Builder.defineMacro("__DragonFly_cc_version", "100001");
235 Builder.defineMacro("__ELF__");
236 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
237 Builder.defineMacro("__tune_i386__");
238 DefineStd(Builder, "unix", Opts);
239 }
240public:
241 DragonFlyBSDTargetInfo(const llvm::Triple &Triple)
242 : OSTargetInfo<Target>(Triple) {
243 this->UserLabelPrefix = "";
244
245 switch (Triple.getArch()) {
246 default:
247 case llvm::Triple::x86:
248 case llvm::Triple::x86_64:
249 this->MCountName = ".mcount";
250 break;
251 }
252 }
253};
254
255// FreeBSD Target
256template<typename Target>
257class FreeBSDTargetInfo : public OSTargetInfo<Target> {
258protected:
259 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
260 MacroBuilder &Builder) const override {
261 // FreeBSD defines; list based off of gcc output
262
263 unsigned Release = Triple.getOSMajorVersion();
264 if (Release == 0U)
265 Release = 8;
266
267 Builder.defineMacro("__FreeBSD__", Twine(Release));
268 Builder.defineMacro("__FreeBSD_cc_version", Twine(Release * 100000U + 1U));
269 Builder.defineMacro("__KPRINTF_ATTRIBUTE__");
270 DefineStd(Builder, "unix", Opts);
271 Builder.defineMacro("__ELF__");
272
273 // On FreeBSD, wchar_t contains the number of the code point as
274 // used by the character set of the locale. These character sets are
275 // not necessarily a superset of ASCII.
276 //
277 // FIXME: This is wrong; the macro refers to the numerical values
278 // of wchar_t *literals*, which are not locale-dependent. However,
279 // FreeBSD systems apparently depend on us getting this wrong, and
280 // setting this to 1 is conforming even if all the basic source
281 // character literals have the same encoding as char and wchar_t.
282 Builder.defineMacro("__STDC_MB_MIGHT_NEQ_WC__", "1");
283 }
284public:
285 FreeBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
286 this->UserLabelPrefix = "";
287
288 switch (Triple.getArch()) {
289 default:
290 case llvm::Triple::x86:
291 case llvm::Triple::x86_64:
292 this->MCountName = ".mcount";
293 break;
294 case llvm::Triple::mips:
295 case llvm::Triple::mipsel:
296 case llvm::Triple::ppc:
297 case llvm::Triple::ppc64:
298 case llvm::Triple::ppc64le:
299 this->MCountName = "_mcount";
300 break;
301 case llvm::Triple::arm:
302 this->MCountName = "__mcount";
303 break;
304 }
305 }
306};
307
308// GNU/kFreeBSD Target
309template<typename Target>
310class KFreeBSDTargetInfo : public OSTargetInfo<Target> {
311protected:
312 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
313 MacroBuilder &Builder) const override {
314 // GNU/kFreeBSD defines; list based off of gcc output
315
316 DefineStd(Builder, "unix", Opts);
317 Builder.defineMacro("__FreeBSD_kernel__");
318 Builder.defineMacro("__GLIBC__");
319 Builder.defineMacro("__ELF__");
320 if (Opts.POSIXThreads)
321 Builder.defineMacro("_REENTRANT");
322 if (Opts.CPlusPlus)
323 Builder.defineMacro("_GNU_SOURCE");
324 }
325public:
326 KFreeBSDTargetInfo(const llvm::Triple &Triple)
327 : OSTargetInfo<Target>(Triple) {
328 this->UserLabelPrefix = "";
329 }
330};
331
332// Minix Target
333template<typename Target>
334class MinixTargetInfo : public OSTargetInfo<Target> {
335protected:
336 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
337 MacroBuilder &Builder) const override {
338 // Minix defines
339
340 Builder.defineMacro("__minix", "3");
341 Builder.defineMacro("_EM_WSIZE", "4");
342 Builder.defineMacro("_EM_PSIZE", "4");
343 Builder.defineMacro("_EM_SSIZE", "2");
344 Builder.defineMacro("_EM_LSIZE", "4");
345 Builder.defineMacro("_EM_FSIZE", "4");
346 Builder.defineMacro("_EM_DSIZE", "8");
347 Builder.defineMacro("__ELF__");
348 DefineStd(Builder, "unix", Opts);
349 }
350public:
351 MinixTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
352 this->UserLabelPrefix = "";
353 }
354};
355
356// Linux target
357template<typename Target>
358class LinuxTargetInfo : public OSTargetInfo<Target> {
359protected:
360 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
361 MacroBuilder &Builder) const override {
362 // Linux defines; list based off of gcc output
363 DefineStd(Builder, "unix", Opts);
364 DefineStd(Builder, "linux", Opts);
365 Builder.defineMacro("__gnu_linux__");
366 Builder.defineMacro("__ELF__");
367 if (Triple.getEnvironment() == llvm::Triple::Android)
368 Builder.defineMacro("__ANDROID__", "1");
369 if (Opts.POSIXThreads)
370 Builder.defineMacro("_REENTRANT");
371 if (Opts.CPlusPlus)
372 Builder.defineMacro("_GNU_SOURCE");
373 }
374public:
375 LinuxTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
376 this->UserLabelPrefix = "";
377 this->WIntType = TargetInfo::UnsignedInt;
378
379 switch (Triple.getArch()) {
380 default:
381 break;
382 case llvm::Triple::ppc:
383 case llvm::Triple::ppc64:
384 case llvm::Triple::ppc64le:
385 this->MCountName = "_mcount";
386 break;
387 }
388 }
389
390 const char *getStaticInitSectionSpecifier() const override {
391 return ".text.startup";
392 }
393};
394
395// NetBSD Target
396template<typename Target>
397class NetBSDTargetInfo : public OSTargetInfo<Target> {
398protected:
399 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
400 MacroBuilder &Builder) const override {
401 // NetBSD defines; list based off of gcc output
402 Builder.defineMacro("__NetBSD__");
403 Builder.defineMacro("__unix__");
404 Builder.defineMacro("__ELF__");
405 if (Opts.POSIXThreads)
406 Builder.defineMacro("_POSIX_THREADS");
407
408 switch (Triple.getArch()) {
409 default:
410 break;
411 case llvm::Triple::arm:
412 case llvm::Triple::armeb:
413 case llvm::Triple::thumb:
414 case llvm::Triple::thumbeb:
415 Builder.defineMacro("__ARM_DWARF_EH__");
416 break;
417 }
418 }
419public:
420 NetBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
421 this->UserLabelPrefix = "";
422 this->MCountName = "_mcount";
422 }
423};
424
425// OpenBSD Target
426template<typename Target>
427class OpenBSDTargetInfo : public OSTargetInfo<Target> {
428protected:
429 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
430 MacroBuilder &Builder) const override {
431 // OpenBSD defines; list based off of gcc output
432
433 Builder.defineMacro("__OpenBSD__");
434 DefineStd(Builder, "unix", Opts);
435 Builder.defineMacro("__ELF__");
436 if (Opts.POSIXThreads)
437 Builder.defineMacro("_REENTRANT");
438 }
439public:
440 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
441 this->UserLabelPrefix = "";
442 this->TLSSupported = false;
443
444 switch (Triple.getArch()) {
445 default:
446 case llvm::Triple::x86:
447 case llvm::Triple::x86_64:
448 case llvm::Triple::arm:
449 case llvm::Triple::sparc:
450 this->MCountName = "__mcount";
451 break;
452 case llvm::Triple::mips64:
453 case llvm::Triple::mips64el:
454 case llvm::Triple::ppc:
455 case llvm::Triple::sparcv9:
456 this->MCountName = "_mcount";
457 break;
458 }
459 }
460};
461
462// Bitrig Target
463template<typename Target>
464class BitrigTargetInfo : public OSTargetInfo<Target> {
465protected:
466 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
467 MacroBuilder &Builder) const override {
468 // Bitrig defines; list based off of gcc output
469
470 Builder.defineMacro("__Bitrig__");
471 DefineStd(Builder, "unix", Opts);
472 Builder.defineMacro("__ELF__");
473 if (Opts.POSIXThreads)
474 Builder.defineMacro("_REENTRANT");
475 }
476public:
477 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
478 this->UserLabelPrefix = "";
479 this->MCountName = "__mcount";
480 }
481};
482
483// PSP Target
484template<typename Target>
485class PSPTargetInfo : public OSTargetInfo<Target> {
486protected:
487 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
488 MacroBuilder &Builder) const override {
489 // PSP defines; list based on the output of the pspdev gcc toolchain.
490 Builder.defineMacro("PSP");
491 Builder.defineMacro("_PSP");
492 Builder.defineMacro("__psp__");
493 Builder.defineMacro("__ELF__");
494 }
495public:
496 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
497 this->UserLabelPrefix = "";
498 }
499};
500
501// PS3 PPU Target
502template<typename Target>
503class PS3PPUTargetInfo : public OSTargetInfo<Target> {
504protected:
505 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
506 MacroBuilder &Builder) const override {
507 // PS3 PPU defines.
508 Builder.defineMacro("__PPC__");
509 Builder.defineMacro("__PPU__");
510 Builder.defineMacro("__CELLOS_LV2__");
511 Builder.defineMacro("__ELF__");
512 Builder.defineMacro("__LP32__");
513 Builder.defineMacro("_ARCH_PPC64");
514 Builder.defineMacro("__powerpc64__");
515 }
516public:
517 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
518 this->UserLabelPrefix = "";
519 this->LongWidth = this->LongAlign = 32;
520 this->PointerWidth = this->PointerAlign = 32;
521 this->IntMaxType = TargetInfo::SignedLongLong;
522 this->Int64Type = TargetInfo::SignedLongLong;
523 this->SizeType = TargetInfo::UnsignedInt;
524 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
525 }
526};
527
528// Solaris target
529template<typename Target>
530class SolarisTargetInfo : public OSTargetInfo<Target> {
531protected:
532 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
533 MacroBuilder &Builder) const override {
534 DefineStd(Builder, "sun", Opts);
535 DefineStd(Builder, "unix", Opts);
536 Builder.defineMacro("__ELF__");
537 Builder.defineMacro("__svr4__");
538 Builder.defineMacro("__SVR4");
539 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
540 // newer, but to 500 for everything else. feature_test.h has a check to
541 // ensure that you are not using C99 with an old version of X/Open or C89
542 // with a new version.
543 if (Opts.C99)
544 Builder.defineMacro("_XOPEN_SOURCE", "600");
545 else
546 Builder.defineMacro("_XOPEN_SOURCE", "500");
547 if (Opts.CPlusPlus)
548 Builder.defineMacro("__C99FEATURES__");
549 Builder.defineMacro("_LARGEFILE_SOURCE");
550 Builder.defineMacro("_LARGEFILE64_SOURCE");
551 Builder.defineMacro("__EXTENSIONS__");
552 Builder.defineMacro("_REENTRANT");
553 }
554public:
555 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
556 this->UserLabelPrefix = "";
557 this->WCharType = this->SignedInt;
558 // FIXME: WIntType should be SignedLong
559 }
560};
561
562// Windows target
563template<typename Target>
564class WindowsTargetInfo : public OSTargetInfo<Target> {
565protected:
566 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
567 MacroBuilder &Builder) const override {
568 Builder.defineMacro("_WIN32");
569 }
570 void getVisualStudioDefines(const LangOptions &Opts,
571 MacroBuilder &Builder) const {
572 if (Opts.CPlusPlus) {
573 if (Opts.RTTIData)
574 Builder.defineMacro("_CPPRTTI");
575
576 if (Opts.Exceptions)
577 Builder.defineMacro("_CPPUNWIND");
578 }
579
580 if (!Opts.CharIsSigned)
581 Builder.defineMacro("_CHAR_UNSIGNED");
582
583 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
584 // but it works for now.
585 if (Opts.POSIXThreads)
586 Builder.defineMacro("_MT");
587
588 if (Opts.MSCompatibilityVersion) {
589 Builder.defineMacro("_MSC_VER",
590 Twine(Opts.MSCompatibilityVersion / 100000));
591 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
592 // FIXME We cannot encode the revision information into 32-bits
593 Builder.defineMacro("_MSC_BUILD", Twine(1));
594 }
595
596 if (Opts.MicrosoftExt) {
597 Builder.defineMacro("_MSC_EXTENSIONS");
598
599 if (Opts.CPlusPlus11) {
600 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
601 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
602 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
603 }
604 }
605
606 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
607 }
608
609public:
610 WindowsTargetInfo(const llvm::Triple &Triple)
611 : OSTargetInfo<Target>(Triple) {}
612};
613
614template <typename Target>
615class NaClTargetInfo : public OSTargetInfo<Target> {
616protected:
617 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
618 MacroBuilder &Builder) const override {
619 if (Opts.POSIXThreads)
620 Builder.defineMacro("_REENTRANT");
621 if (Opts.CPlusPlus)
622 Builder.defineMacro("_GNU_SOURCE");
623
624 DefineStd(Builder, "unix", Opts);
625 Builder.defineMacro("__ELF__");
626 Builder.defineMacro("__native_client__");
627 }
628
629public:
630 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
631 this->UserLabelPrefix = "";
632 this->LongAlign = 32;
633 this->LongWidth = 32;
634 this->PointerAlign = 32;
635 this->PointerWidth = 32;
636 this->IntMaxType = TargetInfo::SignedLongLong;
637 this->Int64Type = TargetInfo::SignedLongLong;
638 this->DoubleAlign = 64;
639 this->LongDoubleWidth = 64;
640 this->LongDoubleAlign = 64;
641 this->LongLongWidth = 64;
642 this->LongLongAlign = 64;
643 this->SizeType = TargetInfo::UnsignedInt;
644 this->PtrDiffType = TargetInfo::SignedInt;
645 this->IntPtrType = TargetInfo::SignedInt;
646 // RegParmMax is inherited from the underlying architecture
647 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
648 if (Triple.getArch() == llvm::Triple::arm) {
649 this->DescriptionString =
650 "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
651 } else if (Triple.getArch() == llvm::Triple::x86) {
652 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
653 } else if (Triple.getArch() == llvm::Triple::x86_64) {
654 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
655 } else if (Triple.getArch() == llvm::Triple::mipsel) {
656 // Handled on mips' setDescriptionString.
657 } else {
658 assert(Triple.getArch() == llvm::Triple::le32);
659 this->DescriptionString = "e-p:32:32-i64:64";
660 }
661 }
662 typename Target::CallingConvCheckResult checkCallingConvention(
663 CallingConv CC) const override {
664 return CC == CC_PnaclCall ? Target::CCCR_OK :
665 Target::checkCallingConvention(CC);
666 }
667};
668} // end anonymous namespace.
669
670//===----------------------------------------------------------------------===//
671// Specific target implementations.
672//===----------------------------------------------------------------------===//
673
674namespace {
675// PPC abstract base class
676class PPCTargetInfo : public TargetInfo {
677 static const Builtin::Info BuiltinInfo[];
678 static const char * const GCCRegNames[];
679 static const TargetInfo::GCCRegAlias GCCRegAliases[];
680 std::string CPU;
681
682 // Target cpu features.
683 bool HasVSX;
684 bool HasP8Vector;
685
686protected:
687 std::string ABI;
688
689public:
690 PPCTargetInfo(const llvm::Triple &Triple)
691 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false) {
692 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
693 LongDoubleWidth = LongDoubleAlign = 128;
694 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
695 }
696
697 /// \brief Flags for architecture specific defines.
698 typedef enum {
699 ArchDefineNone = 0,
700 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
701 ArchDefinePpcgr = 1 << 1,
702 ArchDefinePpcsq = 1 << 2,
703 ArchDefine440 = 1 << 3,
704 ArchDefine603 = 1 << 4,
705 ArchDefine604 = 1 << 5,
706 ArchDefinePwr4 = 1 << 6,
707 ArchDefinePwr5 = 1 << 7,
708 ArchDefinePwr5x = 1 << 8,
709 ArchDefinePwr6 = 1 << 9,
710 ArchDefinePwr6x = 1 << 10,
711 ArchDefinePwr7 = 1 << 11,
712 ArchDefinePwr8 = 1 << 12,
713 ArchDefineA2 = 1 << 13,
714 ArchDefineA2q = 1 << 14
715 } ArchDefineTypes;
716
717 // Note: GCC recognizes the following additional cpus:
718 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
719 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
720 // titan, rs64.
721 bool setCPU(const std::string &Name) override {
722 bool CPUKnown = llvm::StringSwitch<bool>(Name)
723 .Case("generic", true)
724 .Case("440", true)
725 .Case("450", true)
726 .Case("601", true)
727 .Case("602", true)
728 .Case("603", true)
729 .Case("603e", true)
730 .Case("603ev", true)
731 .Case("604", true)
732 .Case("604e", true)
733 .Case("620", true)
734 .Case("630", true)
735 .Case("g3", true)
736 .Case("7400", true)
737 .Case("g4", true)
738 .Case("7450", true)
739 .Case("g4+", true)
740 .Case("750", true)
741 .Case("970", true)
742 .Case("g5", true)
743 .Case("a2", true)
744 .Case("a2q", true)
745 .Case("e500mc", true)
746 .Case("e5500", true)
747 .Case("power3", true)
748 .Case("pwr3", true)
749 .Case("power4", true)
750 .Case("pwr4", true)
751 .Case("power5", true)
752 .Case("pwr5", true)
753 .Case("power5x", true)
754 .Case("pwr5x", true)
755 .Case("power6", true)
756 .Case("pwr6", true)
757 .Case("power6x", true)
758 .Case("pwr6x", true)
759 .Case("power7", true)
760 .Case("pwr7", true)
761 .Case("power8", true)
762 .Case("pwr8", true)
763 .Case("powerpc", true)
764 .Case("ppc", true)
765 .Case("powerpc64", true)
766 .Case("ppc64", true)
767 .Case("powerpc64le", true)
768 .Case("ppc64le", true)
769 .Default(false);
770
771 if (CPUKnown)
772 CPU = Name;
773
774 return CPUKnown;
775 }
776
777
778 StringRef getABI() const override { return ABI; }
779
780 void getTargetBuiltins(const Builtin::Info *&Records,
781 unsigned &NumRecords) const override {
782 Records = BuiltinInfo;
783 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
784 }
785
786 bool isCLZForZeroUndef() const override { return false; }
787
788 void getTargetDefines(const LangOptions &Opts,
789 MacroBuilder &Builder) const override;
790
791 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
792
793 bool handleTargetFeatures(std::vector<std::string> &Features,
794 DiagnosticsEngine &Diags) override;
795 bool hasFeature(StringRef Feature) const override;
796
797 void getGCCRegNames(const char * const *&Names,
798 unsigned &NumNames) const override;
799 void getGCCRegAliases(const GCCRegAlias *&Aliases,
800 unsigned &NumAliases) const override;
801 bool validateAsmConstraint(const char *&Name,
802 TargetInfo::ConstraintInfo &Info) const override {
803 switch (*Name) {
804 default: return false;
805 case 'O': // Zero
806 break;
807 case 'b': // Base register
808 case 'f': // Floating point register
809 Info.setAllowsRegister();
810 break;
811 // FIXME: The following are added to allow parsing.
812 // I just took a guess at what the actions should be.
813 // Also, is more specific checking needed? I.e. specific registers?
814 case 'd': // Floating point register (containing 64-bit value)
815 case 'v': // Altivec vector register
816 Info.setAllowsRegister();
817 break;
818 case 'w':
819 switch (Name[1]) {
820 case 'd':// VSX vector register to hold vector double data
821 case 'f':// VSX vector register to hold vector float data
822 case 's':// VSX vector register to hold scalar float data
823 case 'a':// Any VSX register
824 case 'c':// An individual CR bit
825 break;
826 default:
827 return false;
828 }
829 Info.setAllowsRegister();
830 Name++; // Skip over 'w'.
831 break;
832 case 'h': // `MQ', `CTR', or `LINK' register
833 case 'q': // `MQ' register
834 case 'c': // `CTR' register
835 case 'l': // `LINK' register
836 case 'x': // `CR' register (condition register) number 0
837 case 'y': // `CR' register (condition register)
838 case 'z': // `XER[CA]' carry bit (part of the XER register)
839 Info.setAllowsRegister();
840 break;
841 case 'I': // Signed 16-bit constant
842 case 'J': // Unsigned 16-bit constant shifted left 16 bits
843 // (use `L' instead for SImode constants)
844 case 'K': // Unsigned 16-bit constant
845 case 'L': // Signed 16-bit constant shifted left 16 bits
846 case 'M': // Constant larger than 31
847 case 'N': // Exact power of 2
848 case 'P': // Constant whose negation is a signed 16-bit constant
849 case 'G': // Floating point constant that can be loaded into a
850 // register with one instruction per word
851 case 'H': // Integer/Floating point constant that can be loaded
852 // into a register using three instructions
853 break;
854 case 'm': // Memory operand. Note that on PowerPC targets, m can
855 // include addresses that update the base register. It
856 // is therefore only safe to use `m' in an asm statement
857 // if that asm statement accesses the operand exactly once.
858 // The asm statement must also use `%U<opno>' as a
859 // placeholder for the "update" flag in the corresponding
860 // load or store instruction. For example:
861 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
862 // is correct but:
863 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
864 // is not. Use es rather than m if you don't want the base
865 // register to be updated.
866 case 'e':
867 if (Name[1] != 's')
868 return false;
869 // es: A "stable" memory operand; that is, one which does not
870 // include any automodification of the base register. Unlike
871 // `m', this constraint can be used in asm statements that
872 // might access the operand several times, or that might not
873 // access it at all.
874 Info.setAllowsMemory();
875 Name++; // Skip over 'e'.
876 break;
877 case 'Q': // Memory operand that is an offset from a register (it is
878 // usually better to use `m' or `es' in asm statements)
879 case 'Z': // Memory operand that is an indexed or indirect from a
880 // register (it is usually better to use `m' or `es' in
881 // asm statements)
882 Info.setAllowsMemory();
883 Info.setAllowsRegister();
884 break;
885 case 'R': // AIX TOC entry
886 case 'a': // Address operand that is an indexed or indirect from a
887 // register (`p' is preferable for asm statements)
888 case 'S': // Constant suitable as a 64-bit mask operand
889 case 'T': // Constant suitable as a 32-bit mask operand
890 case 'U': // System V Release 4 small data area reference
891 case 't': // AND masks that can be performed by two rldic{l, r}
892 // instructions
893 case 'W': // Vector constant that does not require memory
894 case 'j': // Vector constant that is all zeros.
895 break;
896 // End FIXME.
897 }
898 return true;
899 }
900 std::string convertConstraint(const char *&Constraint) const override {
901 std::string R;
902 switch (*Constraint) {
903 case 'e':
904 case 'w':
905 // Two-character constraint; add "^" hint for later parsing.
906 R = std::string("^") + std::string(Constraint, 2);
907 Constraint++;
908 break;
909 default:
910 return TargetInfo::convertConstraint(Constraint);
911 }
912 return R;
913 }
914 const char *getClobbers() const override {
915 return "";
916 }
917 int getEHDataRegisterNumber(unsigned RegNo) const override {
918 if (RegNo == 0) return 3;
919 if (RegNo == 1) return 4;
920 return -1;
921 }
423 }
424};
425
426// OpenBSD Target
427template<typename Target>
428class OpenBSDTargetInfo : public OSTargetInfo<Target> {
429protected:
430 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
431 MacroBuilder &Builder) const override {
432 // OpenBSD defines; list based off of gcc output
433
434 Builder.defineMacro("__OpenBSD__");
435 DefineStd(Builder, "unix", Opts);
436 Builder.defineMacro("__ELF__");
437 if (Opts.POSIXThreads)
438 Builder.defineMacro("_REENTRANT");
439 }
440public:
441 OpenBSDTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
442 this->UserLabelPrefix = "";
443 this->TLSSupported = false;
444
445 switch (Triple.getArch()) {
446 default:
447 case llvm::Triple::x86:
448 case llvm::Triple::x86_64:
449 case llvm::Triple::arm:
450 case llvm::Triple::sparc:
451 this->MCountName = "__mcount";
452 break;
453 case llvm::Triple::mips64:
454 case llvm::Triple::mips64el:
455 case llvm::Triple::ppc:
456 case llvm::Triple::sparcv9:
457 this->MCountName = "_mcount";
458 break;
459 }
460 }
461};
462
463// Bitrig Target
464template<typename Target>
465class BitrigTargetInfo : public OSTargetInfo<Target> {
466protected:
467 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
468 MacroBuilder &Builder) const override {
469 // Bitrig defines; list based off of gcc output
470
471 Builder.defineMacro("__Bitrig__");
472 DefineStd(Builder, "unix", Opts);
473 Builder.defineMacro("__ELF__");
474 if (Opts.POSIXThreads)
475 Builder.defineMacro("_REENTRANT");
476 }
477public:
478 BitrigTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
479 this->UserLabelPrefix = "";
480 this->MCountName = "__mcount";
481 }
482};
483
484// PSP Target
485template<typename Target>
486class PSPTargetInfo : public OSTargetInfo<Target> {
487protected:
488 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
489 MacroBuilder &Builder) const override {
490 // PSP defines; list based on the output of the pspdev gcc toolchain.
491 Builder.defineMacro("PSP");
492 Builder.defineMacro("_PSP");
493 Builder.defineMacro("__psp__");
494 Builder.defineMacro("__ELF__");
495 }
496public:
497 PSPTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
498 this->UserLabelPrefix = "";
499 }
500};
501
502// PS3 PPU Target
503template<typename Target>
504class PS3PPUTargetInfo : public OSTargetInfo<Target> {
505protected:
506 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
507 MacroBuilder &Builder) const override {
508 // PS3 PPU defines.
509 Builder.defineMacro("__PPC__");
510 Builder.defineMacro("__PPU__");
511 Builder.defineMacro("__CELLOS_LV2__");
512 Builder.defineMacro("__ELF__");
513 Builder.defineMacro("__LP32__");
514 Builder.defineMacro("_ARCH_PPC64");
515 Builder.defineMacro("__powerpc64__");
516 }
517public:
518 PS3PPUTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
519 this->UserLabelPrefix = "";
520 this->LongWidth = this->LongAlign = 32;
521 this->PointerWidth = this->PointerAlign = 32;
522 this->IntMaxType = TargetInfo::SignedLongLong;
523 this->Int64Type = TargetInfo::SignedLongLong;
524 this->SizeType = TargetInfo::UnsignedInt;
525 this->DescriptionString = "E-m:e-p:32:32-i64:64-n32:64";
526 }
527};
528
529// Solaris target
530template<typename Target>
531class SolarisTargetInfo : public OSTargetInfo<Target> {
532protected:
533 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
534 MacroBuilder &Builder) const override {
535 DefineStd(Builder, "sun", Opts);
536 DefineStd(Builder, "unix", Opts);
537 Builder.defineMacro("__ELF__");
538 Builder.defineMacro("__svr4__");
539 Builder.defineMacro("__SVR4");
540 // Solaris headers require _XOPEN_SOURCE to be set to 600 for C99 and
541 // newer, but to 500 for everything else. feature_test.h has a check to
542 // ensure that you are not using C99 with an old version of X/Open or C89
543 // with a new version.
544 if (Opts.C99)
545 Builder.defineMacro("_XOPEN_SOURCE", "600");
546 else
547 Builder.defineMacro("_XOPEN_SOURCE", "500");
548 if (Opts.CPlusPlus)
549 Builder.defineMacro("__C99FEATURES__");
550 Builder.defineMacro("_LARGEFILE_SOURCE");
551 Builder.defineMacro("_LARGEFILE64_SOURCE");
552 Builder.defineMacro("__EXTENSIONS__");
553 Builder.defineMacro("_REENTRANT");
554 }
555public:
556 SolarisTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
557 this->UserLabelPrefix = "";
558 this->WCharType = this->SignedInt;
559 // FIXME: WIntType should be SignedLong
560 }
561};
562
563// Windows target
564template<typename Target>
565class WindowsTargetInfo : public OSTargetInfo<Target> {
566protected:
567 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
568 MacroBuilder &Builder) const override {
569 Builder.defineMacro("_WIN32");
570 }
571 void getVisualStudioDefines(const LangOptions &Opts,
572 MacroBuilder &Builder) const {
573 if (Opts.CPlusPlus) {
574 if (Opts.RTTIData)
575 Builder.defineMacro("_CPPRTTI");
576
577 if (Opts.Exceptions)
578 Builder.defineMacro("_CPPUNWIND");
579 }
580
581 if (!Opts.CharIsSigned)
582 Builder.defineMacro("_CHAR_UNSIGNED");
583
584 // FIXME: POSIXThreads isn't exactly the option this should be defined for,
585 // but it works for now.
586 if (Opts.POSIXThreads)
587 Builder.defineMacro("_MT");
588
589 if (Opts.MSCompatibilityVersion) {
590 Builder.defineMacro("_MSC_VER",
591 Twine(Opts.MSCompatibilityVersion / 100000));
592 Builder.defineMacro("_MSC_FULL_VER", Twine(Opts.MSCompatibilityVersion));
593 // FIXME We cannot encode the revision information into 32-bits
594 Builder.defineMacro("_MSC_BUILD", Twine(1));
595 }
596
597 if (Opts.MicrosoftExt) {
598 Builder.defineMacro("_MSC_EXTENSIONS");
599
600 if (Opts.CPlusPlus11) {
601 Builder.defineMacro("_RVALUE_REFERENCES_V2_SUPPORTED");
602 Builder.defineMacro("_RVALUE_REFERENCES_SUPPORTED");
603 Builder.defineMacro("_NATIVE_NULLPTR_SUPPORTED");
604 }
605 }
606
607 Builder.defineMacro("_INTEGRAL_MAX_BITS", "64");
608 }
609
610public:
611 WindowsTargetInfo(const llvm::Triple &Triple)
612 : OSTargetInfo<Target>(Triple) {}
613};
614
615template <typename Target>
616class NaClTargetInfo : public OSTargetInfo<Target> {
617protected:
618 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
619 MacroBuilder &Builder) const override {
620 if (Opts.POSIXThreads)
621 Builder.defineMacro("_REENTRANT");
622 if (Opts.CPlusPlus)
623 Builder.defineMacro("_GNU_SOURCE");
624
625 DefineStd(Builder, "unix", Opts);
626 Builder.defineMacro("__ELF__");
627 Builder.defineMacro("__native_client__");
628 }
629
630public:
631 NaClTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
632 this->UserLabelPrefix = "";
633 this->LongAlign = 32;
634 this->LongWidth = 32;
635 this->PointerAlign = 32;
636 this->PointerWidth = 32;
637 this->IntMaxType = TargetInfo::SignedLongLong;
638 this->Int64Type = TargetInfo::SignedLongLong;
639 this->DoubleAlign = 64;
640 this->LongDoubleWidth = 64;
641 this->LongDoubleAlign = 64;
642 this->LongLongWidth = 64;
643 this->LongLongAlign = 64;
644 this->SizeType = TargetInfo::UnsignedInt;
645 this->PtrDiffType = TargetInfo::SignedInt;
646 this->IntPtrType = TargetInfo::SignedInt;
647 // RegParmMax is inherited from the underlying architecture
648 this->LongDoubleFormat = &llvm::APFloat::IEEEdouble;
649 if (Triple.getArch() == llvm::Triple::arm) {
650 this->DescriptionString =
651 "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S128";
652 } else if (Triple.getArch() == llvm::Triple::x86) {
653 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32-S128";
654 } else if (Triple.getArch() == llvm::Triple::x86_64) {
655 this->DescriptionString = "e-m:e-p:32:32-i64:64-n8:16:32:64-S128";
656 } else if (Triple.getArch() == llvm::Triple::mipsel) {
657 // Handled on mips' setDescriptionString.
658 } else {
659 assert(Triple.getArch() == llvm::Triple::le32);
660 this->DescriptionString = "e-p:32:32-i64:64";
661 }
662 }
663 typename Target::CallingConvCheckResult checkCallingConvention(
664 CallingConv CC) const override {
665 return CC == CC_PnaclCall ? Target::CCCR_OK :
666 Target::checkCallingConvention(CC);
667 }
668};
669} // end anonymous namespace.
670
671//===----------------------------------------------------------------------===//
672// Specific target implementations.
673//===----------------------------------------------------------------------===//
674
675namespace {
676// PPC abstract base class
677class PPCTargetInfo : public TargetInfo {
678 static const Builtin::Info BuiltinInfo[];
679 static const char * const GCCRegNames[];
680 static const TargetInfo::GCCRegAlias GCCRegAliases[];
681 std::string CPU;
682
683 // Target cpu features.
684 bool HasVSX;
685 bool HasP8Vector;
686
687protected:
688 std::string ABI;
689
690public:
691 PPCTargetInfo(const llvm::Triple &Triple)
692 : TargetInfo(Triple), HasVSX(false), HasP8Vector(false) {
693 BigEndian = (Triple.getArch() != llvm::Triple::ppc64le);
694 LongDoubleWidth = LongDoubleAlign = 128;
695 LongDoubleFormat = &llvm::APFloat::PPCDoubleDouble;
696 }
697
698 /// \brief Flags for architecture specific defines.
699 typedef enum {
700 ArchDefineNone = 0,
701 ArchDefineName = 1 << 0, // <name> is substituted for arch name.
702 ArchDefinePpcgr = 1 << 1,
703 ArchDefinePpcsq = 1 << 2,
704 ArchDefine440 = 1 << 3,
705 ArchDefine603 = 1 << 4,
706 ArchDefine604 = 1 << 5,
707 ArchDefinePwr4 = 1 << 6,
708 ArchDefinePwr5 = 1 << 7,
709 ArchDefinePwr5x = 1 << 8,
710 ArchDefinePwr6 = 1 << 9,
711 ArchDefinePwr6x = 1 << 10,
712 ArchDefinePwr7 = 1 << 11,
713 ArchDefinePwr8 = 1 << 12,
714 ArchDefineA2 = 1 << 13,
715 ArchDefineA2q = 1 << 14
716 } ArchDefineTypes;
717
718 // Note: GCC recognizes the following additional cpus:
719 // 401, 403, 405, 405fp, 440fp, 464, 464fp, 476, 476fp, 505, 740, 801,
720 // 821, 823, 8540, 8548, e300c2, e300c3, e500mc64, e6500, 860, cell,
721 // titan, rs64.
722 bool setCPU(const std::string &Name) override {
723 bool CPUKnown = llvm::StringSwitch<bool>(Name)
724 .Case("generic", true)
725 .Case("440", true)
726 .Case("450", true)
727 .Case("601", true)
728 .Case("602", true)
729 .Case("603", true)
730 .Case("603e", true)
731 .Case("603ev", true)
732 .Case("604", true)
733 .Case("604e", true)
734 .Case("620", true)
735 .Case("630", true)
736 .Case("g3", true)
737 .Case("7400", true)
738 .Case("g4", true)
739 .Case("7450", true)
740 .Case("g4+", true)
741 .Case("750", true)
742 .Case("970", true)
743 .Case("g5", true)
744 .Case("a2", true)
745 .Case("a2q", true)
746 .Case("e500mc", true)
747 .Case("e5500", true)
748 .Case("power3", true)
749 .Case("pwr3", true)
750 .Case("power4", true)
751 .Case("pwr4", true)
752 .Case("power5", true)
753 .Case("pwr5", true)
754 .Case("power5x", true)
755 .Case("pwr5x", true)
756 .Case("power6", true)
757 .Case("pwr6", true)
758 .Case("power6x", true)
759 .Case("pwr6x", true)
760 .Case("power7", true)
761 .Case("pwr7", true)
762 .Case("power8", true)
763 .Case("pwr8", true)
764 .Case("powerpc", true)
765 .Case("ppc", true)
766 .Case("powerpc64", true)
767 .Case("ppc64", true)
768 .Case("powerpc64le", true)
769 .Case("ppc64le", true)
770 .Default(false);
771
772 if (CPUKnown)
773 CPU = Name;
774
775 return CPUKnown;
776 }
777
778
779 StringRef getABI() const override { return ABI; }
780
781 void getTargetBuiltins(const Builtin::Info *&Records,
782 unsigned &NumRecords) const override {
783 Records = BuiltinInfo;
784 NumRecords = clang::PPC::LastTSBuiltin-Builtin::FirstTSBuiltin;
785 }
786
787 bool isCLZForZeroUndef() const override { return false; }
788
789 void getTargetDefines(const LangOptions &Opts,
790 MacroBuilder &Builder) const override;
791
792 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
793
794 bool handleTargetFeatures(std::vector<std::string> &Features,
795 DiagnosticsEngine &Diags) override;
796 bool hasFeature(StringRef Feature) const override;
797
798 void getGCCRegNames(const char * const *&Names,
799 unsigned &NumNames) const override;
800 void getGCCRegAliases(const GCCRegAlias *&Aliases,
801 unsigned &NumAliases) const override;
802 bool validateAsmConstraint(const char *&Name,
803 TargetInfo::ConstraintInfo &Info) const override {
804 switch (*Name) {
805 default: return false;
806 case 'O': // Zero
807 break;
808 case 'b': // Base register
809 case 'f': // Floating point register
810 Info.setAllowsRegister();
811 break;
812 // FIXME: The following are added to allow parsing.
813 // I just took a guess at what the actions should be.
814 // Also, is more specific checking needed? I.e. specific registers?
815 case 'd': // Floating point register (containing 64-bit value)
816 case 'v': // Altivec vector register
817 Info.setAllowsRegister();
818 break;
819 case 'w':
820 switch (Name[1]) {
821 case 'd':// VSX vector register to hold vector double data
822 case 'f':// VSX vector register to hold vector float data
823 case 's':// VSX vector register to hold scalar float data
824 case 'a':// Any VSX register
825 case 'c':// An individual CR bit
826 break;
827 default:
828 return false;
829 }
830 Info.setAllowsRegister();
831 Name++; // Skip over 'w'.
832 break;
833 case 'h': // `MQ', `CTR', or `LINK' register
834 case 'q': // `MQ' register
835 case 'c': // `CTR' register
836 case 'l': // `LINK' register
837 case 'x': // `CR' register (condition register) number 0
838 case 'y': // `CR' register (condition register)
839 case 'z': // `XER[CA]' carry bit (part of the XER register)
840 Info.setAllowsRegister();
841 break;
842 case 'I': // Signed 16-bit constant
843 case 'J': // Unsigned 16-bit constant shifted left 16 bits
844 // (use `L' instead for SImode constants)
845 case 'K': // Unsigned 16-bit constant
846 case 'L': // Signed 16-bit constant shifted left 16 bits
847 case 'M': // Constant larger than 31
848 case 'N': // Exact power of 2
849 case 'P': // Constant whose negation is a signed 16-bit constant
850 case 'G': // Floating point constant that can be loaded into a
851 // register with one instruction per word
852 case 'H': // Integer/Floating point constant that can be loaded
853 // into a register using three instructions
854 break;
855 case 'm': // Memory operand. Note that on PowerPC targets, m can
856 // include addresses that update the base register. It
857 // is therefore only safe to use `m' in an asm statement
858 // if that asm statement accesses the operand exactly once.
859 // The asm statement must also use `%U<opno>' as a
860 // placeholder for the "update" flag in the corresponding
861 // load or store instruction. For example:
862 // asm ("st%U0 %1,%0" : "=m" (mem) : "r" (val));
863 // is correct but:
864 // asm ("st %1,%0" : "=m" (mem) : "r" (val));
865 // is not. Use es rather than m if you don't want the base
866 // register to be updated.
867 case 'e':
868 if (Name[1] != 's')
869 return false;
870 // es: A "stable" memory operand; that is, one which does not
871 // include any automodification of the base register. Unlike
872 // `m', this constraint can be used in asm statements that
873 // might access the operand several times, or that might not
874 // access it at all.
875 Info.setAllowsMemory();
876 Name++; // Skip over 'e'.
877 break;
878 case 'Q': // Memory operand that is an offset from a register (it is
879 // usually better to use `m' or `es' in asm statements)
880 case 'Z': // Memory operand that is an indexed or indirect from a
881 // register (it is usually better to use `m' or `es' in
882 // asm statements)
883 Info.setAllowsMemory();
884 Info.setAllowsRegister();
885 break;
886 case 'R': // AIX TOC entry
887 case 'a': // Address operand that is an indexed or indirect from a
888 // register (`p' is preferable for asm statements)
889 case 'S': // Constant suitable as a 64-bit mask operand
890 case 'T': // Constant suitable as a 32-bit mask operand
891 case 'U': // System V Release 4 small data area reference
892 case 't': // AND masks that can be performed by two rldic{l, r}
893 // instructions
894 case 'W': // Vector constant that does not require memory
895 case 'j': // Vector constant that is all zeros.
896 break;
897 // End FIXME.
898 }
899 return true;
900 }
901 std::string convertConstraint(const char *&Constraint) const override {
902 std::string R;
903 switch (*Constraint) {
904 case 'e':
905 case 'w':
906 // Two-character constraint; add "^" hint for later parsing.
907 R = std::string("^") + std::string(Constraint, 2);
908 Constraint++;
909 break;
910 default:
911 return TargetInfo::convertConstraint(Constraint);
912 }
913 return R;
914 }
915 const char *getClobbers() const override {
916 return "";
917 }
918 int getEHDataRegisterNumber(unsigned RegNo) const override {
919 if (RegNo == 0) return 3;
920 if (RegNo == 1) return 4;
921 return -1;
922 }
923
924 bool hasSjLjLowering() const override {
925 return true;
926 }
922};
923
924const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
925#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
926#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
927 ALL_LANGUAGES },
928#include "clang/Basic/BuiltinsPPC.def"
929};
930
931/// handleTargetFeatures - Perform initialization based on the user
932/// configured set of features.
933bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
934 DiagnosticsEngine &Diags) {
935 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
936 // Ignore disabled features.
937 if (Features[i][0] == '-')
938 continue;
939
940 StringRef Feature = StringRef(Features[i]).substr(1);
941
942 if (Feature == "vsx") {
943 HasVSX = true;
944 continue;
945 }
946
947 if (Feature == "power8-vector") {
948 HasP8Vector = true;
949 continue;
950 }
951
952 // TODO: Finish this list and add an assert that we've handled them
953 // all.
954 }
955
956 return true;
957}
958
959/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
960/// #defines that are not tied to a specific subtarget.
961void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
962 MacroBuilder &Builder) const {
963 // Target identification.
964 Builder.defineMacro("__ppc__");
965 Builder.defineMacro("__PPC__");
966 Builder.defineMacro("_ARCH_PPC");
967 Builder.defineMacro("__powerpc__");
968 Builder.defineMacro("__POWERPC__");
969 if (PointerWidth == 64) {
970 Builder.defineMacro("_ARCH_PPC64");
971 Builder.defineMacro("__powerpc64__");
972 Builder.defineMacro("__ppc64__");
973 Builder.defineMacro("__PPC64__");
974 }
975
976 // Target properties.
977 if (getTriple().getArch() == llvm::Triple::ppc64le) {
978 Builder.defineMacro("_LITTLE_ENDIAN");
979 } else {
980 if (getTriple().getOS() != llvm::Triple::NetBSD &&
981 getTriple().getOS() != llvm::Triple::OpenBSD)
982 Builder.defineMacro("_BIG_ENDIAN");
983 }
984
985 // ABI options.
986 if (ABI == "elfv1")
987 Builder.defineMacro("_CALL_ELF", "1");
988 if (ABI == "elfv2")
989 Builder.defineMacro("_CALL_ELF", "2");
990
991 // Subtarget options.
992 Builder.defineMacro("__NATURAL_ALIGNMENT__");
993 Builder.defineMacro("__REGISTER_PREFIX__", "");
994
995 // FIXME: Should be controlled by command line option.
996 if (LongDoubleWidth == 128)
997 Builder.defineMacro("__LONG_DOUBLE_128__");
998
999 if (Opts.AltiVec) {
1000 Builder.defineMacro("__VEC__", "10206");
1001 Builder.defineMacro("__ALTIVEC__");
1002 }
1003
1004 // CPU identification.
1005 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1006 .Case("440", ArchDefineName)
1007 .Case("450", ArchDefineName | ArchDefine440)
1008 .Case("601", ArchDefineName)
1009 .Case("602", ArchDefineName | ArchDefinePpcgr)
1010 .Case("603", ArchDefineName | ArchDefinePpcgr)
1011 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1012 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1013 .Case("604", ArchDefineName | ArchDefinePpcgr)
1014 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1015 .Case("620", ArchDefineName | ArchDefinePpcgr)
1016 .Case("630", ArchDefineName | ArchDefinePpcgr)
1017 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1018 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1019 .Case("750", ArchDefineName | ArchDefinePpcgr)
1020 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1021 | ArchDefinePpcsq)
1022 .Case("a2", ArchDefineA2)
1023 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
1024 .Case("pwr3", ArchDefinePpcgr)
1025 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1026 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1027 | ArchDefinePpcsq)
1028 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1029 | ArchDefinePpcgr | ArchDefinePpcsq)
1030 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1031 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1032 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1033 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1034 | ArchDefinePpcsq)
1035 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1036 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1037 | ArchDefinePpcgr | ArchDefinePpcsq)
1038 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1039 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1040 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1041 .Case("power3", ArchDefinePpcgr)
1042 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1043 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1044 | ArchDefinePpcsq)
1045 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1046 | ArchDefinePpcgr | ArchDefinePpcsq)
1047 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1048 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1049 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1050 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1051 | ArchDefinePpcsq)
1052 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1053 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1054 | ArchDefinePpcgr | ArchDefinePpcsq)
1055 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1056 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1057 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1058 .Default(ArchDefineNone);
1059
1060 if (defs & ArchDefineName)
1061 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1062 if (defs & ArchDefinePpcgr)
1063 Builder.defineMacro("_ARCH_PPCGR");
1064 if (defs & ArchDefinePpcsq)
1065 Builder.defineMacro("_ARCH_PPCSQ");
1066 if (defs & ArchDefine440)
1067 Builder.defineMacro("_ARCH_440");
1068 if (defs & ArchDefine603)
1069 Builder.defineMacro("_ARCH_603");
1070 if (defs & ArchDefine604)
1071 Builder.defineMacro("_ARCH_604");
1072 if (defs & ArchDefinePwr4)
1073 Builder.defineMacro("_ARCH_PWR4");
1074 if (defs & ArchDefinePwr5)
1075 Builder.defineMacro("_ARCH_PWR5");
1076 if (defs & ArchDefinePwr5x)
1077 Builder.defineMacro("_ARCH_PWR5X");
1078 if (defs & ArchDefinePwr6)
1079 Builder.defineMacro("_ARCH_PWR6");
1080 if (defs & ArchDefinePwr6x)
1081 Builder.defineMacro("_ARCH_PWR6X");
1082 if (defs & ArchDefinePwr7)
1083 Builder.defineMacro("_ARCH_PWR7");
1084 if (defs & ArchDefinePwr8)
1085 Builder.defineMacro("_ARCH_PWR8");
1086 if (defs & ArchDefineA2)
1087 Builder.defineMacro("_ARCH_A2");
1088 if (defs & ArchDefineA2q) {
1089 Builder.defineMacro("_ARCH_A2Q");
1090 Builder.defineMacro("_ARCH_QP");
1091 }
1092
1093 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1094 Builder.defineMacro("__bg__");
1095 Builder.defineMacro("__THW_BLUEGENE__");
1096 Builder.defineMacro("__bgq__");
1097 Builder.defineMacro("__TOS_BGQ__");
1098 }
1099
1100 if (HasVSX)
1101 Builder.defineMacro("__VSX__");
1102 if (HasP8Vector)
1103 Builder.defineMacro("__POWER8_VECTOR__");
1104
1105 // FIXME: The following are not yet generated here by Clang, but are
1106 // generated by GCC:
1107 //
1108 // _SOFT_FLOAT_
1109 // __RECIP_PRECISION__
1110 // __APPLE_ALTIVEC__
1111 // __RECIP__
1112 // __RECIPF__
1113 // __RSQRTE__
1114 // __RSQRTEF__
1115 // _SOFT_DOUBLE_
1116 // __NO_LWSYNC__
1117 // __HAVE_BSWAP__
1118 // __LONGDOUBLE128
1119 // __CMODEL_MEDIUM__
1120 // __CMODEL_LARGE__
1121 // _CALL_SYSV
1122 // _CALL_DARWIN
1123 // __NO_FPRS__
1124}
1125
1126void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1127 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1128 .Case("7400", true)
1129 .Case("g4", true)
1130 .Case("7450", true)
1131 .Case("g4+", true)
1132 .Case("970", true)
1133 .Case("g5", true)
1134 .Case("pwr6", true)
1135 .Case("pwr7", true)
1136 .Case("pwr8", true)
1137 .Case("ppc64", true)
1138 .Case("ppc64le", true)
1139 .Default(false);
1140
1141 Features["qpx"] = (CPU == "a2q");
1142
1143 if (!ABI.empty())
1144 Features[ABI] = true;
1145}
1146
1147bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1148 return llvm::StringSwitch<bool>(Feature)
1149 .Case("powerpc", true)
1150 .Case("vsx", HasVSX)
1151 .Case("power8-vector", HasP8Vector)
1152 .Default(false);
1153}
1154
1155const char * const PPCTargetInfo::GCCRegNames[] = {
1156 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1157 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1158 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1159 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1160 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1161 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1162 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1163 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
1164 "mq", "lr", "ctr", "ap",
1165 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
1166 "xer",
1167 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1168 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1169 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1170 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1171 "vrsave", "vscr",
1172 "spe_acc", "spefscr",
1173 "sfp"
1174};
1175
1176void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
1177 unsigned &NumNames) const {
1178 Names = GCCRegNames;
1179 NumNames = llvm::array_lengthof(GCCRegNames);
1180}
1181
1182const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1183 // While some of these aliases do map to different registers
1184 // they still share the same register name.
1185 { { "0" }, "r0" },
1186 { { "1"}, "r1" },
1187 { { "2" }, "r2" },
1188 { { "3" }, "r3" },
1189 { { "4" }, "r4" },
1190 { { "5" }, "r5" },
1191 { { "6" }, "r6" },
1192 { { "7" }, "r7" },
1193 { { "8" }, "r8" },
1194 { { "9" }, "r9" },
1195 { { "10" }, "r10" },
1196 { { "11" }, "r11" },
1197 { { "12" }, "r12" },
1198 { { "13" }, "r13" },
1199 { { "14" }, "r14" },
1200 { { "15" }, "r15" },
1201 { { "16" }, "r16" },
1202 { { "17" }, "r17" },
1203 { { "18" }, "r18" },
1204 { { "19" }, "r19" },
1205 { { "20" }, "r20" },
1206 { { "21" }, "r21" },
1207 { { "22" }, "r22" },
1208 { { "23" }, "r23" },
1209 { { "24" }, "r24" },
1210 { { "25" }, "r25" },
1211 { { "26" }, "r26" },
1212 { { "27" }, "r27" },
1213 { { "28" }, "r28" },
1214 { { "29" }, "r29" },
1215 { { "30" }, "r30" },
1216 { { "31" }, "r31" },
1217 { { "fr0" }, "f0" },
1218 { { "fr1" }, "f1" },
1219 { { "fr2" }, "f2" },
1220 { { "fr3" }, "f3" },
1221 { { "fr4" }, "f4" },
1222 { { "fr5" }, "f5" },
1223 { { "fr6" }, "f6" },
1224 { { "fr7" }, "f7" },
1225 { { "fr8" }, "f8" },
1226 { { "fr9" }, "f9" },
1227 { { "fr10" }, "f10" },
1228 { { "fr11" }, "f11" },
1229 { { "fr12" }, "f12" },
1230 { { "fr13" }, "f13" },
1231 { { "fr14" }, "f14" },
1232 { { "fr15" }, "f15" },
1233 { { "fr16" }, "f16" },
1234 { { "fr17" }, "f17" },
1235 { { "fr18" }, "f18" },
1236 { { "fr19" }, "f19" },
1237 { { "fr20" }, "f20" },
1238 { { "fr21" }, "f21" },
1239 { { "fr22" }, "f22" },
1240 { { "fr23" }, "f23" },
1241 { { "fr24" }, "f24" },
1242 { { "fr25" }, "f25" },
1243 { { "fr26" }, "f26" },
1244 { { "fr27" }, "f27" },
1245 { { "fr28" }, "f28" },
1246 { { "fr29" }, "f29" },
1247 { { "fr30" }, "f30" },
1248 { { "fr31" }, "f31" },
1249 { { "cc" }, "cr0" },
1250};
1251
1252void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1253 unsigned &NumAliases) const {
1254 Aliases = GCCRegAliases;
1255 NumAliases = llvm::array_lengthof(GCCRegAliases);
1256}
1257} // end anonymous namespace.
1258
1259namespace {
1260class PPC32TargetInfo : public PPCTargetInfo {
1261public:
1262 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
1263 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
1264
1265 switch (getTriple().getOS()) {
1266 case llvm::Triple::Linux:
1267 case llvm::Triple::FreeBSD:
1268 case llvm::Triple::NetBSD:
1269 SizeType = UnsignedInt;
1270 PtrDiffType = SignedInt;
1271 IntPtrType = SignedInt;
1272 break;
1273 default:
1274 break;
1275 }
1276
1277 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1278 LongDoubleWidth = LongDoubleAlign = 64;
1279 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1280 }
1281
1282 // PPC32 supports atomics up to 4 bytes.
1283 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
1284 }
1285
1286 BuiltinVaListKind getBuiltinVaListKind() const override {
1287 // This is the ELF definition, and is overridden by the Darwin sub-target
1288 return TargetInfo::PowerABIBuiltinVaList;
1289 }
1290};
1291} // end anonymous namespace.
1292
1293// Note: ABI differences may eventually require us to have a separate
1294// TargetInfo for little endian.
1295namespace {
1296class PPC64TargetInfo : public PPCTargetInfo {
1297public:
1298 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
1299 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
1300 IntMaxType = SignedLong;
1301 Int64Type = SignedLong;
1302
1303 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1304 DescriptionString = "e-m:e-i64:64-n32:64";
1305 ABI = "elfv2";
1306 } else {
1307 DescriptionString = "E-m:e-i64:64-n32:64";
1308 ABI = "elfv1";
1309 }
1310
1311 switch (getTriple().getOS()) {
1312 case llvm::Triple::FreeBSD:
1313 LongDoubleWidth = LongDoubleAlign = 64;
1314 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1315 break;
1316 case llvm::Triple::NetBSD:
1317 IntMaxType = SignedLongLong;
1318 Int64Type = SignedLongLong;
1319 break;
1320 default:
1321 break;
1322 }
1323
1324 // PPC64 supports atomics up to 8 bytes.
1325 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
1326 }
1327 BuiltinVaListKind getBuiltinVaListKind() const override {
1328 return TargetInfo::CharPtrBuiltinVaList;
1329 }
1330 // PPC64 Linux-specifc ABI options.
1331 bool setABI(const std::string &Name) override {
1332 if (Name == "elfv1" || Name == "elfv2") {
1333 ABI = Name;
1334 return true;
1335 }
1336 return false;
1337 }
1338};
1339} // end anonymous namespace.
1340
1341
1342namespace {
1343class DarwinPPC32TargetInfo :
1344 public DarwinTargetInfo<PPC32TargetInfo> {
1345public:
1346 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1347 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
1348 HasAlignMac68kSupport = true;
1349 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
1350 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
1351 LongLongAlign = 32;
1352 SuitableAlign = 128;
1353 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
1354 }
1355 BuiltinVaListKind getBuiltinVaListKind() const override {
1356 return TargetInfo::CharPtrBuiltinVaList;
1357 }
1358};
1359
1360class DarwinPPC64TargetInfo :
1361 public DarwinTargetInfo<PPC64TargetInfo> {
1362public:
1363 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1364 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
1365 HasAlignMac68kSupport = true;
1366 SuitableAlign = 128;
1367 DescriptionString = "E-m:o-i64:64-n32:64";
1368 }
1369};
1370} // end anonymous namespace.
1371
1372namespace {
1373 static const unsigned NVPTXAddrSpaceMap[] = {
1374 1, // opencl_global
1375 3, // opencl_local
1376 4, // opencl_constant
1377 // FIXME: generic has to be added to the target
1378 0, // opencl_generic
1379 1, // cuda_device
1380 4, // cuda_constant
1381 3, // cuda_shared
1382 };
1383 class NVPTXTargetInfo : public TargetInfo {
1384 static const char * const GCCRegNames[];
1385 static const Builtin::Info BuiltinInfo[];
1386
1387 // The GPU profiles supported by the NVPTX backend
1388 enum GPUKind {
1389 GK_NONE,
1390 GK_SM20,
1391 GK_SM21,
1392 GK_SM30,
1393 GK_SM35,
1394 } GPU;
1395
1396 public:
1397 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
1398 BigEndian = false;
1399 TLSSupported = false;
1400 LongWidth = LongAlign = 64;
1401 AddrSpaceMap = &NVPTXAddrSpaceMap;
1402 UseAddrSpaceMapMangling = true;
1403 // Define available target features
1404 // These must be defined in sorted order!
1405 NoAsmVariants = true;
1406 // Set the default GPU to sm20
1407 GPU = GK_SM20;
1408 }
1409 void getTargetDefines(const LangOptions &Opts,
1410 MacroBuilder &Builder) const override {
1411 Builder.defineMacro("__PTX__");
1412 Builder.defineMacro("__NVPTX__");
1413 if (Opts.CUDAIsDevice) {
1414 // Set __CUDA_ARCH__ for the GPU specified.
1415 std::string CUDAArchCode;
1416 switch (GPU) {
1417 case GK_SM20:
1418 CUDAArchCode = "200";
1419 break;
1420 case GK_SM21:
1421 CUDAArchCode = "210";
1422 break;
1423 case GK_SM30:
1424 CUDAArchCode = "300";
1425 break;
1426 case GK_SM35:
1427 CUDAArchCode = "350";
1428 break;
1429 default:
1430 llvm_unreachable("Unhandled target CPU");
1431 }
1432 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1433 }
1434 }
1435 void getTargetBuiltins(const Builtin::Info *&Records,
1436 unsigned &NumRecords) const override {
1437 Records = BuiltinInfo;
1438 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
1439 }
1440 bool hasFeature(StringRef Feature) const override {
1441 return Feature == "ptx" || Feature == "nvptx";
1442 }
1443
1444 void getGCCRegNames(const char * const *&Names,
1445 unsigned &NumNames) const override;
1446 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1447 unsigned &NumAliases) const override {
1448 // No aliases.
1449 Aliases = nullptr;
1450 NumAliases = 0;
1451 }
1452 bool
1453 validateAsmConstraint(const char *&Name,
1454 TargetInfo::ConstraintInfo &Info) const override {
1455 switch (*Name) {
1456 default: return false;
1457 case 'c':
1458 case 'h':
1459 case 'r':
1460 case 'l':
1461 case 'f':
1462 case 'd':
1463 Info.setAllowsRegister();
1464 return true;
1465 }
1466 }
1467 const char *getClobbers() const override {
1468 // FIXME: Is this really right?
1469 return "";
1470 }
1471 BuiltinVaListKind getBuiltinVaListKind() const override {
1472 // FIXME: implement
1473 return TargetInfo::CharPtrBuiltinVaList;
1474 }
1475 bool setCPU(const std::string &Name) override {
1476 GPU = llvm::StringSwitch<GPUKind>(Name)
1477 .Case("sm_20", GK_SM20)
1478 .Case("sm_21", GK_SM21)
1479 .Case("sm_30", GK_SM30)
1480 .Case("sm_35", GK_SM35)
1481 .Default(GK_NONE);
1482
1483 return GPU != GK_NONE;
1484 }
1485 };
1486
1487 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1488#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1489#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1490 ALL_LANGUAGES },
1491#include "clang/Basic/BuiltinsNVPTX.def"
1492 };
1493
1494 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1495 "r0"
1496 };
1497
1498 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1499 unsigned &NumNames) const {
1500 Names = GCCRegNames;
1501 NumNames = llvm::array_lengthof(GCCRegNames);
1502 }
1503
1504 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1505 public:
1506 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1507 PointerWidth = PointerAlign = 32;
1508 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1509 IntPtrType = TargetInfo::SignedInt;
1510 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
1511 }
1512 };
1513
1514 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1515 public:
1516 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1517 PointerWidth = PointerAlign = 64;
1518 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1519 IntPtrType = TargetInfo::SignedLongLong;
1520 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
1521 }
1522 };
1523}
1524
1525namespace {
1526
1527static const unsigned R600AddrSpaceMap[] = {
1528 1, // opencl_global
1529 3, // opencl_local
1530 2, // opencl_constant
1531 4, // opencl_generic
1532 1, // cuda_device
1533 2, // cuda_constant
1534 3 // cuda_shared
1535};
1536
1537// If you edit the description strings, make sure you update
1538// getPointerWidthV().
1539
1540static const char *DescriptionStringR600 =
1541 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1542 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
1543
1544static const char *DescriptionStringR600DoubleOps =
1545 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1546 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
1547
1548static const char *DescriptionStringSI =
1549 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64"
1550 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1551 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
1552
1553class R600TargetInfo : public TargetInfo {
1554 static const Builtin::Info BuiltinInfo[];
1555
1556 /// \brief The GPU profiles supported by the R600 target.
1557 enum GPUKind {
1558 GK_NONE,
1559 GK_R600,
1560 GK_R600_DOUBLE_OPS,
1561 GK_R700,
1562 GK_R700_DOUBLE_OPS,
1563 GK_EVERGREEN,
1564 GK_EVERGREEN_DOUBLE_OPS,
1565 GK_NORTHERN_ISLANDS,
1566 GK_CAYMAN,
1567 GK_SOUTHERN_ISLANDS,
1568 GK_SEA_ISLANDS
1569 } GPU;
1570
1571public:
1572 R600TargetInfo(const llvm::Triple &Triple)
1573 : TargetInfo(Triple), GPU(GK_R600) {
1574 DescriptionString = DescriptionStringR600;
1575 AddrSpaceMap = &R600AddrSpaceMap;
1576 UseAddrSpaceMapMangling = true;
1577 }
1578
1579 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1580 if (GPU <= GK_CAYMAN)
1581 return 32;
1582
1583 switch(AddrSpace) {
1584 default:
1585 return 64;
1586 case 0:
1587 case 3:
1588 case 5:
1589 return 32;
1590 }
1591 }
1592
1593 const char * getClobbers() const override {
1594 return "";
1595 }
1596
1597 void getGCCRegNames(const char * const *&Names,
1598 unsigned &numNames) const override {
1599 Names = nullptr;
1600 numNames = 0;
1601 }
1602
1603 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1604 unsigned &NumAliases) const override {
1605 Aliases = nullptr;
1606 NumAliases = 0;
1607 }
1608
1609 bool validateAsmConstraint(const char *&Name,
1610 TargetInfo::ConstraintInfo &info) const override {
1611 return true;
1612 }
1613
1614 void getTargetBuiltins(const Builtin::Info *&Records,
1615 unsigned &NumRecords) const override {
1616 Records = BuiltinInfo;
1617 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
1618 }
1619
1620 void getTargetDefines(const LangOptions &Opts,
1621 MacroBuilder &Builder) const override {
1622 Builder.defineMacro("__R600__");
1623 }
1624
1625 BuiltinVaListKind getBuiltinVaListKind() const override {
1626 return TargetInfo::CharPtrBuiltinVaList;
1627 }
1628
1629 bool setCPU(const std::string &Name) override {
1630 GPU = llvm::StringSwitch<GPUKind>(Name)
1631 .Case("r600" , GK_R600)
1632 .Case("rv610", GK_R600)
1633 .Case("rv620", GK_R600)
1634 .Case("rv630", GK_R600)
1635 .Case("rv635", GK_R600)
1636 .Case("rs780", GK_R600)
1637 .Case("rs880", GK_R600)
1638 .Case("rv670", GK_R600_DOUBLE_OPS)
1639 .Case("rv710", GK_R700)
1640 .Case("rv730", GK_R700)
1641 .Case("rv740", GK_R700_DOUBLE_OPS)
1642 .Case("rv770", GK_R700_DOUBLE_OPS)
1643 .Case("palm", GK_EVERGREEN)
1644 .Case("cedar", GK_EVERGREEN)
1645 .Case("sumo", GK_EVERGREEN)
1646 .Case("sumo2", GK_EVERGREEN)
1647 .Case("redwood", GK_EVERGREEN)
1648 .Case("juniper", GK_EVERGREEN)
1649 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1650 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1651 .Case("barts", GK_NORTHERN_ISLANDS)
1652 .Case("turks", GK_NORTHERN_ISLANDS)
1653 .Case("caicos", GK_NORTHERN_ISLANDS)
1654 .Case("cayman", GK_CAYMAN)
1655 .Case("aruba", GK_CAYMAN)
1656 .Case("tahiti", GK_SOUTHERN_ISLANDS)
1657 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1658 .Case("verde", GK_SOUTHERN_ISLANDS)
1659 .Case("oland", GK_SOUTHERN_ISLANDS)
1660 .Case("hainan", GK_SOUTHERN_ISLANDS)
1661 .Case("bonaire", GK_SEA_ISLANDS)
1662 .Case("kabini", GK_SEA_ISLANDS)
1663 .Case("kaveri", GK_SEA_ISLANDS)
1664 .Case("hawaii", GK_SEA_ISLANDS)
1665 .Case("mullins", GK_SEA_ISLANDS)
1666 .Default(GK_NONE);
1667
1668 if (GPU == GK_NONE) {
1669 return false;
1670 }
1671
1672 // Set the correct data layout
1673 switch (GPU) {
1674 case GK_NONE:
1675 case GK_R600:
1676 case GK_R700:
1677 case GK_EVERGREEN:
1678 case GK_NORTHERN_ISLANDS:
1679 DescriptionString = DescriptionStringR600;
1680 break;
1681 case GK_R600_DOUBLE_OPS:
1682 case GK_R700_DOUBLE_OPS:
1683 case GK_EVERGREEN_DOUBLE_OPS:
1684 case GK_CAYMAN:
1685 DescriptionString = DescriptionStringR600DoubleOps;
1686 break;
1687 case GK_SOUTHERN_ISLANDS:
1688 case GK_SEA_ISLANDS:
1689 DescriptionString = DescriptionStringSI;
1690 break;
1691 }
1692
1693 return true;
1694 }
1695};
1696
1697const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1698#define BUILTIN(ID, TYPE, ATTRS) \
1699 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1700#include "clang/Basic/BuiltinsR600.def"
1701};
1702
1703} // end anonymous namespace
1704
1705namespace {
1706// Namespace for x86 abstract base class
1707const Builtin::Info BuiltinInfo[] = {
1708#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1709#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1710 ALL_LANGUAGES },
1711#include "clang/Basic/BuiltinsX86.def"
1712};
1713
1714static const char* const GCCRegNames[] = {
1715 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1716 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
1717 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
1718 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1719 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1720 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1721 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
1722 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1723 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
1724};
1725
1726const TargetInfo::AddlRegName AddlRegNames[] = {
1727 { { "al", "ah", "eax", "rax" }, 0 },
1728 { { "bl", "bh", "ebx", "rbx" }, 3 },
1729 { { "cl", "ch", "ecx", "rcx" }, 2 },
1730 { { "dl", "dh", "edx", "rdx" }, 1 },
1731 { { "esi", "rsi" }, 4 },
1732 { { "edi", "rdi" }, 5 },
1733 { { "esp", "rsp" }, 7 },
1734 { { "ebp", "rbp" }, 6 },
1735};
1736
1737// X86 target abstract base class; x86-32 and x86-64 are very close, so
1738// most of the implementation can be shared.
1739class X86TargetInfo : public TargetInfo {
1740 enum X86SSEEnum {
1741 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
1742 } SSELevel;
1743 enum MMX3DNowEnum {
1744 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1745 } MMX3DNowLevel;
1746 enum XOPEnum {
1747 NoXOP,
1748 SSE4A,
1749 FMA4,
1750 XOP
1751 } XOPLevel;
1752
1753 bool HasAES;
1754 bool HasPCLMUL;
1755 bool HasLZCNT;
1756 bool HasRDRND;
1757 bool HasFSGSBASE;
1758 bool HasBMI;
1759 bool HasBMI2;
1760 bool HasPOPCNT;
1761 bool HasRTM;
1762 bool HasPRFCHW;
1763 bool HasRDSEED;
1764 bool HasADX;
1765 bool HasTBM;
1766 bool HasFMA;
1767 bool HasF16C;
1768 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1769 HasAVX512VL;
1770 bool HasSHA;
1771 bool HasCX16;
1772
1773 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1774 ///
1775 /// Each enumeration represents a particular CPU supported by Clang. These
1776 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1777 enum CPUKind {
1778 CK_Generic,
1779
1780 /// \name i386
1781 /// i386-generation processors.
1782 //@{
1783 CK_i386,
1784 //@}
1785
1786 /// \name i486
1787 /// i486-generation processors.
1788 //@{
1789 CK_i486,
1790 CK_WinChipC6,
1791 CK_WinChip2,
1792 CK_C3,
1793 //@}
1794
1795 /// \name i586
1796 /// i586-generation processors, P5 microarchitecture based.
1797 //@{
1798 CK_i586,
1799 CK_Pentium,
1800 CK_PentiumMMX,
1801 //@}
1802
1803 /// \name i686
1804 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1805 //@{
1806 CK_i686,
1807 CK_PentiumPro,
1808 CK_Pentium2,
1809 CK_Pentium3,
1810 CK_Pentium3M,
1811 CK_PentiumM,
1812 CK_C3_2,
1813
1814 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1815 /// Clang however has some logic to suport this.
1816 // FIXME: Warn, deprecate, and potentially remove this.
1817 CK_Yonah,
1818 //@}
1819
1820 /// \name Netburst
1821 /// Netburst microarchitecture based processors.
1822 //@{
1823 CK_Pentium4,
1824 CK_Pentium4M,
1825 CK_Prescott,
1826 CK_Nocona,
1827 //@}
1828
1829 /// \name Core
1830 /// Core microarchitecture based processors.
1831 //@{
1832 CK_Core2,
1833
1834 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1835 /// codename which GCC no longer accepts as an option to -march, but Clang
1836 /// has some logic for recognizing it.
1837 // FIXME: Warn, deprecate, and potentially remove this.
1838 CK_Penryn,
1839 //@}
1840
1841 /// \name Atom
1842 /// Atom processors
1843 //@{
1844 CK_Bonnell,
1845 CK_Silvermont,
1846 //@}
1847
1848 /// \name Nehalem
1849 /// Nehalem microarchitecture based processors.
1850 CK_Nehalem,
1851
1852 /// \name Westmere
1853 /// Westmere microarchitecture based processors.
1854 CK_Westmere,
1855
1856 /// \name Sandy Bridge
1857 /// Sandy Bridge microarchitecture based processors.
1858 CK_SandyBridge,
1859
1860 /// \name Ivy Bridge
1861 /// Ivy Bridge microarchitecture based processors.
1862 CK_IvyBridge,
1863
1864 /// \name Haswell
1865 /// Haswell microarchitecture based processors.
1866 CK_Haswell,
1867
1868 /// \name Broadwell
1869 /// Broadwell microarchitecture based processors.
1870 CK_Broadwell,
1871
1872 /// \name Skylake
1873 /// Skylake microarchitecture based processors.
1874 CK_Skylake,
1875
1876 /// \name Knights Landing
1877 /// Knights Landing processor.
1878 CK_KNL,
1879
1880 /// \name K6
1881 /// K6 architecture processors.
1882 //@{
1883 CK_K6,
1884 CK_K6_2,
1885 CK_K6_3,
1886 //@}
1887
1888 /// \name K7
1889 /// K7 architecture processors.
1890 //@{
1891 CK_Athlon,
1892 CK_AthlonThunderbird,
1893 CK_Athlon4,
1894 CK_AthlonXP,
1895 CK_AthlonMP,
1896 //@}
1897
1898 /// \name K8
1899 /// K8 architecture processors.
1900 //@{
1901 CK_Athlon64,
1902 CK_Athlon64SSE3,
1903 CK_AthlonFX,
1904 CK_K8,
1905 CK_K8SSE3,
1906 CK_Opteron,
1907 CK_OpteronSSE3,
1908 CK_AMDFAM10,
1909 //@}
1910
1911 /// \name Bobcat
1912 /// Bobcat architecture processors.
1913 //@{
1914 CK_BTVER1,
1915 CK_BTVER2,
1916 //@}
1917
1918 /// \name Bulldozer
1919 /// Bulldozer architecture processors.
1920 //@{
1921 CK_BDVER1,
1922 CK_BDVER2,
1923 CK_BDVER3,
1924 CK_BDVER4,
1925 //@}
1926
1927 /// This specification is deprecated and will be removed in the future.
1928 /// Users should prefer \see CK_K8.
1929 // FIXME: Warn on this when the CPU is set to it.
1930 //@{
1931 CK_x86_64,
1932 //@}
1933
1934 /// \name Geode
1935 /// Geode processors.
1936 //@{
1937 CK_Geode
1938 //@}
1939 } CPU;
1940
1941 enum FPMathKind {
1942 FP_Default,
1943 FP_SSE,
1944 FP_387
1945 } FPMath;
1946
1947public:
1948 X86TargetInfo(const llvm::Triple &Triple)
1949 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
1950 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1951 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
1952 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
1953 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
1954 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
1955 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
1956 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
1957 BigEndian = false;
1958 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
1959 }
1960 unsigned getFloatEvalMethod() const override {
1961 // X87 evaluates with 80 bits "long double" precision.
1962 return SSELevel == NoSSE ? 2 : 0;
1963 }
1964 void getTargetBuiltins(const Builtin::Info *&Records,
1965 unsigned &NumRecords) const override {
1966 Records = BuiltinInfo;
1967 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
1968 }
1969 void getGCCRegNames(const char * const *&Names,
1970 unsigned &NumNames) const override {
1971 Names = GCCRegNames;
1972 NumNames = llvm::array_lengthof(GCCRegNames);
1973 }
1974 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1975 unsigned &NumAliases) const override {
1976 Aliases = nullptr;
1977 NumAliases = 0;
1978 }
1979 void getGCCAddlRegNames(const AddlRegName *&Names,
1980 unsigned &NumNames) const override {
1981 Names = AddlRegNames;
1982 NumNames = llvm::array_lengthof(AddlRegNames);
1983 }
1984 bool validateAsmConstraint(const char *&Name,
1985 TargetInfo::ConstraintInfo &info) const override;
1986
1987 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
1988
1989 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
1990
1991 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
1992
1993 std::string convertConstraint(const char *&Constraint) const override;
1994 const char *getClobbers() const override {
1995 return "~{dirflag},~{fpsr},~{flags}";
1996 }
1997 void getTargetDefines(const LangOptions &Opts,
1998 MacroBuilder &Builder) const override;
1999 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2000 bool Enabled);
2001 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2002 bool Enabled);
2003 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2004 bool Enabled);
2005 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2006 StringRef Name, bool Enabled) const override {
2007 setFeatureEnabledImpl(Features, Name, Enabled);
2008 }
2009 // This exists purely to cut down on the number of virtual calls in
2010 // getDefaultFeatures which calls this repeatedly.
2011 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2012 StringRef Name, bool Enabled);
2013 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2014 bool hasFeature(StringRef Feature) const override;
2015 bool handleTargetFeatures(std::vector<std::string> &Features,
2016 DiagnosticsEngine &Diags) override;
2017 StringRef getABI() const override {
2018 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
2019 return "avx";
2020 else if (getTriple().getArch() == llvm::Triple::x86 &&
2021 MMX3DNowLevel == NoMMX3DNow)
2022 return "no-mmx";
2023 return "";
2024 }
2025 bool setCPU(const std::string &Name) override {
2026 CPU = llvm::StringSwitch<CPUKind>(Name)
2027 .Case("i386", CK_i386)
2028 .Case("i486", CK_i486)
2029 .Case("winchip-c6", CK_WinChipC6)
2030 .Case("winchip2", CK_WinChip2)
2031 .Case("c3", CK_C3)
2032 .Case("i586", CK_i586)
2033 .Case("pentium", CK_Pentium)
2034 .Case("pentium-mmx", CK_PentiumMMX)
2035 .Case("i686", CK_i686)
2036 .Case("pentiumpro", CK_PentiumPro)
2037 .Case("pentium2", CK_Pentium2)
2038 .Case("pentium3", CK_Pentium3)
2039 .Case("pentium3m", CK_Pentium3M)
2040 .Case("pentium-m", CK_PentiumM)
2041 .Case("c3-2", CK_C3_2)
2042 .Case("yonah", CK_Yonah)
2043 .Case("pentium4", CK_Pentium4)
2044 .Case("pentium4m", CK_Pentium4M)
2045 .Case("prescott", CK_Prescott)
2046 .Case("nocona", CK_Nocona)
2047 .Case("core2", CK_Core2)
2048 .Case("penryn", CK_Penryn)
2049 .Case("bonnell", CK_Bonnell)
2050 .Case("atom", CK_Bonnell) // Legacy name.
2051 .Case("silvermont", CK_Silvermont)
2052 .Case("slm", CK_Silvermont) // Legacy name.
2053 .Case("nehalem", CK_Nehalem)
2054 .Case("corei7", CK_Nehalem) // Legacy name.
2055 .Case("westmere", CK_Westmere)
2056 .Case("sandybridge", CK_SandyBridge)
2057 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2058 .Case("ivybridge", CK_IvyBridge)
2059 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2060 .Case("haswell", CK_Haswell)
2061 .Case("core-avx2", CK_Haswell) // Legacy name.
2062 .Case("broadwell", CK_Broadwell)
2063 .Case("skylake", CK_Skylake)
2064 .Case("skx", CK_Skylake) // Legacy name.
2065 .Case("knl", CK_KNL)
2066 .Case("k6", CK_K6)
2067 .Case("k6-2", CK_K6_2)
2068 .Case("k6-3", CK_K6_3)
2069 .Case("athlon", CK_Athlon)
2070 .Case("athlon-tbird", CK_AthlonThunderbird)
2071 .Case("athlon-4", CK_Athlon4)
2072 .Case("athlon-xp", CK_AthlonXP)
2073 .Case("athlon-mp", CK_AthlonMP)
2074 .Case("athlon64", CK_Athlon64)
2075 .Case("athlon64-sse3", CK_Athlon64SSE3)
2076 .Case("athlon-fx", CK_AthlonFX)
2077 .Case("k8", CK_K8)
2078 .Case("k8-sse3", CK_K8SSE3)
2079 .Case("opteron", CK_Opteron)
2080 .Case("opteron-sse3", CK_OpteronSSE3)
2081 .Case("barcelona", CK_AMDFAM10)
2082 .Case("amdfam10", CK_AMDFAM10)
2083 .Case("btver1", CK_BTVER1)
2084 .Case("btver2", CK_BTVER2)
2085 .Case("bdver1", CK_BDVER1)
2086 .Case("bdver2", CK_BDVER2)
2087 .Case("bdver3", CK_BDVER3)
2088 .Case("bdver4", CK_BDVER4)
2089 .Case("x86-64", CK_x86_64)
2090 .Case("geode", CK_Geode)
2091 .Default(CK_Generic);
2092
2093 // Perform any per-CPU checks necessary to determine if this CPU is
2094 // acceptable.
2095 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2096 // invalid without explaining *why*.
2097 switch (CPU) {
2098 case CK_Generic:
2099 // No processor selected!
2100 return false;
2101
2102 case CK_i386:
2103 case CK_i486:
2104 case CK_WinChipC6:
2105 case CK_WinChip2:
2106 case CK_C3:
2107 case CK_i586:
2108 case CK_Pentium:
2109 case CK_PentiumMMX:
2110 case CK_i686:
2111 case CK_PentiumPro:
2112 case CK_Pentium2:
2113 case CK_Pentium3:
2114 case CK_Pentium3M:
2115 case CK_PentiumM:
2116 case CK_Yonah:
2117 case CK_C3_2:
2118 case CK_Pentium4:
2119 case CK_Pentium4M:
2120 case CK_Prescott:
2121 case CK_K6:
2122 case CK_K6_2:
2123 case CK_K6_3:
2124 case CK_Athlon:
2125 case CK_AthlonThunderbird:
2126 case CK_Athlon4:
2127 case CK_AthlonXP:
2128 case CK_AthlonMP:
2129 case CK_Geode:
2130 // Only accept certain architectures when compiling in 32-bit mode.
2131 if (getTriple().getArch() != llvm::Triple::x86)
2132 return false;
2133
2134 // Fallthrough
2135 case CK_Nocona:
2136 case CK_Core2:
2137 case CK_Penryn:
2138 case CK_Bonnell:
2139 case CK_Silvermont:
2140 case CK_Nehalem:
2141 case CK_Westmere:
2142 case CK_SandyBridge:
2143 case CK_IvyBridge:
2144 case CK_Haswell:
2145 case CK_Broadwell:
2146 case CK_Skylake:
2147 case CK_KNL:
2148 case CK_Athlon64:
2149 case CK_Athlon64SSE3:
2150 case CK_AthlonFX:
2151 case CK_K8:
2152 case CK_K8SSE3:
2153 case CK_Opteron:
2154 case CK_OpteronSSE3:
2155 case CK_AMDFAM10:
2156 case CK_BTVER1:
2157 case CK_BTVER2:
2158 case CK_BDVER1:
2159 case CK_BDVER2:
2160 case CK_BDVER3:
2161 case CK_BDVER4:
2162 case CK_x86_64:
2163 return true;
2164 }
2165 llvm_unreachable("Unhandled CPU kind");
2166 }
2167
2168 bool setFPMath(StringRef Name) override;
2169
2170 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2171 // We accept all non-ARM calling conventions
2172 return (CC == CC_X86ThisCall ||
2173 CC == CC_X86FastCall ||
2174 CC == CC_X86StdCall ||
2175 CC == CC_X86VectorCall ||
2176 CC == CC_C ||
2177 CC == CC_X86Pascal ||
2178 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
2179 }
2180
2181 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
2182 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
2183 }
927};
928
929const Builtin::Info PPCTargetInfo::BuiltinInfo[] = {
930#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
931#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
932 ALL_LANGUAGES },
933#include "clang/Basic/BuiltinsPPC.def"
934};
935
936/// handleTargetFeatures - Perform initialization based on the user
937/// configured set of features.
938bool PPCTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
939 DiagnosticsEngine &Diags) {
940 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
941 // Ignore disabled features.
942 if (Features[i][0] == '-')
943 continue;
944
945 StringRef Feature = StringRef(Features[i]).substr(1);
946
947 if (Feature == "vsx") {
948 HasVSX = true;
949 continue;
950 }
951
952 if (Feature == "power8-vector") {
953 HasP8Vector = true;
954 continue;
955 }
956
957 // TODO: Finish this list and add an assert that we've handled them
958 // all.
959 }
960
961 return true;
962}
963
964/// PPCTargetInfo::getTargetDefines - Return a set of the PowerPC-specific
965/// #defines that are not tied to a specific subtarget.
966void PPCTargetInfo::getTargetDefines(const LangOptions &Opts,
967 MacroBuilder &Builder) const {
968 // Target identification.
969 Builder.defineMacro("__ppc__");
970 Builder.defineMacro("__PPC__");
971 Builder.defineMacro("_ARCH_PPC");
972 Builder.defineMacro("__powerpc__");
973 Builder.defineMacro("__POWERPC__");
974 if (PointerWidth == 64) {
975 Builder.defineMacro("_ARCH_PPC64");
976 Builder.defineMacro("__powerpc64__");
977 Builder.defineMacro("__ppc64__");
978 Builder.defineMacro("__PPC64__");
979 }
980
981 // Target properties.
982 if (getTriple().getArch() == llvm::Triple::ppc64le) {
983 Builder.defineMacro("_LITTLE_ENDIAN");
984 } else {
985 if (getTriple().getOS() != llvm::Triple::NetBSD &&
986 getTriple().getOS() != llvm::Triple::OpenBSD)
987 Builder.defineMacro("_BIG_ENDIAN");
988 }
989
990 // ABI options.
991 if (ABI == "elfv1")
992 Builder.defineMacro("_CALL_ELF", "1");
993 if (ABI == "elfv2")
994 Builder.defineMacro("_CALL_ELF", "2");
995
996 // Subtarget options.
997 Builder.defineMacro("__NATURAL_ALIGNMENT__");
998 Builder.defineMacro("__REGISTER_PREFIX__", "");
999
1000 // FIXME: Should be controlled by command line option.
1001 if (LongDoubleWidth == 128)
1002 Builder.defineMacro("__LONG_DOUBLE_128__");
1003
1004 if (Opts.AltiVec) {
1005 Builder.defineMacro("__VEC__", "10206");
1006 Builder.defineMacro("__ALTIVEC__");
1007 }
1008
1009 // CPU identification.
1010 ArchDefineTypes defs = (ArchDefineTypes)llvm::StringSwitch<int>(CPU)
1011 .Case("440", ArchDefineName)
1012 .Case("450", ArchDefineName | ArchDefine440)
1013 .Case("601", ArchDefineName)
1014 .Case("602", ArchDefineName | ArchDefinePpcgr)
1015 .Case("603", ArchDefineName | ArchDefinePpcgr)
1016 .Case("603e", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1017 .Case("603ev", ArchDefineName | ArchDefine603 | ArchDefinePpcgr)
1018 .Case("604", ArchDefineName | ArchDefinePpcgr)
1019 .Case("604e", ArchDefineName | ArchDefine604 | ArchDefinePpcgr)
1020 .Case("620", ArchDefineName | ArchDefinePpcgr)
1021 .Case("630", ArchDefineName | ArchDefinePpcgr)
1022 .Case("7400", ArchDefineName | ArchDefinePpcgr)
1023 .Case("7450", ArchDefineName | ArchDefinePpcgr)
1024 .Case("750", ArchDefineName | ArchDefinePpcgr)
1025 .Case("970", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1026 | ArchDefinePpcsq)
1027 .Case("a2", ArchDefineA2)
1028 .Case("a2q", ArchDefineName | ArchDefineA2 | ArchDefineA2q)
1029 .Case("pwr3", ArchDefinePpcgr)
1030 .Case("pwr4", ArchDefineName | ArchDefinePpcgr | ArchDefinePpcsq)
1031 .Case("pwr5", ArchDefineName | ArchDefinePwr4 | ArchDefinePpcgr
1032 | ArchDefinePpcsq)
1033 .Case("pwr5x", ArchDefineName | ArchDefinePwr5 | ArchDefinePwr4
1034 | ArchDefinePpcgr | ArchDefinePpcsq)
1035 .Case("pwr6", ArchDefineName | ArchDefinePwr5x | ArchDefinePwr5
1036 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1037 .Case("pwr6x", ArchDefineName | ArchDefinePwr6 | ArchDefinePwr5x
1038 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1039 | ArchDefinePpcsq)
1040 .Case("pwr7", ArchDefineName | ArchDefinePwr6x | ArchDefinePwr6
1041 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1042 | ArchDefinePpcgr | ArchDefinePpcsq)
1043 .Case("pwr8", ArchDefineName | ArchDefinePwr7 | ArchDefinePwr6x
1044 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1045 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1046 .Case("power3", ArchDefinePpcgr)
1047 .Case("power4", ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1048 .Case("power5", ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1049 | ArchDefinePpcsq)
1050 .Case("power5x", ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1051 | ArchDefinePpcgr | ArchDefinePpcsq)
1052 .Case("power6", ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1053 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1054 .Case("power6x", ArchDefinePwr6x | ArchDefinePwr6 | ArchDefinePwr5x
1055 | ArchDefinePwr5 | ArchDefinePwr4 | ArchDefinePpcgr
1056 | ArchDefinePpcsq)
1057 .Case("power7", ArchDefinePwr7 | ArchDefinePwr6x | ArchDefinePwr6
1058 | ArchDefinePwr5x | ArchDefinePwr5 | ArchDefinePwr4
1059 | ArchDefinePpcgr | ArchDefinePpcsq)
1060 .Case("power8", ArchDefinePwr8 | ArchDefinePwr7 | ArchDefinePwr6x
1061 | ArchDefinePwr6 | ArchDefinePwr5x | ArchDefinePwr5
1062 | ArchDefinePwr4 | ArchDefinePpcgr | ArchDefinePpcsq)
1063 .Default(ArchDefineNone);
1064
1065 if (defs & ArchDefineName)
1066 Builder.defineMacro(Twine("_ARCH_", StringRef(CPU).upper()));
1067 if (defs & ArchDefinePpcgr)
1068 Builder.defineMacro("_ARCH_PPCGR");
1069 if (defs & ArchDefinePpcsq)
1070 Builder.defineMacro("_ARCH_PPCSQ");
1071 if (defs & ArchDefine440)
1072 Builder.defineMacro("_ARCH_440");
1073 if (defs & ArchDefine603)
1074 Builder.defineMacro("_ARCH_603");
1075 if (defs & ArchDefine604)
1076 Builder.defineMacro("_ARCH_604");
1077 if (defs & ArchDefinePwr4)
1078 Builder.defineMacro("_ARCH_PWR4");
1079 if (defs & ArchDefinePwr5)
1080 Builder.defineMacro("_ARCH_PWR5");
1081 if (defs & ArchDefinePwr5x)
1082 Builder.defineMacro("_ARCH_PWR5X");
1083 if (defs & ArchDefinePwr6)
1084 Builder.defineMacro("_ARCH_PWR6");
1085 if (defs & ArchDefinePwr6x)
1086 Builder.defineMacro("_ARCH_PWR6X");
1087 if (defs & ArchDefinePwr7)
1088 Builder.defineMacro("_ARCH_PWR7");
1089 if (defs & ArchDefinePwr8)
1090 Builder.defineMacro("_ARCH_PWR8");
1091 if (defs & ArchDefineA2)
1092 Builder.defineMacro("_ARCH_A2");
1093 if (defs & ArchDefineA2q) {
1094 Builder.defineMacro("_ARCH_A2Q");
1095 Builder.defineMacro("_ARCH_QP");
1096 }
1097
1098 if (getTriple().getVendor() == llvm::Triple::BGQ) {
1099 Builder.defineMacro("__bg__");
1100 Builder.defineMacro("__THW_BLUEGENE__");
1101 Builder.defineMacro("__bgq__");
1102 Builder.defineMacro("__TOS_BGQ__");
1103 }
1104
1105 if (HasVSX)
1106 Builder.defineMacro("__VSX__");
1107 if (HasP8Vector)
1108 Builder.defineMacro("__POWER8_VECTOR__");
1109
1110 // FIXME: The following are not yet generated here by Clang, but are
1111 // generated by GCC:
1112 //
1113 // _SOFT_FLOAT_
1114 // __RECIP_PRECISION__
1115 // __APPLE_ALTIVEC__
1116 // __RECIP__
1117 // __RECIPF__
1118 // __RSQRTE__
1119 // __RSQRTEF__
1120 // _SOFT_DOUBLE_
1121 // __NO_LWSYNC__
1122 // __HAVE_BSWAP__
1123 // __LONGDOUBLE128
1124 // __CMODEL_MEDIUM__
1125 // __CMODEL_LARGE__
1126 // _CALL_SYSV
1127 // _CALL_DARWIN
1128 // __NO_FPRS__
1129}
1130
1131void PPCTargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
1132 Features["altivec"] = llvm::StringSwitch<bool>(CPU)
1133 .Case("7400", true)
1134 .Case("g4", true)
1135 .Case("7450", true)
1136 .Case("g4+", true)
1137 .Case("970", true)
1138 .Case("g5", true)
1139 .Case("pwr6", true)
1140 .Case("pwr7", true)
1141 .Case("pwr8", true)
1142 .Case("ppc64", true)
1143 .Case("ppc64le", true)
1144 .Default(false);
1145
1146 Features["qpx"] = (CPU == "a2q");
1147
1148 if (!ABI.empty())
1149 Features[ABI] = true;
1150}
1151
1152bool PPCTargetInfo::hasFeature(StringRef Feature) const {
1153 return llvm::StringSwitch<bool>(Feature)
1154 .Case("powerpc", true)
1155 .Case("vsx", HasVSX)
1156 .Case("power8-vector", HasP8Vector)
1157 .Default(false);
1158}
1159
1160const char * const PPCTargetInfo::GCCRegNames[] = {
1161 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
1162 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1163 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
1164 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
1165 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
1166 "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
1167 "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
1168 "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31",
1169 "mq", "lr", "ctr", "ap",
1170 "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7",
1171 "xer",
1172 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7",
1173 "v8", "v9", "v10", "v11", "v12", "v13", "v14", "v15",
1174 "v16", "v17", "v18", "v19", "v20", "v21", "v22", "v23",
1175 "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31",
1176 "vrsave", "vscr",
1177 "spe_acc", "spefscr",
1178 "sfp"
1179};
1180
1181void PPCTargetInfo::getGCCRegNames(const char * const *&Names,
1182 unsigned &NumNames) const {
1183 Names = GCCRegNames;
1184 NumNames = llvm::array_lengthof(GCCRegNames);
1185}
1186
1187const TargetInfo::GCCRegAlias PPCTargetInfo::GCCRegAliases[] = {
1188 // While some of these aliases do map to different registers
1189 // they still share the same register name.
1190 { { "0" }, "r0" },
1191 { { "1"}, "r1" },
1192 { { "2" }, "r2" },
1193 { { "3" }, "r3" },
1194 { { "4" }, "r4" },
1195 { { "5" }, "r5" },
1196 { { "6" }, "r6" },
1197 { { "7" }, "r7" },
1198 { { "8" }, "r8" },
1199 { { "9" }, "r9" },
1200 { { "10" }, "r10" },
1201 { { "11" }, "r11" },
1202 { { "12" }, "r12" },
1203 { { "13" }, "r13" },
1204 { { "14" }, "r14" },
1205 { { "15" }, "r15" },
1206 { { "16" }, "r16" },
1207 { { "17" }, "r17" },
1208 { { "18" }, "r18" },
1209 { { "19" }, "r19" },
1210 { { "20" }, "r20" },
1211 { { "21" }, "r21" },
1212 { { "22" }, "r22" },
1213 { { "23" }, "r23" },
1214 { { "24" }, "r24" },
1215 { { "25" }, "r25" },
1216 { { "26" }, "r26" },
1217 { { "27" }, "r27" },
1218 { { "28" }, "r28" },
1219 { { "29" }, "r29" },
1220 { { "30" }, "r30" },
1221 { { "31" }, "r31" },
1222 { { "fr0" }, "f0" },
1223 { { "fr1" }, "f1" },
1224 { { "fr2" }, "f2" },
1225 { { "fr3" }, "f3" },
1226 { { "fr4" }, "f4" },
1227 { { "fr5" }, "f5" },
1228 { { "fr6" }, "f6" },
1229 { { "fr7" }, "f7" },
1230 { { "fr8" }, "f8" },
1231 { { "fr9" }, "f9" },
1232 { { "fr10" }, "f10" },
1233 { { "fr11" }, "f11" },
1234 { { "fr12" }, "f12" },
1235 { { "fr13" }, "f13" },
1236 { { "fr14" }, "f14" },
1237 { { "fr15" }, "f15" },
1238 { { "fr16" }, "f16" },
1239 { { "fr17" }, "f17" },
1240 { { "fr18" }, "f18" },
1241 { { "fr19" }, "f19" },
1242 { { "fr20" }, "f20" },
1243 { { "fr21" }, "f21" },
1244 { { "fr22" }, "f22" },
1245 { { "fr23" }, "f23" },
1246 { { "fr24" }, "f24" },
1247 { { "fr25" }, "f25" },
1248 { { "fr26" }, "f26" },
1249 { { "fr27" }, "f27" },
1250 { { "fr28" }, "f28" },
1251 { { "fr29" }, "f29" },
1252 { { "fr30" }, "f30" },
1253 { { "fr31" }, "f31" },
1254 { { "cc" }, "cr0" },
1255};
1256
1257void PPCTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
1258 unsigned &NumAliases) const {
1259 Aliases = GCCRegAliases;
1260 NumAliases = llvm::array_lengthof(GCCRegAliases);
1261}
1262} // end anonymous namespace.
1263
1264namespace {
1265class PPC32TargetInfo : public PPCTargetInfo {
1266public:
1267 PPC32TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
1268 DescriptionString = "E-m:e-p:32:32-i64:64-n32";
1269
1270 switch (getTriple().getOS()) {
1271 case llvm::Triple::Linux:
1272 case llvm::Triple::FreeBSD:
1273 case llvm::Triple::NetBSD:
1274 SizeType = UnsignedInt;
1275 PtrDiffType = SignedInt;
1276 IntPtrType = SignedInt;
1277 break;
1278 default:
1279 break;
1280 }
1281
1282 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
1283 LongDoubleWidth = LongDoubleAlign = 64;
1284 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1285 }
1286
1287 // PPC32 supports atomics up to 4 bytes.
1288 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
1289 }
1290
1291 BuiltinVaListKind getBuiltinVaListKind() const override {
1292 // This is the ELF definition, and is overridden by the Darwin sub-target
1293 return TargetInfo::PowerABIBuiltinVaList;
1294 }
1295};
1296} // end anonymous namespace.
1297
1298// Note: ABI differences may eventually require us to have a separate
1299// TargetInfo for little endian.
1300namespace {
1301class PPC64TargetInfo : public PPCTargetInfo {
1302public:
1303 PPC64TargetInfo(const llvm::Triple &Triple) : PPCTargetInfo(Triple) {
1304 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
1305 IntMaxType = SignedLong;
1306 Int64Type = SignedLong;
1307
1308 if ((Triple.getArch() == llvm::Triple::ppc64le)) {
1309 DescriptionString = "e-m:e-i64:64-n32:64";
1310 ABI = "elfv2";
1311 } else {
1312 DescriptionString = "E-m:e-i64:64-n32:64";
1313 ABI = "elfv1";
1314 }
1315
1316 switch (getTriple().getOS()) {
1317 case llvm::Triple::FreeBSD:
1318 LongDoubleWidth = LongDoubleAlign = 64;
1319 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
1320 break;
1321 case llvm::Triple::NetBSD:
1322 IntMaxType = SignedLongLong;
1323 Int64Type = SignedLongLong;
1324 break;
1325 default:
1326 break;
1327 }
1328
1329 // PPC64 supports atomics up to 8 bytes.
1330 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
1331 }
1332 BuiltinVaListKind getBuiltinVaListKind() const override {
1333 return TargetInfo::CharPtrBuiltinVaList;
1334 }
1335 // PPC64 Linux-specifc ABI options.
1336 bool setABI(const std::string &Name) override {
1337 if (Name == "elfv1" || Name == "elfv2") {
1338 ABI = Name;
1339 return true;
1340 }
1341 return false;
1342 }
1343};
1344} // end anonymous namespace.
1345
1346
1347namespace {
1348class DarwinPPC32TargetInfo :
1349 public DarwinTargetInfo<PPC32TargetInfo> {
1350public:
1351 DarwinPPC32TargetInfo(const llvm::Triple &Triple)
1352 : DarwinTargetInfo<PPC32TargetInfo>(Triple) {
1353 HasAlignMac68kSupport = true;
1354 BoolWidth = BoolAlign = 32; //XXX support -mone-byte-bool?
1355 PtrDiffType = SignedInt; // for http://llvm.org/bugs/show_bug.cgi?id=15726
1356 LongLongAlign = 32;
1357 SuitableAlign = 128;
1358 DescriptionString = "E-m:o-p:32:32-f64:32:64-n32";
1359 }
1360 BuiltinVaListKind getBuiltinVaListKind() const override {
1361 return TargetInfo::CharPtrBuiltinVaList;
1362 }
1363};
1364
1365class DarwinPPC64TargetInfo :
1366 public DarwinTargetInfo<PPC64TargetInfo> {
1367public:
1368 DarwinPPC64TargetInfo(const llvm::Triple &Triple)
1369 : DarwinTargetInfo<PPC64TargetInfo>(Triple) {
1370 HasAlignMac68kSupport = true;
1371 SuitableAlign = 128;
1372 DescriptionString = "E-m:o-i64:64-n32:64";
1373 }
1374};
1375} // end anonymous namespace.
1376
1377namespace {
1378 static const unsigned NVPTXAddrSpaceMap[] = {
1379 1, // opencl_global
1380 3, // opencl_local
1381 4, // opencl_constant
1382 // FIXME: generic has to be added to the target
1383 0, // opencl_generic
1384 1, // cuda_device
1385 4, // cuda_constant
1386 3, // cuda_shared
1387 };
1388 class NVPTXTargetInfo : public TargetInfo {
1389 static const char * const GCCRegNames[];
1390 static const Builtin::Info BuiltinInfo[];
1391
1392 // The GPU profiles supported by the NVPTX backend
1393 enum GPUKind {
1394 GK_NONE,
1395 GK_SM20,
1396 GK_SM21,
1397 GK_SM30,
1398 GK_SM35,
1399 } GPU;
1400
1401 public:
1402 NVPTXTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
1403 BigEndian = false;
1404 TLSSupported = false;
1405 LongWidth = LongAlign = 64;
1406 AddrSpaceMap = &NVPTXAddrSpaceMap;
1407 UseAddrSpaceMapMangling = true;
1408 // Define available target features
1409 // These must be defined in sorted order!
1410 NoAsmVariants = true;
1411 // Set the default GPU to sm20
1412 GPU = GK_SM20;
1413 }
1414 void getTargetDefines(const LangOptions &Opts,
1415 MacroBuilder &Builder) const override {
1416 Builder.defineMacro("__PTX__");
1417 Builder.defineMacro("__NVPTX__");
1418 if (Opts.CUDAIsDevice) {
1419 // Set __CUDA_ARCH__ for the GPU specified.
1420 std::string CUDAArchCode;
1421 switch (GPU) {
1422 case GK_SM20:
1423 CUDAArchCode = "200";
1424 break;
1425 case GK_SM21:
1426 CUDAArchCode = "210";
1427 break;
1428 case GK_SM30:
1429 CUDAArchCode = "300";
1430 break;
1431 case GK_SM35:
1432 CUDAArchCode = "350";
1433 break;
1434 default:
1435 llvm_unreachable("Unhandled target CPU");
1436 }
1437 Builder.defineMacro("__CUDA_ARCH__", CUDAArchCode);
1438 }
1439 }
1440 void getTargetBuiltins(const Builtin::Info *&Records,
1441 unsigned &NumRecords) const override {
1442 Records = BuiltinInfo;
1443 NumRecords = clang::NVPTX::LastTSBuiltin-Builtin::FirstTSBuiltin;
1444 }
1445 bool hasFeature(StringRef Feature) const override {
1446 return Feature == "ptx" || Feature == "nvptx";
1447 }
1448
1449 void getGCCRegNames(const char * const *&Names,
1450 unsigned &NumNames) const override;
1451 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1452 unsigned &NumAliases) const override {
1453 // No aliases.
1454 Aliases = nullptr;
1455 NumAliases = 0;
1456 }
1457 bool
1458 validateAsmConstraint(const char *&Name,
1459 TargetInfo::ConstraintInfo &Info) const override {
1460 switch (*Name) {
1461 default: return false;
1462 case 'c':
1463 case 'h':
1464 case 'r':
1465 case 'l':
1466 case 'f':
1467 case 'd':
1468 Info.setAllowsRegister();
1469 return true;
1470 }
1471 }
1472 const char *getClobbers() const override {
1473 // FIXME: Is this really right?
1474 return "";
1475 }
1476 BuiltinVaListKind getBuiltinVaListKind() const override {
1477 // FIXME: implement
1478 return TargetInfo::CharPtrBuiltinVaList;
1479 }
1480 bool setCPU(const std::string &Name) override {
1481 GPU = llvm::StringSwitch<GPUKind>(Name)
1482 .Case("sm_20", GK_SM20)
1483 .Case("sm_21", GK_SM21)
1484 .Case("sm_30", GK_SM30)
1485 .Case("sm_35", GK_SM35)
1486 .Default(GK_NONE);
1487
1488 return GPU != GK_NONE;
1489 }
1490 };
1491
1492 const Builtin::Info NVPTXTargetInfo::BuiltinInfo[] = {
1493#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1494#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1495 ALL_LANGUAGES },
1496#include "clang/Basic/BuiltinsNVPTX.def"
1497 };
1498
1499 const char * const NVPTXTargetInfo::GCCRegNames[] = {
1500 "r0"
1501 };
1502
1503 void NVPTXTargetInfo::getGCCRegNames(const char * const *&Names,
1504 unsigned &NumNames) const {
1505 Names = GCCRegNames;
1506 NumNames = llvm::array_lengthof(GCCRegNames);
1507 }
1508
1509 class NVPTX32TargetInfo : public NVPTXTargetInfo {
1510 public:
1511 NVPTX32TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1512 PointerWidth = PointerAlign = 32;
1513 SizeType = PtrDiffType = TargetInfo::UnsignedInt;
1514 IntPtrType = TargetInfo::SignedInt;
1515 DescriptionString = "e-p:32:32-i64:64-v16:16-v32:32-n16:32:64";
1516 }
1517 };
1518
1519 class NVPTX64TargetInfo : public NVPTXTargetInfo {
1520 public:
1521 NVPTX64TargetInfo(const llvm::Triple &Triple) : NVPTXTargetInfo(Triple) {
1522 PointerWidth = PointerAlign = 64;
1523 SizeType = PtrDiffType = TargetInfo::UnsignedLongLong;
1524 IntPtrType = TargetInfo::SignedLongLong;
1525 DescriptionString = "e-i64:64-v16:16-v32:32-n16:32:64";
1526 }
1527 };
1528}
1529
1530namespace {
1531
1532static const unsigned R600AddrSpaceMap[] = {
1533 1, // opencl_global
1534 3, // opencl_local
1535 2, // opencl_constant
1536 4, // opencl_generic
1537 1, // cuda_device
1538 2, // cuda_constant
1539 3 // cuda_shared
1540};
1541
1542// If you edit the description strings, make sure you update
1543// getPointerWidthV().
1544
1545static const char *DescriptionStringR600 =
1546 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1547 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
1548
1549static const char *DescriptionStringR600DoubleOps =
1550 "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1551 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
1552
1553static const char *DescriptionStringSI =
1554 "e-p:32:32-p1:64:64-p2:64:64-p3:32:32-p4:64:64-p5:32:32-p24:64:64"
1555 "-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128"
1556 "-v192:256-v256:256-v512:512-v1024:1024-v2048:2048-n32:64";
1557
1558class R600TargetInfo : public TargetInfo {
1559 static const Builtin::Info BuiltinInfo[];
1560
1561 /// \brief The GPU profiles supported by the R600 target.
1562 enum GPUKind {
1563 GK_NONE,
1564 GK_R600,
1565 GK_R600_DOUBLE_OPS,
1566 GK_R700,
1567 GK_R700_DOUBLE_OPS,
1568 GK_EVERGREEN,
1569 GK_EVERGREEN_DOUBLE_OPS,
1570 GK_NORTHERN_ISLANDS,
1571 GK_CAYMAN,
1572 GK_SOUTHERN_ISLANDS,
1573 GK_SEA_ISLANDS
1574 } GPU;
1575
1576public:
1577 R600TargetInfo(const llvm::Triple &Triple)
1578 : TargetInfo(Triple), GPU(GK_R600) {
1579 DescriptionString = DescriptionStringR600;
1580 AddrSpaceMap = &R600AddrSpaceMap;
1581 UseAddrSpaceMapMangling = true;
1582 }
1583
1584 uint64_t getPointerWidthV(unsigned AddrSpace) const override {
1585 if (GPU <= GK_CAYMAN)
1586 return 32;
1587
1588 switch(AddrSpace) {
1589 default:
1590 return 64;
1591 case 0:
1592 case 3:
1593 case 5:
1594 return 32;
1595 }
1596 }
1597
1598 const char * getClobbers() const override {
1599 return "";
1600 }
1601
1602 void getGCCRegNames(const char * const *&Names,
1603 unsigned &numNames) const override {
1604 Names = nullptr;
1605 numNames = 0;
1606 }
1607
1608 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1609 unsigned &NumAliases) const override {
1610 Aliases = nullptr;
1611 NumAliases = 0;
1612 }
1613
1614 bool validateAsmConstraint(const char *&Name,
1615 TargetInfo::ConstraintInfo &info) const override {
1616 return true;
1617 }
1618
1619 void getTargetBuiltins(const Builtin::Info *&Records,
1620 unsigned &NumRecords) const override {
1621 Records = BuiltinInfo;
1622 NumRecords = clang::R600::LastTSBuiltin - Builtin::FirstTSBuiltin;
1623 }
1624
1625 void getTargetDefines(const LangOptions &Opts,
1626 MacroBuilder &Builder) const override {
1627 Builder.defineMacro("__R600__");
1628 }
1629
1630 BuiltinVaListKind getBuiltinVaListKind() const override {
1631 return TargetInfo::CharPtrBuiltinVaList;
1632 }
1633
1634 bool setCPU(const std::string &Name) override {
1635 GPU = llvm::StringSwitch<GPUKind>(Name)
1636 .Case("r600" , GK_R600)
1637 .Case("rv610", GK_R600)
1638 .Case("rv620", GK_R600)
1639 .Case("rv630", GK_R600)
1640 .Case("rv635", GK_R600)
1641 .Case("rs780", GK_R600)
1642 .Case("rs880", GK_R600)
1643 .Case("rv670", GK_R600_DOUBLE_OPS)
1644 .Case("rv710", GK_R700)
1645 .Case("rv730", GK_R700)
1646 .Case("rv740", GK_R700_DOUBLE_OPS)
1647 .Case("rv770", GK_R700_DOUBLE_OPS)
1648 .Case("palm", GK_EVERGREEN)
1649 .Case("cedar", GK_EVERGREEN)
1650 .Case("sumo", GK_EVERGREEN)
1651 .Case("sumo2", GK_EVERGREEN)
1652 .Case("redwood", GK_EVERGREEN)
1653 .Case("juniper", GK_EVERGREEN)
1654 .Case("hemlock", GK_EVERGREEN_DOUBLE_OPS)
1655 .Case("cypress", GK_EVERGREEN_DOUBLE_OPS)
1656 .Case("barts", GK_NORTHERN_ISLANDS)
1657 .Case("turks", GK_NORTHERN_ISLANDS)
1658 .Case("caicos", GK_NORTHERN_ISLANDS)
1659 .Case("cayman", GK_CAYMAN)
1660 .Case("aruba", GK_CAYMAN)
1661 .Case("tahiti", GK_SOUTHERN_ISLANDS)
1662 .Case("pitcairn", GK_SOUTHERN_ISLANDS)
1663 .Case("verde", GK_SOUTHERN_ISLANDS)
1664 .Case("oland", GK_SOUTHERN_ISLANDS)
1665 .Case("hainan", GK_SOUTHERN_ISLANDS)
1666 .Case("bonaire", GK_SEA_ISLANDS)
1667 .Case("kabini", GK_SEA_ISLANDS)
1668 .Case("kaveri", GK_SEA_ISLANDS)
1669 .Case("hawaii", GK_SEA_ISLANDS)
1670 .Case("mullins", GK_SEA_ISLANDS)
1671 .Default(GK_NONE);
1672
1673 if (GPU == GK_NONE) {
1674 return false;
1675 }
1676
1677 // Set the correct data layout
1678 switch (GPU) {
1679 case GK_NONE:
1680 case GK_R600:
1681 case GK_R700:
1682 case GK_EVERGREEN:
1683 case GK_NORTHERN_ISLANDS:
1684 DescriptionString = DescriptionStringR600;
1685 break;
1686 case GK_R600_DOUBLE_OPS:
1687 case GK_R700_DOUBLE_OPS:
1688 case GK_EVERGREEN_DOUBLE_OPS:
1689 case GK_CAYMAN:
1690 DescriptionString = DescriptionStringR600DoubleOps;
1691 break;
1692 case GK_SOUTHERN_ISLANDS:
1693 case GK_SEA_ISLANDS:
1694 DescriptionString = DescriptionStringSI;
1695 break;
1696 }
1697
1698 return true;
1699 }
1700};
1701
1702const Builtin::Info R600TargetInfo::BuiltinInfo[] = {
1703#define BUILTIN(ID, TYPE, ATTRS) \
1704 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1705#include "clang/Basic/BuiltinsR600.def"
1706};
1707
1708} // end anonymous namespace
1709
1710namespace {
1711// Namespace for x86 abstract base class
1712const Builtin::Info BuiltinInfo[] = {
1713#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
1714#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
1715 ALL_LANGUAGES },
1716#include "clang/Basic/BuiltinsX86.def"
1717};
1718
1719static const char* const GCCRegNames[] = {
1720 "ax", "dx", "cx", "bx", "si", "di", "bp", "sp",
1721 "st", "st(1)", "st(2)", "st(3)", "st(4)", "st(5)", "st(6)", "st(7)",
1722 "argp", "flags", "fpcr", "fpsr", "dirflag", "frame",
1723 "xmm0", "xmm1", "xmm2", "xmm3", "xmm4", "xmm5", "xmm6", "xmm7",
1724 "mm0", "mm1", "mm2", "mm3", "mm4", "mm5", "mm6", "mm7",
1725 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
1726 "xmm8", "xmm9", "xmm10", "xmm11", "xmm12", "xmm13", "xmm14", "xmm15",
1727 "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7",
1728 "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15",
1729};
1730
1731const TargetInfo::AddlRegName AddlRegNames[] = {
1732 { { "al", "ah", "eax", "rax" }, 0 },
1733 { { "bl", "bh", "ebx", "rbx" }, 3 },
1734 { { "cl", "ch", "ecx", "rcx" }, 2 },
1735 { { "dl", "dh", "edx", "rdx" }, 1 },
1736 { { "esi", "rsi" }, 4 },
1737 { { "edi", "rdi" }, 5 },
1738 { { "esp", "rsp" }, 7 },
1739 { { "ebp", "rbp" }, 6 },
1740};
1741
1742// X86 target abstract base class; x86-32 and x86-64 are very close, so
1743// most of the implementation can be shared.
1744class X86TargetInfo : public TargetInfo {
1745 enum X86SSEEnum {
1746 NoSSE, SSE1, SSE2, SSE3, SSSE3, SSE41, SSE42, AVX, AVX2, AVX512F
1747 } SSELevel;
1748 enum MMX3DNowEnum {
1749 NoMMX3DNow, MMX, AMD3DNow, AMD3DNowAthlon
1750 } MMX3DNowLevel;
1751 enum XOPEnum {
1752 NoXOP,
1753 SSE4A,
1754 FMA4,
1755 XOP
1756 } XOPLevel;
1757
1758 bool HasAES;
1759 bool HasPCLMUL;
1760 bool HasLZCNT;
1761 bool HasRDRND;
1762 bool HasFSGSBASE;
1763 bool HasBMI;
1764 bool HasBMI2;
1765 bool HasPOPCNT;
1766 bool HasRTM;
1767 bool HasPRFCHW;
1768 bool HasRDSEED;
1769 bool HasADX;
1770 bool HasTBM;
1771 bool HasFMA;
1772 bool HasF16C;
1773 bool HasAVX512CD, HasAVX512ER, HasAVX512PF, HasAVX512DQ, HasAVX512BW,
1774 HasAVX512VL;
1775 bool HasSHA;
1776 bool HasCX16;
1777
1778 /// \brief Enumeration of all of the X86 CPUs supported by Clang.
1779 ///
1780 /// Each enumeration represents a particular CPU supported by Clang. These
1781 /// loosely correspond to the options passed to '-march' or '-mtune' flags.
1782 enum CPUKind {
1783 CK_Generic,
1784
1785 /// \name i386
1786 /// i386-generation processors.
1787 //@{
1788 CK_i386,
1789 //@}
1790
1791 /// \name i486
1792 /// i486-generation processors.
1793 //@{
1794 CK_i486,
1795 CK_WinChipC6,
1796 CK_WinChip2,
1797 CK_C3,
1798 //@}
1799
1800 /// \name i586
1801 /// i586-generation processors, P5 microarchitecture based.
1802 //@{
1803 CK_i586,
1804 CK_Pentium,
1805 CK_PentiumMMX,
1806 //@}
1807
1808 /// \name i686
1809 /// i686-generation processors, P6 / Pentium M microarchitecture based.
1810 //@{
1811 CK_i686,
1812 CK_PentiumPro,
1813 CK_Pentium2,
1814 CK_Pentium3,
1815 CK_Pentium3M,
1816 CK_PentiumM,
1817 CK_C3_2,
1818
1819 /// This enumerator is a bit odd, as GCC no longer accepts -march=yonah.
1820 /// Clang however has some logic to suport this.
1821 // FIXME: Warn, deprecate, and potentially remove this.
1822 CK_Yonah,
1823 //@}
1824
1825 /// \name Netburst
1826 /// Netburst microarchitecture based processors.
1827 //@{
1828 CK_Pentium4,
1829 CK_Pentium4M,
1830 CK_Prescott,
1831 CK_Nocona,
1832 //@}
1833
1834 /// \name Core
1835 /// Core microarchitecture based processors.
1836 //@{
1837 CK_Core2,
1838
1839 /// This enumerator, like \see CK_Yonah, is a bit odd. It is another
1840 /// codename which GCC no longer accepts as an option to -march, but Clang
1841 /// has some logic for recognizing it.
1842 // FIXME: Warn, deprecate, and potentially remove this.
1843 CK_Penryn,
1844 //@}
1845
1846 /// \name Atom
1847 /// Atom processors
1848 //@{
1849 CK_Bonnell,
1850 CK_Silvermont,
1851 //@}
1852
1853 /// \name Nehalem
1854 /// Nehalem microarchitecture based processors.
1855 CK_Nehalem,
1856
1857 /// \name Westmere
1858 /// Westmere microarchitecture based processors.
1859 CK_Westmere,
1860
1861 /// \name Sandy Bridge
1862 /// Sandy Bridge microarchitecture based processors.
1863 CK_SandyBridge,
1864
1865 /// \name Ivy Bridge
1866 /// Ivy Bridge microarchitecture based processors.
1867 CK_IvyBridge,
1868
1869 /// \name Haswell
1870 /// Haswell microarchitecture based processors.
1871 CK_Haswell,
1872
1873 /// \name Broadwell
1874 /// Broadwell microarchitecture based processors.
1875 CK_Broadwell,
1876
1877 /// \name Skylake
1878 /// Skylake microarchitecture based processors.
1879 CK_Skylake,
1880
1881 /// \name Knights Landing
1882 /// Knights Landing processor.
1883 CK_KNL,
1884
1885 /// \name K6
1886 /// K6 architecture processors.
1887 //@{
1888 CK_K6,
1889 CK_K6_2,
1890 CK_K6_3,
1891 //@}
1892
1893 /// \name K7
1894 /// K7 architecture processors.
1895 //@{
1896 CK_Athlon,
1897 CK_AthlonThunderbird,
1898 CK_Athlon4,
1899 CK_AthlonXP,
1900 CK_AthlonMP,
1901 //@}
1902
1903 /// \name K8
1904 /// K8 architecture processors.
1905 //@{
1906 CK_Athlon64,
1907 CK_Athlon64SSE3,
1908 CK_AthlonFX,
1909 CK_K8,
1910 CK_K8SSE3,
1911 CK_Opteron,
1912 CK_OpteronSSE3,
1913 CK_AMDFAM10,
1914 //@}
1915
1916 /// \name Bobcat
1917 /// Bobcat architecture processors.
1918 //@{
1919 CK_BTVER1,
1920 CK_BTVER2,
1921 //@}
1922
1923 /// \name Bulldozer
1924 /// Bulldozer architecture processors.
1925 //@{
1926 CK_BDVER1,
1927 CK_BDVER2,
1928 CK_BDVER3,
1929 CK_BDVER4,
1930 //@}
1931
1932 /// This specification is deprecated and will be removed in the future.
1933 /// Users should prefer \see CK_K8.
1934 // FIXME: Warn on this when the CPU is set to it.
1935 //@{
1936 CK_x86_64,
1937 //@}
1938
1939 /// \name Geode
1940 /// Geode processors.
1941 //@{
1942 CK_Geode
1943 //@}
1944 } CPU;
1945
1946 enum FPMathKind {
1947 FP_Default,
1948 FP_SSE,
1949 FP_387
1950 } FPMath;
1951
1952public:
1953 X86TargetInfo(const llvm::Triple &Triple)
1954 : TargetInfo(Triple), SSELevel(NoSSE), MMX3DNowLevel(NoMMX3DNow),
1955 XOPLevel(NoXOP), HasAES(false), HasPCLMUL(false), HasLZCNT(false),
1956 HasRDRND(false), HasFSGSBASE(false), HasBMI(false), HasBMI2(false),
1957 HasPOPCNT(false), HasRTM(false), HasPRFCHW(false), HasRDSEED(false),
1958 HasADX(false), HasTBM(false), HasFMA(false), HasF16C(false),
1959 HasAVX512CD(false), HasAVX512ER(false), HasAVX512PF(false),
1960 HasAVX512DQ(false), HasAVX512BW(false), HasAVX512VL(false),
1961 HasSHA(false), HasCX16(false), CPU(CK_Generic), FPMath(FP_Default) {
1962 BigEndian = false;
1963 LongDoubleFormat = &llvm::APFloat::x87DoubleExtended;
1964 }
1965 unsigned getFloatEvalMethod() const override {
1966 // X87 evaluates with 80 bits "long double" precision.
1967 return SSELevel == NoSSE ? 2 : 0;
1968 }
1969 void getTargetBuiltins(const Builtin::Info *&Records,
1970 unsigned &NumRecords) const override {
1971 Records = BuiltinInfo;
1972 NumRecords = clang::X86::LastTSBuiltin-Builtin::FirstTSBuiltin;
1973 }
1974 void getGCCRegNames(const char * const *&Names,
1975 unsigned &NumNames) const override {
1976 Names = GCCRegNames;
1977 NumNames = llvm::array_lengthof(GCCRegNames);
1978 }
1979 void getGCCRegAliases(const GCCRegAlias *&Aliases,
1980 unsigned &NumAliases) const override {
1981 Aliases = nullptr;
1982 NumAliases = 0;
1983 }
1984 void getGCCAddlRegNames(const AddlRegName *&Names,
1985 unsigned &NumNames) const override {
1986 Names = AddlRegNames;
1987 NumNames = llvm::array_lengthof(AddlRegNames);
1988 }
1989 bool validateAsmConstraint(const char *&Name,
1990 TargetInfo::ConstraintInfo &info) const override;
1991
1992 bool validateOutputSize(StringRef Constraint, unsigned Size) const override;
1993
1994 bool validateInputSize(StringRef Constraint, unsigned Size) const override;
1995
1996 virtual bool validateOperandSize(StringRef Constraint, unsigned Size) const;
1997
1998 std::string convertConstraint(const char *&Constraint) const override;
1999 const char *getClobbers() const override {
2000 return "~{dirflag},~{fpsr},~{flags}";
2001 }
2002 void getTargetDefines(const LangOptions &Opts,
2003 MacroBuilder &Builder) const override;
2004 static void setSSELevel(llvm::StringMap<bool> &Features, X86SSEEnum Level,
2005 bool Enabled);
2006 static void setMMXLevel(llvm::StringMap<bool> &Features, MMX3DNowEnum Level,
2007 bool Enabled);
2008 static void setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2009 bool Enabled);
2010 void setFeatureEnabled(llvm::StringMap<bool> &Features,
2011 StringRef Name, bool Enabled) const override {
2012 setFeatureEnabledImpl(Features, Name, Enabled);
2013 }
2014 // This exists purely to cut down on the number of virtual calls in
2015 // getDefaultFeatures which calls this repeatedly.
2016 static void setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2017 StringRef Name, bool Enabled);
2018 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override;
2019 bool hasFeature(StringRef Feature) const override;
2020 bool handleTargetFeatures(std::vector<std::string> &Features,
2021 DiagnosticsEngine &Diags) override;
2022 StringRef getABI() const override {
2023 if (getTriple().getArch() == llvm::Triple::x86_64 && SSELevel >= AVX)
2024 return "avx";
2025 else if (getTriple().getArch() == llvm::Triple::x86 &&
2026 MMX3DNowLevel == NoMMX3DNow)
2027 return "no-mmx";
2028 return "";
2029 }
2030 bool setCPU(const std::string &Name) override {
2031 CPU = llvm::StringSwitch<CPUKind>(Name)
2032 .Case("i386", CK_i386)
2033 .Case("i486", CK_i486)
2034 .Case("winchip-c6", CK_WinChipC6)
2035 .Case("winchip2", CK_WinChip2)
2036 .Case("c3", CK_C3)
2037 .Case("i586", CK_i586)
2038 .Case("pentium", CK_Pentium)
2039 .Case("pentium-mmx", CK_PentiumMMX)
2040 .Case("i686", CK_i686)
2041 .Case("pentiumpro", CK_PentiumPro)
2042 .Case("pentium2", CK_Pentium2)
2043 .Case("pentium3", CK_Pentium3)
2044 .Case("pentium3m", CK_Pentium3M)
2045 .Case("pentium-m", CK_PentiumM)
2046 .Case("c3-2", CK_C3_2)
2047 .Case("yonah", CK_Yonah)
2048 .Case("pentium4", CK_Pentium4)
2049 .Case("pentium4m", CK_Pentium4M)
2050 .Case("prescott", CK_Prescott)
2051 .Case("nocona", CK_Nocona)
2052 .Case("core2", CK_Core2)
2053 .Case("penryn", CK_Penryn)
2054 .Case("bonnell", CK_Bonnell)
2055 .Case("atom", CK_Bonnell) // Legacy name.
2056 .Case("silvermont", CK_Silvermont)
2057 .Case("slm", CK_Silvermont) // Legacy name.
2058 .Case("nehalem", CK_Nehalem)
2059 .Case("corei7", CK_Nehalem) // Legacy name.
2060 .Case("westmere", CK_Westmere)
2061 .Case("sandybridge", CK_SandyBridge)
2062 .Case("corei7-avx", CK_SandyBridge) // Legacy name.
2063 .Case("ivybridge", CK_IvyBridge)
2064 .Case("core-avx-i", CK_IvyBridge) // Legacy name.
2065 .Case("haswell", CK_Haswell)
2066 .Case("core-avx2", CK_Haswell) // Legacy name.
2067 .Case("broadwell", CK_Broadwell)
2068 .Case("skylake", CK_Skylake)
2069 .Case("skx", CK_Skylake) // Legacy name.
2070 .Case("knl", CK_KNL)
2071 .Case("k6", CK_K6)
2072 .Case("k6-2", CK_K6_2)
2073 .Case("k6-3", CK_K6_3)
2074 .Case("athlon", CK_Athlon)
2075 .Case("athlon-tbird", CK_AthlonThunderbird)
2076 .Case("athlon-4", CK_Athlon4)
2077 .Case("athlon-xp", CK_AthlonXP)
2078 .Case("athlon-mp", CK_AthlonMP)
2079 .Case("athlon64", CK_Athlon64)
2080 .Case("athlon64-sse3", CK_Athlon64SSE3)
2081 .Case("athlon-fx", CK_AthlonFX)
2082 .Case("k8", CK_K8)
2083 .Case("k8-sse3", CK_K8SSE3)
2084 .Case("opteron", CK_Opteron)
2085 .Case("opteron-sse3", CK_OpteronSSE3)
2086 .Case("barcelona", CK_AMDFAM10)
2087 .Case("amdfam10", CK_AMDFAM10)
2088 .Case("btver1", CK_BTVER1)
2089 .Case("btver2", CK_BTVER2)
2090 .Case("bdver1", CK_BDVER1)
2091 .Case("bdver2", CK_BDVER2)
2092 .Case("bdver3", CK_BDVER3)
2093 .Case("bdver4", CK_BDVER4)
2094 .Case("x86-64", CK_x86_64)
2095 .Case("geode", CK_Geode)
2096 .Default(CK_Generic);
2097
2098 // Perform any per-CPU checks necessary to determine if this CPU is
2099 // acceptable.
2100 // FIXME: This results in terrible diagnostics. Clang just says the CPU is
2101 // invalid without explaining *why*.
2102 switch (CPU) {
2103 case CK_Generic:
2104 // No processor selected!
2105 return false;
2106
2107 case CK_i386:
2108 case CK_i486:
2109 case CK_WinChipC6:
2110 case CK_WinChip2:
2111 case CK_C3:
2112 case CK_i586:
2113 case CK_Pentium:
2114 case CK_PentiumMMX:
2115 case CK_i686:
2116 case CK_PentiumPro:
2117 case CK_Pentium2:
2118 case CK_Pentium3:
2119 case CK_Pentium3M:
2120 case CK_PentiumM:
2121 case CK_Yonah:
2122 case CK_C3_2:
2123 case CK_Pentium4:
2124 case CK_Pentium4M:
2125 case CK_Prescott:
2126 case CK_K6:
2127 case CK_K6_2:
2128 case CK_K6_3:
2129 case CK_Athlon:
2130 case CK_AthlonThunderbird:
2131 case CK_Athlon4:
2132 case CK_AthlonXP:
2133 case CK_AthlonMP:
2134 case CK_Geode:
2135 // Only accept certain architectures when compiling in 32-bit mode.
2136 if (getTriple().getArch() != llvm::Triple::x86)
2137 return false;
2138
2139 // Fallthrough
2140 case CK_Nocona:
2141 case CK_Core2:
2142 case CK_Penryn:
2143 case CK_Bonnell:
2144 case CK_Silvermont:
2145 case CK_Nehalem:
2146 case CK_Westmere:
2147 case CK_SandyBridge:
2148 case CK_IvyBridge:
2149 case CK_Haswell:
2150 case CK_Broadwell:
2151 case CK_Skylake:
2152 case CK_KNL:
2153 case CK_Athlon64:
2154 case CK_Athlon64SSE3:
2155 case CK_AthlonFX:
2156 case CK_K8:
2157 case CK_K8SSE3:
2158 case CK_Opteron:
2159 case CK_OpteronSSE3:
2160 case CK_AMDFAM10:
2161 case CK_BTVER1:
2162 case CK_BTVER2:
2163 case CK_BDVER1:
2164 case CK_BDVER2:
2165 case CK_BDVER3:
2166 case CK_BDVER4:
2167 case CK_x86_64:
2168 return true;
2169 }
2170 llvm_unreachable("Unhandled CPU kind");
2171 }
2172
2173 bool setFPMath(StringRef Name) override;
2174
2175 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
2176 // We accept all non-ARM calling conventions
2177 return (CC == CC_X86ThisCall ||
2178 CC == CC_X86FastCall ||
2179 CC == CC_X86StdCall ||
2180 CC == CC_X86VectorCall ||
2181 CC == CC_C ||
2182 CC == CC_X86Pascal ||
2183 CC == CC_IntelOclBicc) ? CCCR_OK : CCCR_Warning;
2184 }
2185
2186 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
2187 return MT == CCMT_Member ? CC_X86ThisCall : CC_C;
2188 }
2189
2190 bool hasSjLjLowering() const override {
2191 return true;
2192 }
2184};
2185
2186bool X86TargetInfo::setFPMath(StringRef Name) {
2187 if (Name == "387") {
2188 FPMath = FP_387;
2189 return true;
2190 }
2191 if (Name == "sse") {
2192 FPMath = FP_SSE;
2193 return true;
2194 }
2195 return false;
2196}
2197
2198void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
2199 // FIXME: This *really* should not be here.
2200
2201 // X86_64 always has SSE2.
2202 if (getTriple().getArch() == llvm::Triple::x86_64)
2203 setFeatureEnabledImpl(Features, "sse2", true);
2204
2205 switch (CPU) {
2206 case CK_Generic:
2207 case CK_i386:
2208 case CK_i486:
2209 case CK_i586:
2210 case CK_Pentium:
2211 case CK_i686:
2212 case CK_PentiumPro:
2213 break;
2214 case CK_PentiumMMX:
2215 case CK_Pentium2:
2216 case CK_K6:
2217 case CK_WinChipC6:
2218 setFeatureEnabledImpl(Features, "mmx", true);
2219 break;
2220 case CK_Pentium3:
2221 case CK_Pentium3M:
2222 case CK_C3_2:
2223 setFeatureEnabledImpl(Features, "sse", true);
2224 break;
2225 case CK_PentiumM:
2226 case CK_Pentium4:
2227 case CK_Pentium4M:
2228 case CK_x86_64:
2229 setFeatureEnabledImpl(Features, "sse2", true);
2230 break;
2231 case CK_Yonah:
2232 case CK_Prescott:
2233 case CK_Nocona:
2234 setFeatureEnabledImpl(Features, "sse3", true);
2235 setFeatureEnabledImpl(Features, "cx16", true);
2236 break;
2237 case CK_Core2:
2238 case CK_Bonnell:
2239 setFeatureEnabledImpl(Features, "ssse3", true);
2240 setFeatureEnabledImpl(Features, "cx16", true);
2241 break;
2242 case CK_Penryn:
2243 setFeatureEnabledImpl(Features, "sse4.1", true);
2244 setFeatureEnabledImpl(Features, "cx16", true);
2245 break;
2246 case CK_Skylake:
2247 setFeatureEnabledImpl(Features, "avx512f", true);
2248 setFeatureEnabledImpl(Features, "avx512cd", true);
2249 setFeatureEnabledImpl(Features, "avx512dq", true);
2250 setFeatureEnabledImpl(Features, "avx512bw", true);
2251 setFeatureEnabledImpl(Features, "avx512vl", true);
2252 // FALLTHROUGH
2253 case CK_Broadwell:
2254 setFeatureEnabledImpl(Features, "rdseed", true);
2255 setFeatureEnabledImpl(Features, "adx", true);
2256 // FALLTHROUGH
2257 case CK_Haswell:
2258 setFeatureEnabledImpl(Features, "avx2", true);
2259 setFeatureEnabledImpl(Features, "lzcnt", true);
2260 setFeatureEnabledImpl(Features, "bmi", true);
2261 setFeatureEnabledImpl(Features, "bmi2", true);
2262 setFeatureEnabledImpl(Features, "rtm", true);
2263 setFeatureEnabledImpl(Features, "fma", true);
2264 // FALLTHROUGH
2265 case CK_IvyBridge:
2266 setFeatureEnabledImpl(Features, "rdrnd", true);
2267 setFeatureEnabledImpl(Features, "f16c", true);
2268 setFeatureEnabledImpl(Features, "fsgsbase", true);
2269 // FALLTHROUGH
2270 case CK_SandyBridge:
2271 setFeatureEnabledImpl(Features, "avx", true);
2272 // FALLTHROUGH
2273 case CK_Westmere:
2274 case CK_Silvermont:
2275 setFeatureEnabledImpl(Features, "aes", true);
2276 setFeatureEnabledImpl(Features, "pclmul", true);
2277 // FALLTHROUGH
2278 case CK_Nehalem:
2279 setFeatureEnabledImpl(Features, "sse4.2", true);
2280 setFeatureEnabledImpl(Features, "cx16", true);
2281 break;
2282 case CK_KNL:
2283 setFeatureEnabledImpl(Features, "avx512f", true);
2284 setFeatureEnabledImpl(Features, "avx512cd", true);
2285 setFeatureEnabledImpl(Features, "avx512er", true);
2286 setFeatureEnabledImpl(Features, "avx512pf", true);
2287 setFeatureEnabledImpl(Features, "rdseed", true);
2288 setFeatureEnabledImpl(Features, "adx", true);
2289 setFeatureEnabledImpl(Features, "lzcnt", true);
2290 setFeatureEnabledImpl(Features, "bmi", true);
2291 setFeatureEnabledImpl(Features, "bmi2", true);
2292 setFeatureEnabledImpl(Features, "rtm", true);
2293 setFeatureEnabledImpl(Features, "fma", true);
2294 setFeatureEnabledImpl(Features, "rdrnd", true);
2295 setFeatureEnabledImpl(Features, "f16c", true);
2296 setFeatureEnabledImpl(Features, "fsgsbase", true);
2297 setFeatureEnabledImpl(Features, "aes", true);
2298 setFeatureEnabledImpl(Features, "pclmul", true);
2299 setFeatureEnabledImpl(Features, "cx16", true);
2300 break;
2301 case CK_K6_2:
2302 case CK_K6_3:
2303 case CK_WinChip2:
2304 case CK_C3:
2305 setFeatureEnabledImpl(Features, "3dnow", true);
2306 break;
2307 case CK_Athlon:
2308 case CK_AthlonThunderbird:
2309 case CK_Geode:
2310 setFeatureEnabledImpl(Features, "3dnowa", true);
2311 break;
2312 case CK_Athlon4:
2313 case CK_AthlonXP:
2314 case CK_AthlonMP:
2315 setFeatureEnabledImpl(Features, "sse", true);
2316 setFeatureEnabledImpl(Features, "3dnowa", true);
2317 break;
2318 case CK_K8:
2319 case CK_Opteron:
2320 case CK_Athlon64:
2321 case CK_AthlonFX:
2322 setFeatureEnabledImpl(Features, "sse2", true);
2323 setFeatureEnabledImpl(Features, "3dnowa", true);
2324 break;
2325 case CK_AMDFAM10:
2326 setFeatureEnabledImpl(Features, "sse4a", true);
2327 setFeatureEnabledImpl(Features, "lzcnt", true);
2328 setFeatureEnabledImpl(Features, "popcnt", true);
2329 // FALLTHROUGH
2330 case CK_K8SSE3:
2331 case CK_OpteronSSE3:
2332 case CK_Athlon64SSE3:
2333 setFeatureEnabledImpl(Features, "sse3", true);
2334 setFeatureEnabledImpl(Features, "3dnowa", true);
2335 break;
2336 case CK_BTVER2:
2337 setFeatureEnabledImpl(Features, "avx", true);
2338 setFeatureEnabledImpl(Features, "aes", true);
2339 setFeatureEnabledImpl(Features, "pclmul", true);
2340 setFeatureEnabledImpl(Features, "bmi", true);
2341 setFeatureEnabledImpl(Features, "f16c", true);
2342 // FALLTHROUGH
2343 case CK_BTVER1:
2344 setFeatureEnabledImpl(Features, "ssse3", true);
2345 setFeatureEnabledImpl(Features, "sse4a", true);
2346 setFeatureEnabledImpl(Features, "lzcnt", true);
2347 setFeatureEnabledImpl(Features, "popcnt", true);
2348 setFeatureEnabledImpl(Features, "prfchw", true);
2349 setFeatureEnabledImpl(Features, "cx16", true);
2350 break;
2351 case CK_BDVER4:
2352 setFeatureEnabledImpl(Features, "avx2", true);
2353 setFeatureEnabledImpl(Features, "bmi2", true);
2354 // FALLTHROUGH
2355 case CK_BDVER3:
2356 setFeatureEnabledImpl(Features, "fsgsbase", true);
2357 // FALLTHROUGH
2358 case CK_BDVER2:
2359 setFeatureEnabledImpl(Features, "bmi", true);
2360 setFeatureEnabledImpl(Features, "fma", true);
2361 setFeatureEnabledImpl(Features, "f16c", true);
2362 setFeatureEnabledImpl(Features, "tbm", true);
2363 // FALLTHROUGH
2364 case CK_BDVER1:
2365 // xop implies avx, sse4a and fma4.
2366 setFeatureEnabledImpl(Features, "xop", true);
2367 setFeatureEnabledImpl(Features, "lzcnt", true);
2368 setFeatureEnabledImpl(Features, "aes", true);
2369 setFeatureEnabledImpl(Features, "pclmul", true);
2370 setFeatureEnabledImpl(Features, "prfchw", true);
2371 setFeatureEnabledImpl(Features, "cx16", true);
2372 break;
2373 }
2374}
2375
2376void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
2377 X86SSEEnum Level, bool Enabled) {
2378 if (Enabled) {
2379 switch (Level) {
2380 case AVX512F:
2381 Features["avx512f"] = true;
2382 case AVX2:
2383 Features["avx2"] = true;
2384 case AVX:
2385 Features["avx"] = true;
2386 case SSE42:
2387 Features["sse4.2"] = true;
2388 case SSE41:
2389 Features["sse4.1"] = true;
2390 case SSSE3:
2391 Features["ssse3"] = true;
2392 case SSE3:
2393 Features["sse3"] = true;
2394 case SSE2:
2395 Features["sse2"] = true;
2396 case SSE1:
2397 Features["sse"] = true;
2398 case NoSSE:
2399 break;
2400 }
2401 return;
2402 }
2403
2404 switch (Level) {
2405 case NoSSE:
2406 case SSE1:
2407 Features["sse"] = false;
2408 case SSE2:
2409 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2410 Features["sha"] = false;
2411 case SSE3:
2412 Features["sse3"] = false;
2413 setXOPLevel(Features, NoXOP, false);
2414 case SSSE3:
2415 Features["ssse3"] = false;
2416 case SSE41:
2417 Features["sse4.1"] = false;
2418 case SSE42:
2419 Features["sse4.2"] = false;
2420 case AVX:
2421 Features["fma"] = Features["avx"] = Features["f16c"] = false;
2422 setXOPLevel(Features, FMA4, false);
2423 case AVX2:
2424 Features["avx2"] = false;
2425 case AVX512F:
2426 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2427 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2428 Features["avx512vl"] = false;
2429 }
2430}
2431
2432void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
2433 MMX3DNowEnum Level, bool Enabled) {
2434 if (Enabled) {
2435 switch (Level) {
2436 case AMD3DNowAthlon:
2437 Features["3dnowa"] = true;
2438 case AMD3DNow:
2439 Features["3dnow"] = true;
2440 case MMX:
2441 Features["mmx"] = true;
2442 case NoMMX3DNow:
2443 break;
2444 }
2445 return;
2446 }
2447
2448 switch (Level) {
2449 case NoMMX3DNow:
2450 case MMX:
2451 Features["mmx"] = false;
2452 case AMD3DNow:
2453 Features["3dnow"] = false;
2454 case AMD3DNowAthlon:
2455 Features["3dnowa"] = false;
2456 }
2457}
2458
2459void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2460 bool Enabled) {
2461 if (Enabled) {
2462 switch (Level) {
2463 case XOP:
2464 Features["xop"] = true;
2465 case FMA4:
2466 Features["fma4"] = true;
2467 setSSELevel(Features, AVX, true);
2468 case SSE4A:
2469 Features["sse4a"] = true;
2470 setSSELevel(Features, SSE3, true);
2471 case NoXOP:
2472 break;
2473 }
2474 return;
2475 }
2476
2477 switch (Level) {
2478 case NoXOP:
2479 case SSE4A:
2480 Features["sse4a"] = false;
2481 case FMA4:
2482 Features["fma4"] = false;
2483 case XOP:
2484 Features["xop"] = false;
2485 }
2486}
2487
2488void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2489 StringRef Name, bool Enabled) {
2490 // FIXME: This *really* should not be here. We need some way of translating
2491 // options into llvm subtarget features.
2492 if (Name == "sse4")
2493 Name = "sse4.2";
2494
2495 Features[Name] = Enabled;
2496
2497 if (Name == "mmx") {
2498 setMMXLevel(Features, MMX, Enabled);
2499 } else if (Name == "sse") {
2500 setSSELevel(Features, SSE1, Enabled);
2501 } else if (Name == "sse2") {
2502 setSSELevel(Features, SSE2, Enabled);
2503 } else if (Name == "sse3") {
2504 setSSELevel(Features, SSE3, Enabled);
2505 } else if (Name == "ssse3") {
2506 setSSELevel(Features, SSSE3, Enabled);
2507 } else if (Name == "sse4.2") {
2508 setSSELevel(Features, SSE42, Enabled);
2509 } else if (Name == "sse4.1") {
2510 setSSELevel(Features, SSE41, Enabled);
2511 } else if (Name == "3dnow") {
2512 setMMXLevel(Features, AMD3DNow, Enabled);
2513 } else if (Name == "3dnowa") {
2514 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
2515 } else if (Name == "aes") {
2516 if (Enabled)
2517 setSSELevel(Features, SSE2, Enabled);
2518 } else if (Name == "pclmul") {
2519 if (Enabled)
2520 setSSELevel(Features, SSE2, Enabled);
2521 } else if (Name == "avx") {
2522 setSSELevel(Features, AVX, Enabled);
2523 } else if (Name == "avx2") {
2524 setSSELevel(Features, AVX2, Enabled);
2525 } else if (Name == "avx512f") {
2526 setSSELevel(Features, AVX512F, Enabled);
2527 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2528 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
2529 if (Enabled)
2530 setSSELevel(Features, AVX512F, Enabled);
2531 } else if (Name == "fma") {
2532 if (Enabled)
2533 setSSELevel(Features, AVX, Enabled);
2534 } else if (Name == "fma4") {
2535 setXOPLevel(Features, FMA4, Enabled);
2536 } else if (Name == "xop") {
2537 setXOPLevel(Features, XOP, Enabled);
2538 } else if (Name == "sse4a") {
2539 setXOPLevel(Features, SSE4A, Enabled);
2540 } else if (Name == "f16c") {
2541 if (Enabled)
2542 setSSELevel(Features, AVX, Enabled);
2543 } else if (Name == "sha") {
2544 if (Enabled)
2545 setSSELevel(Features, SSE2, Enabled);
2546 }
2547}
2548
2549/// handleTargetFeatures - Perform initialization based on the user
2550/// configured set of features.
2551bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
2552 DiagnosticsEngine &Diags) {
2553 // Remember the maximum enabled sselevel.
2554 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2555 // Ignore disabled features.
2556 if (Features[i][0] == '-')
2557 continue;
2558
2559 StringRef Feature = StringRef(Features[i]).substr(1);
2560
2561 if (Feature == "aes") {
2562 HasAES = true;
2563 continue;
2564 }
2565
2566 if (Feature == "pclmul") {
2567 HasPCLMUL = true;
2568 continue;
2569 }
2570
2571 if (Feature == "lzcnt") {
2572 HasLZCNT = true;
2573 continue;
2574 }
2575
2576 if (Feature == "rdrnd") {
2577 HasRDRND = true;
2578 continue;
2579 }
2580
2581 if (Feature == "fsgsbase") {
2582 HasFSGSBASE = true;
2583 continue;
2584 }
2585
2586 if (Feature == "bmi") {
2587 HasBMI = true;
2588 continue;
2589 }
2590
2591 if (Feature == "bmi2") {
2592 HasBMI2 = true;
2593 continue;
2594 }
2595
2596 if (Feature == "popcnt") {
2597 HasPOPCNT = true;
2598 continue;
2599 }
2600
2601 if (Feature == "rtm") {
2602 HasRTM = true;
2603 continue;
2604 }
2605
2606 if (Feature == "prfchw") {
2607 HasPRFCHW = true;
2608 continue;
2609 }
2610
2611 if (Feature == "rdseed") {
2612 HasRDSEED = true;
2613 continue;
2614 }
2615
2616 if (Feature == "adx") {
2617 HasADX = true;
2618 continue;
2619 }
2620
2621 if (Feature == "tbm") {
2622 HasTBM = true;
2623 continue;
2624 }
2625
2626 if (Feature == "fma") {
2627 HasFMA = true;
2628 continue;
2629 }
2630
2631 if (Feature == "f16c") {
2632 HasF16C = true;
2633 continue;
2634 }
2635
2636 if (Feature == "avx512cd") {
2637 HasAVX512CD = true;
2638 continue;
2639 }
2640
2641 if (Feature == "avx512er") {
2642 HasAVX512ER = true;
2643 continue;
2644 }
2645
2646 if (Feature == "avx512pf") {
2647 HasAVX512PF = true;
2648 continue;
2649 }
2650
2651 if (Feature == "avx512dq") {
2652 HasAVX512DQ = true;
2653 continue;
2654 }
2655
2656 if (Feature == "avx512bw") {
2657 HasAVX512BW = true;
2658 continue;
2659 }
2660
2661 if (Feature == "avx512vl") {
2662 HasAVX512VL = true;
2663 continue;
2664 }
2665
2666 if (Feature == "sha") {
2667 HasSHA = true;
2668 continue;
2669 }
2670
2671 if (Feature == "cx16") {
2672 HasCX16 = true;
2673 continue;
2674 }
2675
2676 assert(Features[i][0] == '+' && "Invalid target feature!");
2677 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
2678 .Case("avx512f", AVX512F)
2679 .Case("avx2", AVX2)
2680 .Case("avx", AVX)
2681 .Case("sse4.2", SSE42)
2682 .Case("sse4.1", SSE41)
2683 .Case("ssse3", SSSE3)
2684 .Case("sse3", SSE3)
2685 .Case("sse2", SSE2)
2686 .Case("sse", SSE1)
2687 .Default(NoSSE);
2688 SSELevel = std::max(SSELevel, Level);
2689
2690 MMX3DNowEnum ThreeDNowLevel =
2691 llvm::StringSwitch<MMX3DNowEnum>(Feature)
2692 .Case("3dnowa", AMD3DNowAthlon)
2693 .Case("3dnow", AMD3DNow)
2694 .Case("mmx", MMX)
2695 .Default(NoMMX3DNow);
2696 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
2697
2698 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2699 .Case("xop", XOP)
2700 .Case("fma4", FMA4)
2701 .Case("sse4a", SSE4A)
2702 .Default(NoXOP);
2703 XOPLevel = std::max(XOPLevel, XLevel);
2704 }
2705
2706 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2707 // Can't do this earlier because we need to be able to explicitly enable
2708 // popcnt and still disable sse4.2.
2709 if (!HasPOPCNT && SSELevel >= SSE42 &&
2710 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2711 HasPOPCNT = true;
2712 Features.push_back("+popcnt");
2713 }
2714
2715 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2716 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2717 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2718 HasPRFCHW = true;
2719 Features.push_back("+prfchw");
2720 }
2721
2722 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2723 // matches the selected sse level.
2724 if (FPMath == FP_SSE && SSELevel < SSE1) {
2725 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2726 return false;
2727 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2728 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2729 return false;
2730 }
2731
2732 // Don't tell the backend if we're turning off mmx; it will end up disabling
2733 // SSE, which we don't want.
2734 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2735 // then enable MMX.
2736 std::vector<std::string>::iterator it;
2737 it = std::find(Features.begin(), Features.end(), "-mmx");
2738 if (it != Features.end())
2739 Features.erase(it);
2740 else if (SSELevel > NoSSE)
2741 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
2742 return true;
2743}
2744
2745/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2746/// definitions for this particular subtarget.
2747void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
2748 MacroBuilder &Builder) const {
2749 // Target identification.
2750 if (getTriple().getArch() == llvm::Triple::x86_64) {
2751 Builder.defineMacro("__amd64__");
2752 Builder.defineMacro("__amd64");
2753 Builder.defineMacro("__x86_64");
2754 Builder.defineMacro("__x86_64__");
2755 if (getTriple().getArchName() == "x86_64h") {
2756 Builder.defineMacro("__x86_64h");
2757 Builder.defineMacro("__x86_64h__");
2758 }
2759 } else {
2760 DefineStd(Builder, "i386", Opts);
2761 }
2762
2763 // Subtarget options.
2764 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2765 // truly should be based on -mtune options.
2766 switch (CPU) {
2767 case CK_Generic:
2768 break;
2769 case CK_i386:
2770 // The rest are coming from the i386 define above.
2771 Builder.defineMacro("__tune_i386__");
2772 break;
2773 case CK_i486:
2774 case CK_WinChipC6:
2775 case CK_WinChip2:
2776 case CK_C3:
2777 defineCPUMacros(Builder, "i486");
2778 break;
2779 case CK_PentiumMMX:
2780 Builder.defineMacro("__pentium_mmx__");
2781 Builder.defineMacro("__tune_pentium_mmx__");
2782 // Fallthrough
2783 case CK_i586:
2784 case CK_Pentium:
2785 defineCPUMacros(Builder, "i586");
2786 defineCPUMacros(Builder, "pentium");
2787 break;
2788 case CK_Pentium3:
2789 case CK_Pentium3M:
2790 case CK_PentiumM:
2791 Builder.defineMacro("__tune_pentium3__");
2792 // Fallthrough
2793 case CK_Pentium2:
2794 case CK_C3_2:
2795 Builder.defineMacro("__tune_pentium2__");
2796 // Fallthrough
2797 case CK_PentiumPro:
2798 Builder.defineMacro("__tune_i686__");
2799 Builder.defineMacro("__tune_pentiumpro__");
2800 // Fallthrough
2801 case CK_i686:
2802 Builder.defineMacro("__i686");
2803 Builder.defineMacro("__i686__");
2804 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2805 Builder.defineMacro("__pentiumpro");
2806 Builder.defineMacro("__pentiumpro__");
2807 break;
2808 case CK_Pentium4:
2809 case CK_Pentium4M:
2810 defineCPUMacros(Builder, "pentium4");
2811 break;
2812 case CK_Yonah:
2813 case CK_Prescott:
2814 case CK_Nocona:
2815 defineCPUMacros(Builder, "nocona");
2816 break;
2817 case CK_Core2:
2818 case CK_Penryn:
2819 defineCPUMacros(Builder, "core2");
2820 break;
2821 case CK_Bonnell:
2822 defineCPUMacros(Builder, "atom");
2823 break;
2824 case CK_Silvermont:
2825 defineCPUMacros(Builder, "slm");
2826 break;
2827 case CK_Nehalem:
2828 case CK_Westmere:
2829 case CK_SandyBridge:
2830 case CK_IvyBridge:
2831 case CK_Haswell:
2832 case CK_Broadwell:
2833 // FIXME: Historically, we defined this legacy name, it would be nice to
2834 // remove it at some point. We've never exposed fine-grained names for
2835 // recent primary x86 CPUs, and we should keep it that way.
2836 defineCPUMacros(Builder, "corei7");
2837 break;
2838 case CK_Skylake:
2839 // FIXME: Historically, we defined this legacy name, it would be nice to
2840 // remove it at some point. This is the only fine-grained CPU macro in the
2841 // main intel CPU line, and it would be better to not have these and force
2842 // people to use ISA macros.
2843 defineCPUMacros(Builder, "skx");
2844 break;
2845 case CK_KNL:
2846 defineCPUMacros(Builder, "knl");
2847 break;
2848 case CK_K6_2:
2849 Builder.defineMacro("__k6_2__");
2850 Builder.defineMacro("__tune_k6_2__");
2851 // Fallthrough
2852 case CK_K6_3:
2853 if (CPU != CK_K6_2) { // In case of fallthrough
2854 // FIXME: GCC may be enabling these in cases where some other k6
2855 // architecture is specified but -m3dnow is explicitly provided. The
2856 // exact semantics need to be determined and emulated here.
2857 Builder.defineMacro("__k6_3__");
2858 Builder.defineMacro("__tune_k6_3__");
2859 }
2860 // Fallthrough
2861 case CK_K6:
2862 defineCPUMacros(Builder, "k6");
2863 break;
2864 case CK_Athlon:
2865 case CK_AthlonThunderbird:
2866 case CK_Athlon4:
2867 case CK_AthlonXP:
2868 case CK_AthlonMP:
2869 defineCPUMacros(Builder, "athlon");
2870 if (SSELevel != NoSSE) {
2871 Builder.defineMacro("__athlon_sse__");
2872 Builder.defineMacro("__tune_athlon_sse__");
2873 }
2874 break;
2875 case CK_K8:
2876 case CK_K8SSE3:
2877 case CK_x86_64:
2878 case CK_Opteron:
2879 case CK_OpteronSSE3:
2880 case CK_Athlon64:
2881 case CK_Athlon64SSE3:
2882 case CK_AthlonFX:
2883 defineCPUMacros(Builder, "k8");
2884 break;
2885 case CK_AMDFAM10:
2886 defineCPUMacros(Builder, "amdfam10");
2887 break;
2888 case CK_BTVER1:
2889 defineCPUMacros(Builder, "btver1");
2890 break;
2891 case CK_BTVER2:
2892 defineCPUMacros(Builder, "btver2");
2893 break;
2894 case CK_BDVER1:
2895 defineCPUMacros(Builder, "bdver1");
2896 break;
2897 case CK_BDVER2:
2898 defineCPUMacros(Builder, "bdver2");
2899 break;
2900 case CK_BDVER3:
2901 defineCPUMacros(Builder, "bdver3");
2902 break;
2903 case CK_BDVER4:
2904 defineCPUMacros(Builder, "bdver4");
2905 break;
2906 case CK_Geode:
2907 defineCPUMacros(Builder, "geode");
2908 break;
2909 }
2910
2911 // Target properties.
2912 Builder.defineMacro("__REGISTER_PREFIX__", "");
2913
2914 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2915 // functions in glibc header files that use FP Stack inline asm which the
2916 // backend can't deal with (PR879).
2917 Builder.defineMacro("__NO_MATH_INLINES");
2918
2919 if (HasAES)
2920 Builder.defineMacro("__AES__");
2921
2922 if (HasPCLMUL)
2923 Builder.defineMacro("__PCLMUL__");
2924
2925 if (HasLZCNT)
2926 Builder.defineMacro("__LZCNT__");
2927
2928 if (HasRDRND)
2929 Builder.defineMacro("__RDRND__");
2930
2931 if (HasFSGSBASE)
2932 Builder.defineMacro("__FSGSBASE__");
2933
2934 if (HasBMI)
2935 Builder.defineMacro("__BMI__");
2936
2937 if (HasBMI2)
2938 Builder.defineMacro("__BMI2__");
2939
2940 if (HasPOPCNT)
2941 Builder.defineMacro("__POPCNT__");
2942
2943 if (HasRTM)
2944 Builder.defineMacro("__RTM__");
2945
2946 if (HasPRFCHW)
2947 Builder.defineMacro("__PRFCHW__");
2948
2949 if (HasRDSEED)
2950 Builder.defineMacro("__RDSEED__");
2951
2952 if (HasADX)
2953 Builder.defineMacro("__ADX__");
2954
2955 if (HasTBM)
2956 Builder.defineMacro("__TBM__");
2957
2958 switch (XOPLevel) {
2959 case XOP:
2960 Builder.defineMacro("__XOP__");
2961 case FMA4:
2962 Builder.defineMacro("__FMA4__");
2963 case SSE4A:
2964 Builder.defineMacro("__SSE4A__");
2965 case NoXOP:
2966 break;
2967 }
2968
2969 if (HasFMA)
2970 Builder.defineMacro("__FMA__");
2971
2972 if (HasF16C)
2973 Builder.defineMacro("__F16C__");
2974
2975 if (HasAVX512CD)
2976 Builder.defineMacro("__AVX512CD__");
2977 if (HasAVX512ER)
2978 Builder.defineMacro("__AVX512ER__");
2979 if (HasAVX512PF)
2980 Builder.defineMacro("__AVX512PF__");
2981 if (HasAVX512DQ)
2982 Builder.defineMacro("__AVX512DQ__");
2983 if (HasAVX512BW)
2984 Builder.defineMacro("__AVX512BW__");
2985 if (HasAVX512VL)
2986 Builder.defineMacro("__AVX512VL__");
2987
2988 if (HasSHA)
2989 Builder.defineMacro("__SHA__");
2990
2991 if (HasCX16)
2992 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
2993
2994 // Each case falls through to the previous one here.
2995 switch (SSELevel) {
2996 case AVX512F:
2997 Builder.defineMacro("__AVX512F__");
2998 case AVX2:
2999 Builder.defineMacro("__AVX2__");
3000 case AVX:
3001 Builder.defineMacro("__AVX__");
3002 case SSE42:
3003 Builder.defineMacro("__SSE4_2__");
3004 case SSE41:
3005 Builder.defineMacro("__SSE4_1__");
3006 case SSSE3:
3007 Builder.defineMacro("__SSSE3__");
3008 case SSE3:
3009 Builder.defineMacro("__SSE3__");
3010 case SSE2:
3011 Builder.defineMacro("__SSE2__");
3012 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
3013 case SSE1:
3014 Builder.defineMacro("__SSE__");
3015 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
3016 case NoSSE:
3017 break;
3018 }
3019
3020 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
3021 switch (SSELevel) {
3022 case AVX512F:
3023 case AVX2:
3024 case AVX:
3025 case SSE42:
3026 case SSE41:
3027 case SSSE3:
3028 case SSE3:
3029 case SSE2:
3030 Builder.defineMacro("_M_IX86_FP", Twine(2));
3031 break;
3032 case SSE1:
3033 Builder.defineMacro("_M_IX86_FP", Twine(1));
3034 break;
3035 default:
3036 Builder.defineMacro("_M_IX86_FP", Twine(0));
3037 }
3038 }
3039
3040 // Each case falls through to the previous one here.
3041 switch (MMX3DNowLevel) {
3042 case AMD3DNowAthlon:
3043 Builder.defineMacro("__3dNOW_A__");
3044 case AMD3DNow:
3045 Builder.defineMacro("__3dNOW__");
3046 case MMX:
3047 Builder.defineMacro("__MMX__");
3048 case NoMMX3DNow:
3049 break;
3050 }
3051
3052 if (CPU >= CK_i486) {
3053 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3054 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3055 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3056 }
3057 if (CPU >= CK_i586)
3058 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
3059}
3060
3061bool X86TargetInfo::hasFeature(StringRef Feature) const {
3062 return llvm::StringSwitch<bool>(Feature)
3063 .Case("aes", HasAES)
3064 .Case("avx", SSELevel >= AVX)
3065 .Case("avx2", SSELevel >= AVX2)
3066 .Case("avx512f", SSELevel >= AVX512F)
3067 .Case("avx512cd", HasAVX512CD)
3068 .Case("avx512er", HasAVX512ER)
3069 .Case("avx512pf", HasAVX512PF)
3070 .Case("avx512dq", HasAVX512DQ)
3071 .Case("avx512bw", HasAVX512BW)
3072 .Case("avx512vl", HasAVX512VL)
3073 .Case("bmi", HasBMI)
3074 .Case("bmi2", HasBMI2)
3075 .Case("cx16", HasCX16)
3076 .Case("f16c", HasF16C)
3077 .Case("fma", HasFMA)
3078 .Case("fma4", XOPLevel >= FMA4)
3079 .Case("fsgsbase", HasFSGSBASE)
3080 .Case("lzcnt", HasLZCNT)
3081 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3082 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3083 .Case("mmx", MMX3DNowLevel >= MMX)
3084 .Case("pclmul", HasPCLMUL)
3085 .Case("popcnt", HasPOPCNT)
3086 .Case("prfchw", HasPRFCHW)
3087 .Case("rdrnd", HasRDRND)
3088 .Case("rdseed", HasRDSEED)
3089 .Case("rtm", HasRTM)
3090 .Case("sha", HasSHA)
3091 .Case("sse", SSELevel >= SSE1)
3092 .Case("sse2", SSELevel >= SSE2)
3093 .Case("sse3", SSELevel >= SSE3)
3094 .Case("ssse3", SSELevel >= SSSE3)
3095 .Case("sse4.1", SSELevel >= SSE41)
3096 .Case("sse4.2", SSELevel >= SSE42)
3097 .Case("sse4a", XOPLevel >= SSE4A)
3098 .Case("tbm", HasTBM)
3099 .Case("x86", true)
3100 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3101 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
3102 .Case("xop", XOPLevel >= XOP)
3103 .Default(false);
3104}
3105
3106bool
3107X86TargetInfo::validateAsmConstraint(const char *&Name,
3108 TargetInfo::ConstraintInfo &Info) const {
3109 switch (*Name) {
3110 default: return false;
3111 case 'I':
3112 Info.setRequiresImmediate(0, 31);
3113 return true;
3114 case 'J':
3115 Info.setRequiresImmediate(0, 63);
3116 return true;
3117 case 'K':
3118 Info.setRequiresImmediate(-128, 127);
3119 return true;
3120 case 'L':
3121 // FIXME: properly analyze this constraint:
3122 // must be one of 0xff, 0xffff, or 0xffffffff
3123 return true;
3124 case 'M':
3125 Info.setRequiresImmediate(0, 3);
3126 return true;
3127 case 'N':
3128 Info.setRequiresImmediate(0, 255);
3129 return true;
3130 case 'O':
3131 Info.setRequiresImmediate(0, 127);
3132 return true;
3133 case 'Y': // first letter of a pair:
3134 switch (*(Name+1)) {
3135 default: return false;
3136 case '0': // First SSE register.
3137 case 't': // Any SSE register, when SSE2 is enabled.
3138 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3139 case 'm': // any MMX register, when inter-unit moves enabled.
3140 break; // falls through to setAllowsRegister.
3141 }
3142 case 'f': // any x87 floating point stack register.
3143 // Constraint 'f' cannot be used for output operands.
3144 if (Info.ConstraintStr[0] == '=')
3145 return false;
3146
3147 Info.setAllowsRegister();
3148 return true;
3149 case 'a': // eax.
3150 case 'b': // ebx.
3151 case 'c': // ecx.
3152 case 'd': // edx.
3153 case 'S': // esi.
3154 case 'D': // edi.
3155 case 'A': // edx:eax.
3156 case 't': // top of floating point stack.
3157 case 'u': // second from top of floating point stack.
3158 case 'q': // Any register accessible as [r]l: a, b, c, and d.
3159 case 'y': // Any MMX register.
3160 case 'x': // Any SSE register.
3161 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
3162 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3163 case 'l': // "Index" registers: any general register that can be used as an
3164 // index in a base+index memory access.
3165 Info.setAllowsRegister();
3166 return true;
3167 case 'C': // SSE floating point constant.
3168 case 'G': // x87 floating point constant.
3169 case 'e': // 32-bit signed integer constant for use with zero-extending
3170 // x86_64 instructions.
3171 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3172 // x86_64 instructions.
3173 return true;
3174 }
3175}
3176
3177bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3178 unsigned Size) const {
3179 // Strip off constraint modifiers.
3180 while (Constraint[0] == '=' ||
3181 Constraint[0] == '+' ||
3182 Constraint[0] == '&')
3183 Constraint = Constraint.substr(1);
3184
3185 return validateOperandSize(Constraint, Size);
3186}
3187
3188bool X86TargetInfo::validateInputSize(StringRef Constraint,
3189 unsigned Size) const {
3190 return validateOperandSize(Constraint, Size);
3191}
3192
3193bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3194 unsigned Size) const {
3195 switch (Constraint[0]) {
3196 default: break;
3197 case 'y':
3198 return Size <= 64;
3199 case 'f':
3200 case 't':
3201 case 'u':
3202 return Size <= 128;
3203 case 'x':
3204 // 256-bit ymm registers can be used if target supports AVX.
3205 return Size <= (SSELevel >= AVX ? 256U : 128U);
3206 }
3207
3208 return true;
3209}
3210
3211std::string
3212X86TargetInfo::convertConstraint(const char *&Constraint) const {
3213 switch (*Constraint) {
3214 case 'a': return std::string("{ax}");
3215 case 'b': return std::string("{bx}");
3216 case 'c': return std::string("{cx}");
3217 case 'd': return std::string("{dx}");
3218 case 'S': return std::string("{si}");
3219 case 'D': return std::string("{di}");
3220 case 'p': // address
3221 return std::string("im");
3222 case 't': // top of floating point stack.
3223 return std::string("{st}");
3224 case 'u': // second from top of floating point stack.
3225 return std::string("{st(1)}"); // second from top of floating point stack.
3226 default:
3227 return std::string(1, *Constraint);
3228 }
3229}
3230} // end anonymous namespace
3231
3232namespace {
3233// X86-32 generic target
3234class X86_32TargetInfo : public X86TargetInfo {
3235public:
3236 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
3237 DoubleAlign = LongLongAlign = 32;
3238 LongDoubleWidth = 96;
3239 LongDoubleAlign = 32;
3240 SuitableAlign = 128;
3241 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
3242 SizeType = UnsignedInt;
3243 PtrDiffType = SignedInt;
3244 IntPtrType = SignedInt;
3245 RegParmMax = 3;
3246
3247 // Use fpret for all types.
3248 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3249 (1 << TargetInfo::Double) |
3250 (1 << TargetInfo::LongDouble));
3251
3252 // x86-32 has atomics up to 8 bytes
3253 // FIXME: Check that we actually have cmpxchg8b before setting
3254 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3255 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3256 }
3257 BuiltinVaListKind getBuiltinVaListKind() const override {
3258 return TargetInfo::CharPtrBuiltinVaList;
3259 }
3260
3261 int getEHDataRegisterNumber(unsigned RegNo) const override {
3262 if (RegNo == 0) return 0;
3263 if (RegNo == 1) return 2;
3264 return -1;
3265 }
3266 bool validateOperandSize(StringRef Constraint,
3267 unsigned Size) const override {
3268 switch (Constraint[0]) {
3269 default: break;
3270 case 'R':
3271 case 'q':
3272 case 'Q':
3273 case 'a':
3274 case 'b':
3275 case 'c':
3276 case 'd':
3277 case 'S':
3278 case 'D':
3279 return Size <= 32;
3280 case 'A':
3281 return Size <= 64;
3282 }
3283
3284 return X86TargetInfo::validateOperandSize(Constraint, Size);
3285 }
3286};
3287} // end anonymous namespace
3288
3289namespace {
3290class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3291public:
3292 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3293 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
3294
3295 unsigned getFloatEvalMethod() const override {
3296 unsigned Major, Minor, Micro;
3297 getTriple().getOSVersion(Major, Minor, Micro);
3298 // New NetBSD uses the default rounding mode.
3299 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3300 return X86_32TargetInfo::getFloatEvalMethod();
3301 // NetBSD before 6.99.26 defaults to "double" rounding.
3302 return 1;
3303 }
3304};
3305} // end anonymous namespace
3306
3307namespace {
3308class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3309public:
3310 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3311 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
3312 SizeType = UnsignedLong;
3313 IntPtrType = SignedLong;
3314 PtrDiffType = SignedLong;
3315 }
3316};
3317} // end anonymous namespace
3318
3319namespace {
3320class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3321public:
3322 BitrigI386TargetInfo(const llvm::Triple &Triple)
3323 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
3324 SizeType = UnsignedLong;
3325 IntPtrType = SignedLong;
3326 PtrDiffType = SignedLong;
3327 }
3328};
3329} // end anonymous namespace
3330
3331namespace {
3332class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
3333public:
3334 DarwinI386TargetInfo(const llvm::Triple &Triple)
3335 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
3336 LongDoubleWidth = 128;
3337 LongDoubleAlign = 128;
3338 SuitableAlign = 128;
3339 MaxVectorAlign = 256;
3340 SizeType = UnsignedLong;
3341 IntPtrType = SignedLong;
3342 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
3343 HasAlignMac68kSupport = true;
3344 }
3345
3346};
3347} // end anonymous namespace
3348
3349namespace {
3350// x86-32 Windows target
3351class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
3352public:
3353 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3354 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
3355 WCharType = UnsignedShort;
3356 DoubleAlign = LongLongAlign = 64;
2193};
2194
2195bool X86TargetInfo::setFPMath(StringRef Name) {
2196 if (Name == "387") {
2197 FPMath = FP_387;
2198 return true;
2199 }
2200 if (Name == "sse") {
2201 FPMath = FP_SSE;
2202 return true;
2203 }
2204 return false;
2205}
2206
2207void X86TargetInfo::getDefaultFeatures(llvm::StringMap<bool> &Features) const {
2208 // FIXME: This *really* should not be here.
2209
2210 // X86_64 always has SSE2.
2211 if (getTriple().getArch() == llvm::Triple::x86_64)
2212 setFeatureEnabledImpl(Features, "sse2", true);
2213
2214 switch (CPU) {
2215 case CK_Generic:
2216 case CK_i386:
2217 case CK_i486:
2218 case CK_i586:
2219 case CK_Pentium:
2220 case CK_i686:
2221 case CK_PentiumPro:
2222 break;
2223 case CK_PentiumMMX:
2224 case CK_Pentium2:
2225 case CK_K6:
2226 case CK_WinChipC6:
2227 setFeatureEnabledImpl(Features, "mmx", true);
2228 break;
2229 case CK_Pentium3:
2230 case CK_Pentium3M:
2231 case CK_C3_2:
2232 setFeatureEnabledImpl(Features, "sse", true);
2233 break;
2234 case CK_PentiumM:
2235 case CK_Pentium4:
2236 case CK_Pentium4M:
2237 case CK_x86_64:
2238 setFeatureEnabledImpl(Features, "sse2", true);
2239 break;
2240 case CK_Yonah:
2241 case CK_Prescott:
2242 case CK_Nocona:
2243 setFeatureEnabledImpl(Features, "sse3", true);
2244 setFeatureEnabledImpl(Features, "cx16", true);
2245 break;
2246 case CK_Core2:
2247 case CK_Bonnell:
2248 setFeatureEnabledImpl(Features, "ssse3", true);
2249 setFeatureEnabledImpl(Features, "cx16", true);
2250 break;
2251 case CK_Penryn:
2252 setFeatureEnabledImpl(Features, "sse4.1", true);
2253 setFeatureEnabledImpl(Features, "cx16", true);
2254 break;
2255 case CK_Skylake:
2256 setFeatureEnabledImpl(Features, "avx512f", true);
2257 setFeatureEnabledImpl(Features, "avx512cd", true);
2258 setFeatureEnabledImpl(Features, "avx512dq", true);
2259 setFeatureEnabledImpl(Features, "avx512bw", true);
2260 setFeatureEnabledImpl(Features, "avx512vl", true);
2261 // FALLTHROUGH
2262 case CK_Broadwell:
2263 setFeatureEnabledImpl(Features, "rdseed", true);
2264 setFeatureEnabledImpl(Features, "adx", true);
2265 // FALLTHROUGH
2266 case CK_Haswell:
2267 setFeatureEnabledImpl(Features, "avx2", true);
2268 setFeatureEnabledImpl(Features, "lzcnt", true);
2269 setFeatureEnabledImpl(Features, "bmi", true);
2270 setFeatureEnabledImpl(Features, "bmi2", true);
2271 setFeatureEnabledImpl(Features, "rtm", true);
2272 setFeatureEnabledImpl(Features, "fma", true);
2273 // FALLTHROUGH
2274 case CK_IvyBridge:
2275 setFeatureEnabledImpl(Features, "rdrnd", true);
2276 setFeatureEnabledImpl(Features, "f16c", true);
2277 setFeatureEnabledImpl(Features, "fsgsbase", true);
2278 // FALLTHROUGH
2279 case CK_SandyBridge:
2280 setFeatureEnabledImpl(Features, "avx", true);
2281 // FALLTHROUGH
2282 case CK_Westmere:
2283 case CK_Silvermont:
2284 setFeatureEnabledImpl(Features, "aes", true);
2285 setFeatureEnabledImpl(Features, "pclmul", true);
2286 // FALLTHROUGH
2287 case CK_Nehalem:
2288 setFeatureEnabledImpl(Features, "sse4.2", true);
2289 setFeatureEnabledImpl(Features, "cx16", true);
2290 break;
2291 case CK_KNL:
2292 setFeatureEnabledImpl(Features, "avx512f", true);
2293 setFeatureEnabledImpl(Features, "avx512cd", true);
2294 setFeatureEnabledImpl(Features, "avx512er", true);
2295 setFeatureEnabledImpl(Features, "avx512pf", true);
2296 setFeatureEnabledImpl(Features, "rdseed", true);
2297 setFeatureEnabledImpl(Features, "adx", true);
2298 setFeatureEnabledImpl(Features, "lzcnt", true);
2299 setFeatureEnabledImpl(Features, "bmi", true);
2300 setFeatureEnabledImpl(Features, "bmi2", true);
2301 setFeatureEnabledImpl(Features, "rtm", true);
2302 setFeatureEnabledImpl(Features, "fma", true);
2303 setFeatureEnabledImpl(Features, "rdrnd", true);
2304 setFeatureEnabledImpl(Features, "f16c", true);
2305 setFeatureEnabledImpl(Features, "fsgsbase", true);
2306 setFeatureEnabledImpl(Features, "aes", true);
2307 setFeatureEnabledImpl(Features, "pclmul", true);
2308 setFeatureEnabledImpl(Features, "cx16", true);
2309 break;
2310 case CK_K6_2:
2311 case CK_K6_3:
2312 case CK_WinChip2:
2313 case CK_C3:
2314 setFeatureEnabledImpl(Features, "3dnow", true);
2315 break;
2316 case CK_Athlon:
2317 case CK_AthlonThunderbird:
2318 case CK_Geode:
2319 setFeatureEnabledImpl(Features, "3dnowa", true);
2320 break;
2321 case CK_Athlon4:
2322 case CK_AthlonXP:
2323 case CK_AthlonMP:
2324 setFeatureEnabledImpl(Features, "sse", true);
2325 setFeatureEnabledImpl(Features, "3dnowa", true);
2326 break;
2327 case CK_K8:
2328 case CK_Opteron:
2329 case CK_Athlon64:
2330 case CK_AthlonFX:
2331 setFeatureEnabledImpl(Features, "sse2", true);
2332 setFeatureEnabledImpl(Features, "3dnowa", true);
2333 break;
2334 case CK_AMDFAM10:
2335 setFeatureEnabledImpl(Features, "sse4a", true);
2336 setFeatureEnabledImpl(Features, "lzcnt", true);
2337 setFeatureEnabledImpl(Features, "popcnt", true);
2338 // FALLTHROUGH
2339 case CK_K8SSE3:
2340 case CK_OpteronSSE3:
2341 case CK_Athlon64SSE3:
2342 setFeatureEnabledImpl(Features, "sse3", true);
2343 setFeatureEnabledImpl(Features, "3dnowa", true);
2344 break;
2345 case CK_BTVER2:
2346 setFeatureEnabledImpl(Features, "avx", true);
2347 setFeatureEnabledImpl(Features, "aes", true);
2348 setFeatureEnabledImpl(Features, "pclmul", true);
2349 setFeatureEnabledImpl(Features, "bmi", true);
2350 setFeatureEnabledImpl(Features, "f16c", true);
2351 // FALLTHROUGH
2352 case CK_BTVER1:
2353 setFeatureEnabledImpl(Features, "ssse3", true);
2354 setFeatureEnabledImpl(Features, "sse4a", true);
2355 setFeatureEnabledImpl(Features, "lzcnt", true);
2356 setFeatureEnabledImpl(Features, "popcnt", true);
2357 setFeatureEnabledImpl(Features, "prfchw", true);
2358 setFeatureEnabledImpl(Features, "cx16", true);
2359 break;
2360 case CK_BDVER4:
2361 setFeatureEnabledImpl(Features, "avx2", true);
2362 setFeatureEnabledImpl(Features, "bmi2", true);
2363 // FALLTHROUGH
2364 case CK_BDVER3:
2365 setFeatureEnabledImpl(Features, "fsgsbase", true);
2366 // FALLTHROUGH
2367 case CK_BDVER2:
2368 setFeatureEnabledImpl(Features, "bmi", true);
2369 setFeatureEnabledImpl(Features, "fma", true);
2370 setFeatureEnabledImpl(Features, "f16c", true);
2371 setFeatureEnabledImpl(Features, "tbm", true);
2372 // FALLTHROUGH
2373 case CK_BDVER1:
2374 // xop implies avx, sse4a and fma4.
2375 setFeatureEnabledImpl(Features, "xop", true);
2376 setFeatureEnabledImpl(Features, "lzcnt", true);
2377 setFeatureEnabledImpl(Features, "aes", true);
2378 setFeatureEnabledImpl(Features, "pclmul", true);
2379 setFeatureEnabledImpl(Features, "prfchw", true);
2380 setFeatureEnabledImpl(Features, "cx16", true);
2381 break;
2382 }
2383}
2384
2385void X86TargetInfo::setSSELevel(llvm::StringMap<bool> &Features,
2386 X86SSEEnum Level, bool Enabled) {
2387 if (Enabled) {
2388 switch (Level) {
2389 case AVX512F:
2390 Features["avx512f"] = true;
2391 case AVX2:
2392 Features["avx2"] = true;
2393 case AVX:
2394 Features["avx"] = true;
2395 case SSE42:
2396 Features["sse4.2"] = true;
2397 case SSE41:
2398 Features["sse4.1"] = true;
2399 case SSSE3:
2400 Features["ssse3"] = true;
2401 case SSE3:
2402 Features["sse3"] = true;
2403 case SSE2:
2404 Features["sse2"] = true;
2405 case SSE1:
2406 Features["sse"] = true;
2407 case NoSSE:
2408 break;
2409 }
2410 return;
2411 }
2412
2413 switch (Level) {
2414 case NoSSE:
2415 case SSE1:
2416 Features["sse"] = false;
2417 case SSE2:
2418 Features["sse2"] = Features["pclmul"] = Features["aes"] =
2419 Features["sha"] = false;
2420 case SSE3:
2421 Features["sse3"] = false;
2422 setXOPLevel(Features, NoXOP, false);
2423 case SSSE3:
2424 Features["ssse3"] = false;
2425 case SSE41:
2426 Features["sse4.1"] = false;
2427 case SSE42:
2428 Features["sse4.2"] = false;
2429 case AVX:
2430 Features["fma"] = Features["avx"] = Features["f16c"] = false;
2431 setXOPLevel(Features, FMA4, false);
2432 case AVX2:
2433 Features["avx2"] = false;
2434 case AVX512F:
2435 Features["avx512f"] = Features["avx512cd"] = Features["avx512er"] =
2436 Features["avx512pf"] = Features["avx512dq"] = Features["avx512bw"] =
2437 Features["avx512vl"] = false;
2438 }
2439}
2440
2441void X86TargetInfo::setMMXLevel(llvm::StringMap<bool> &Features,
2442 MMX3DNowEnum Level, bool Enabled) {
2443 if (Enabled) {
2444 switch (Level) {
2445 case AMD3DNowAthlon:
2446 Features["3dnowa"] = true;
2447 case AMD3DNow:
2448 Features["3dnow"] = true;
2449 case MMX:
2450 Features["mmx"] = true;
2451 case NoMMX3DNow:
2452 break;
2453 }
2454 return;
2455 }
2456
2457 switch (Level) {
2458 case NoMMX3DNow:
2459 case MMX:
2460 Features["mmx"] = false;
2461 case AMD3DNow:
2462 Features["3dnow"] = false;
2463 case AMD3DNowAthlon:
2464 Features["3dnowa"] = false;
2465 }
2466}
2467
2468void X86TargetInfo::setXOPLevel(llvm::StringMap<bool> &Features, XOPEnum Level,
2469 bool Enabled) {
2470 if (Enabled) {
2471 switch (Level) {
2472 case XOP:
2473 Features["xop"] = true;
2474 case FMA4:
2475 Features["fma4"] = true;
2476 setSSELevel(Features, AVX, true);
2477 case SSE4A:
2478 Features["sse4a"] = true;
2479 setSSELevel(Features, SSE3, true);
2480 case NoXOP:
2481 break;
2482 }
2483 return;
2484 }
2485
2486 switch (Level) {
2487 case NoXOP:
2488 case SSE4A:
2489 Features["sse4a"] = false;
2490 case FMA4:
2491 Features["fma4"] = false;
2492 case XOP:
2493 Features["xop"] = false;
2494 }
2495}
2496
2497void X86TargetInfo::setFeatureEnabledImpl(llvm::StringMap<bool> &Features,
2498 StringRef Name, bool Enabled) {
2499 // FIXME: This *really* should not be here. We need some way of translating
2500 // options into llvm subtarget features.
2501 if (Name == "sse4")
2502 Name = "sse4.2";
2503
2504 Features[Name] = Enabled;
2505
2506 if (Name == "mmx") {
2507 setMMXLevel(Features, MMX, Enabled);
2508 } else if (Name == "sse") {
2509 setSSELevel(Features, SSE1, Enabled);
2510 } else if (Name == "sse2") {
2511 setSSELevel(Features, SSE2, Enabled);
2512 } else if (Name == "sse3") {
2513 setSSELevel(Features, SSE3, Enabled);
2514 } else if (Name == "ssse3") {
2515 setSSELevel(Features, SSSE3, Enabled);
2516 } else if (Name == "sse4.2") {
2517 setSSELevel(Features, SSE42, Enabled);
2518 } else if (Name == "sse4.1") {
2519 setSSELevel(Features, SSE41, Enabled);
2520 } else if (Name == "3dnow") {
2521 setMMXLevel(Features, AMD3DNow, Enabled);
2522 } else if (Name == "3dnowa") {
2523 setMMXLevel(Features, AMD3DNowAthlon, Enabled);
2524 } else if (Name == "aes") {
2525 if (Enabled)
2526 setSSELevel(Features, SSE2, Enabled);
2527 } else if (Name == "pclmul") {
2528 if (Enabled)
2529 setSSELevel(Features, SSE2, Enabled);
2530 } else if (Name == "avx") {
2531 setSSELevel(Features, AVX, Enabled);
2532 } else if (Name == "avx2") {
2533 setSSELevel(Features, AVX2, Enabled);
2534 } else if (Name == "avx512f") {
2535 setSSELevel(Features, AVX512F, Enabled);
2536 } else if (Name == "avx512cd" || Name == "avx512er" || Name == "avx512pf"
2537 || Name == "avx512dq" || Name == "avx512bw" || Name == "avx512vl") {
2538 if (Enabled)
2539 setSSELevel(Features, AVX512F, Enabled);
2540 } else if (Name == "fma") {
2541 if (Enabled)
2542 setSSELevel(Features, AVX, Enabled);
2543 } else if (Name == "fma4") {
2544 setXOPLevel(Features, FMA4, Enabled);
2545 } else if (Name == "xop") {
2546 setXOPLevel(Features, XOP, Enabled);
2547 } else if (Name == "sse4a") {
2548 setXOPLevel(Features, SSE4A, Enabled);
2549 } else if (Name == "f16c") {
2550 if (Enabled)
2551 setSSELevel(Features, AVX, Enabled);
2552 } else if (Name == "sha") {
2553 if (Enabled)
2554 setSSELevel(Features, SSE2, Enabled);
2555 }
2556}
2557
2558/// handleTargetFeatures - Perform initialization based on the user
2559/// configured set of features.
2560bool X86TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
2561 DiagnosticsEngine &Diags) {
2562 // Remember the maximum enabled sselevel.
2563 for (unsigned i = 0, e = Features.size(); i !=e; ++i) {
2564 // Ignore disabled features.
2565 if (Features[i][0] == '-')
2566 continue;
2567
2568 StringRef Feature = StringRef(Features[i]).substr(1);
2569
2570 if (Feature == "aes") {
2571 HasAES = true;
2572 continue;
2573 }
2574
2575 if (Feature == "pclmul") {
2576 HasPCLMUL = true;
2577 continue;
2578 }
2579
2580 if (Feature == "lzcnt") {
2581 HasLZCNT = true;
2582 continue;
2583 }
2584
2585 if (Feature == "rdrnd") {
2586 HasRDRND = true;
2587 continue;
2588 }
2589
2590 if (Feature == "fsgsbase") {
2591 HasFSGSBASE = true;
2592 continue;
2593 }
2594
2595 if (Feature == "bmi") {
2596 HasBMI = true;
2597 continue;
2598 }
2599
2600 if (Feature == "bmi2") {
2601 HasBMI2 = true;
2602 continue;
2603 }
2604
2605 if (Feature == "popcnt") {
2606 HasPOPCNT = true;
2607 continue;
2608 }
2609
2610 if (Feature == "rtm") {
2611 HasRTM = true;
2612 continue;
2613 }
2614
2615 if (Feature == "prfchw") {
2616 HasPRFCHW = true;
2617 continue;
2618 }
2619
2620 if (Feature == "rdseed") {
2621 HasRDSEED = true;
2622 continue;
2623 }
2624
2625 if (Feature == "adx") {
2626 HasADX = true;
2627 continue;
2628 }
2629
2630 if (Feature == "tbm") {
2631 HasTBM = true;
2632 continue;
2633 }
2634
2635 if (Feature == "fma") {
2636 HasFMA = true;
2637 continue;
2638 }
2639
2640 if (Feature == "f16c") {
2641 HasF16C = true;
2642 continue;
2643 }
2644
2645 if (Feature == "avx512cd") {
2646 HasAVX512CD = true;
2647 continue;
2648 }
2649
2650 if (Feature == "avx512er") {
2651 HasAVX512ER = true;
2652 continue;
2653 }
2654
2655 if (Feature == "avx512pf") {
2656 HasAVX512PF = true;
2657 continue;
2658 }
2659
2660 if (Feature == "avx512dq") {
2661 HasAVX512DQ = true;
2662 continue;
2663 }
2664
2665 if (Feature == "avx512bw") {
2666 HasAVX512BW = true;
2667 continue;
2668 }
2669
2670 if (Feature == "avx512vl") {
2671 HasAVX512VL = true;
2672 continue;
2673 }
2674
2675 if (Feature == "sha") {
2676 HasSHA = true;
2677 continue;
2678 }
2679
2680 if (Feature == "cx16") {
2681 HasCX16 = true;
2682 continue;
2683 }
2684
2685 assert(Features[i][0] == '+' && "Invalid target feature!");
2686 X86SSEEnum Level = llvm::StringSwitch<X86SSEEnum>(Feature)
2687 .Case("avx512f", AVX512F)
2688 .Case("avx2", AVX2)
2689 .Case("avx", AVX)
2690 .Case("sse4.2", SSE42)
2691 .Case("sse4.1", SSE41)
2692 .Case("ssse3", SSSE3)
2693 .Case("sse3", SSE3)
2694 .Case("sse2", SSE2)
2695 .Case("sse", SSE1)
2696 .Default(NoSSE);
2697 SSELevel = std::max(SSELevel, Level);
2698
2699 MMX3DNowEnum ThreeDNowLevel =
2700 llvm::StringSwitch<MMX3DNowEnum>(Feature)
2701 .Case("3dnowa", AMD3DNowAthlon)
2702 .Case("3dnow", AMD3DNow)
2703 .Case("mmx", MMX)
2704 .Default(NoMMX3DNow);
2705 MMX3DNowLevel = std::max(MMX3DNowLevel, ThreeDNowLevel);
2706
2707 XOPEnum XLevel = llvm::StringSwitch<XOPEnum>(Feature)
2708 .Case("xop", XOP)
2709 .Case("fma4", FMA4)
2710 .Case("sse4a", SSE4A)
2711 .Default(NoXOP);
2712 XOPLevel = std::max(XOPLevel, XLevel);
2713 }
2714
2715 // Enable popcnt if sse4.2 is enabled and popcnt is not explicitly disabled.
2716 // Can't do this earlier because we need to be able to explicitly enable
2717 // popcnt and still disable sse4.2.
2718 if (!HasPOPCNT && SSELevel >= SSE42 &&
2719 std::find(Features.begin(), Features.end(), "-popcnt") == Features.end()){
2720 HasPOPCNT = true;
2721 Features.push_back("+popcnt");
2722 }
2723
2724 // Enable prfchw if 3DNow! is enabled and prfchw is not explicitly disabled.
2725 if (!HasPRFCHW && MMX3DNowLevel >= AMD3DNow &&
2726 std::find(Features.begin(), Features.end(), "-prfchw") == Features.end()){
2727 HasPRFCHW = true;
2728 Features.push_back("+prfchw");
2729 }
2730
2731 // LLVM doesn't have a separate switch for fpmath, so only accept it if it
2732 // matches the selected sse level.
2733 if (FPMath == FP_SSE && SSELevel < SSE1) {
2734 Diags.Report(diag::err_target_unsupported_fpmath) << "sse";
2735 return false;
2736 } else if (FPMath == FP_387 && SSELevel >= SSE1) {
2737 Diags.Report(diag::err_target_unsupported_fpmath) << "387";
2738 return false;
2739 }
2740
2741 // Don't tell the backend if we're turning off mmx; it will end up disabling
2742 // SSE, which we don't want.
2743 // Additionally, if SSE is enabled and mmx is not explicitly disabled,
2744 // then enable MMX.
2745 std::vector<std::string>::iterator it;
2746 it = std::find(Features.begin(), Features.end(), "-mmx");
2747 if (it != Features.end())
2748 Features.erase(it);
2749 else if (SSELevel > NoSSE)
2750 MMX3DNowLevel = std::max(MMX3DNowLevel, MMX);
2751 return true;
2752}
2753
2754/// X86TargetInfo::getTargetDefines - Return the set of the X86-specific macro
2755/// definitions for this particular subtarget.
2756void X86TargetInfo::getTargetDefines(const LangOptions &Opts,
2757 MacroBuilder &Builder) const {
2758 // Target identification.
2759 if (getTriple().getArch() == llvm::Triple::x86_64) {
2760 Builder.defineMacro("__amd64__");
2761 Builder.defineMacro("__amd64");
2762 Builder.defineMacro("__x86_64");
2763 Builder.defineMacro("__x86_64__");
2764 if (getTriple().getArchName() == "x86_64h") {
2765 Builder.defineMacro("__x86_64h");
2766 Builder.defineMacro("__x86_64h__");
2767 }
2768 } else {
2769 DefineStd(Builder, "i386", Opts);
2770 }
2771
2772 // Subtarget options.
2773 // FIXME: We are hard-coding the tune parameters based on the CPU, but they
2774 // truly should be based on -mtune options.
2775 switch (CPU) {
2776 case CK_Generic:
2777 break;
2778 case CK_i386:
2779 // The rest are coming from the i386 define above.
2780 Builder.defineMacro("__tune_i386__");
2781 break;
2782 case CK_i486:
2783 case CK_WinChipC6:
2784 case CK_WinChip2:
2785 case CK_C3:
2786 defineCPUMacros(Builder, "i486");
2787 break;
2788 case CK_PentiumMMX:
2789 Builder.defineMacro("__pentium_mmx__");
2790 Builder.defineMacro("__tune_pentium_mmx__");
2791 // Fallthrough
2792 case CK_i586:
2793 case CK_Pentium:
2794 defineCPUMacros(Builder, "i586");
2795 defineCPUMacros(Builder, "pentium");
2796 break;
2797 case CK_Pentium3:
2798 case CK_Pentium3M:
2799 case CK_PentiumM:
2800 Builder.defineMacro("__tune_pentium3__");
2801 // Fallthrough
2802 case CK_Pentium2:
2803 case CK_C3_2:
2804 Builder.defineMacro("__tune_pentium2__");
2805 // Fallthrough
2806 case CK_PentiumPro:
2807 Builder.defineMacro("__tune_i686__");
2808 Builder.defineMacro("__tune_pentiumpro__");
2809 // Fallthrough
2810 case CK_i686:
2811 Builder.defineMacro("__i686");
2812 Builder.defineMacro("__i686__");
2813 // Strangely, __tune_i686__ isn't defined by GCC when CPU == i686.
2814 Builder.defineMacro("__pentiumpro");
2815 Builder.defineMacro("__pentiumpro__");
2816 break;
2817 case CK_Pentium4:
2818 case CK_Pentium4M:
2819 defineCPUMacros(Builder, "pentium4");
2820 break;
2821 case CK_Yonah:
2822 case CK_Prescott:
2823 case CK_Nocona:
2824 defineCPUMacros(Builder, "nocona");
2825 break;
2826 case CK_Core2:
2827 case CK_Penryn:
2828 defineCPUMacros(Builder, "core2");
2829 break;
2830 case CK_Bonnell:
2831 defineCPUMacros(Builder, "atom");
2832 break;
2833 case CK_Silvermont:
2834 defineCPUMacros(Builder, "slm");
2835 break;
2836 case CK_Nehalem:
2837 case CK_Westmere:
2838 case CK_SandyBridge:
2839 case CK_IvyBridge:
2840 case CK_Haswell:
2841 case CK_Broadwell:
2842 // FIXME: Historically, we defined this legacy name, it would be nice to
2843 // remove it at some point. We've never exposed fine-grained names for
2844 // recent primary x86 CPUs, and we should keep it that way.
2845 defineCPUMacros(Builder, "corei7");
2846 break;
2847 case CK_Skylake:
2848 // FIXME: Historically, we defined this legacy name, it would be nice to
2849 // remove it at some point. This is the only fine-grained CPU macro in the
2850 // main intel CPU line, and it would be better to not have these and force
2851 // people to use ISA macros.
2852 defineCPUMacros(Builder, "skx");
2853 break;
2854 case CK_KNL:
2855 defineCPUMacros(Builder, "knl");
2856 break;
2857 case CK_K6_2:
2858 Builder.defineMacro("__k6_2__");
2859 Builder.defineMacro("__tune_k6_2__");
2860 // Fallthrough
2861 case CK_K6_3:
2862 if (CPU != CK_K6_2) { // In case of fallthrough
2863 // FIXME: GCC may be enabling these in cases where some other k6
2864 // architecture is specified but -m3dnow is explicitly provided. The
2865 // exact semantics need to be determined and emulated here.
2866 Builder.defineMacro("__k6_3__");
2867 Builder.defineMacro("__tune_k6_3__");
2868 }
2869 // Fallthrough
2870 case CK_K6:
2871 defineCPUMacros(Builder, "k6");
2872 break;
2873 case CK_Athlon:
2874 case CK_AthlonThunderbird:
2875 case CK_Athlon4:
2876 case CK_AthlonXP:
2877 case CK_AthlonMP:
2878 defineCPUMacros(Builder, "athlon");
2879 if (SSELevel != NoSSE) {
2880 Builder.defineMacro("__athlon_sse__");
2881 Builder.defineMacro("__tune_athlon_sse__");
2882 }
2883 break;
2884 case CK_K8:
2885 case CK_K8SSE3:
2886 case CK_x86_64:
2887 case CK_Opteron:
2888 case CK_OpteronSSE3:
2889 case CK_Athlon64:
2890 case CK_Athlon64SSE3:
2891 case CK_AthlonFX:
2892 defineCPUMacros(Builder, "k8");
2893 break;
2894 case CK_AMDFAM10:
2895 defineCPUMacros(Builder, "amdfam10");
2896 break;
2897 case CK_BTVER1:
2898 defineCPUMacros(Builder, "btver1");
2899 break;
2900 case CK_BTVER2:
2901 defineCPUMacros(Builder, "btver2");
2902 break;
2903 case CK_BDVER1:
2904 defineCPUMacros(Builder, "bdver1");
2905 break;
2906 case CK_BDVER2:
2907 defineCPUMacros(Builder, "bdver2");
2908 break;
2909 case CK_BDVER3:
2910 defineCPUMacros(Builder, "bdver3");
2911 break;
2912 case CK_BDVER4:
2913 defineCPUMacros(Builder, "bdver4");
2914 break;
2915 case CK_Geode:
2916 defineCPUMacros(Builder, "geode");
2917 break;
2918 }
2919
2920 // Target properties.
2921 Builder.defineMacro("__REGISTER_PREFIX__", "");
2922
2923 // Define __NO_MATH_INLINES on linux/x86 so that we don't get inline
2924 // functions in glibc header files that use FP Stack inline asm which the
2925 // backend can't deal with (PR879).
2926 Builder.defineMacro("__NO_MATH_INLINES");
2927
2928 if (HasAES)
2929 Builder.defineMacro("__AES__");
2930
2931 if (HasPCLMUL)
2932 Builder.defineMacro("__PCLMUL__");
2933
2934 if (HasLZCNT)
2935 Builder.defineMacro("__LZCNT__");
2936
2937 if (HasRDRND)
2938 Builder.defineMacro("__RDRND__");
2939
2940 if (HasFSGSBASE)
2941 Builder.defineMacro("__FSGSBASE__");
2942
2943 if (HasBMI)
2944 Builder.defineMacro("__BMI__");
2945
2946 if (HasBMI2)
2947 Builder.defineMacro("__BMI2__");
2948
2949 if (HasPOPCNT)
2950 Builder.defineMacro("__POPCNT__");
2951
2952 if (HasRTM)
2953 Builder.defineMacro("__RTM__");
2954
2955 if (HasPRFCHW)
2956 Builder.defineMacro("__PRFCHW__");
2957
2958 if (HasRDSEED)
2959 Builder.defineMacro("__RDSEED__");
2960
2961 if (HasADX)
2962 Builder.defineMacro("__ADX__");
2963
2964 if (HasTBM)
2965 Builder.defineMacro("__TBM__");
2966
2967 switch (XOPLevel) {
2968 case XOP:
2969 Builder.defineMacro("__XOP__");
2970 case FMA4:
2971 Builder.defineMacro("__FMA4__");
2972 case SSE4A:
2973 Builder.defineMacro("__SSE4A__");
2974 case NoXOP:
2975 break;
2976 }
2977
2978 if (HasFMA)
2979 Builder.defineMacro("__FMA__");
2980
2981 if (HasF16C)
2982 Builder.defineMacro("__F16C__");
2983
2984 if (HasAVX512CD)
2985 Builder.defineMacro("__AVX512CD__");
2986 if (HasAVX512ER)
2987 Builder.defineMacro("__AVX512ER__");
2988 if (HasAVX512PF)
2989 Builder.defineMacro("__AVX512PF__");
2990 if (HasAVX512DQ)
2991 Builder.defineMacro("__AVX512DQ__");
2992 if (HasAVX512BW)
2993 Builder.defineMacro("__AVX512BW__");
2994 if (HasAVX512VL)
2995 Builder.defineMacro("__AVX512VL__");
2996
2997 if (HasSHA)
2998 Builder.defineMacro("__SHA__");
2999
3000 if (HasCX16)
3001 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16");
3002
3003 // Each case falls through to the previous one here.
3004 switch (SSELevel) {
3005 case AVX512F:
3006 Builder.defineMacro("__AVX512F__");
3007 case AVX2:
3008 Builder.defineMacro("__AVX2__");
3009 case AVX:
3010 Builder.defineMacro("__AVX__");
3011 case SSE42:
3012 Builder.defineMacro("__SSE4_2__");
3013 case SSE41:
3014 Builder.defineMacro("__SSE4_1__");
3015 case SSSE3:
3016 Builder.defineMacro("__SSSE3__");
3017 case SSE3:
3018 Builder.defineMacro("__SSE3__");
3019 case SSE2:
3020 Builder.defineMacro("__SSE2__");
3021 Builder.defineMacro("__SSE2_MATH__"); // -mfp-math=sse always implied.
3022 case SSE1:
3023 Builder.defineMacro("__SSE__");
3024 Builder.defineMacro("__SSE_MATH__"); // -mfp-math=sse always implied.
3025 case NoSSE:
3026 break;
3027 }
3028
3029 if (Opts.MicrosoftExt && getTriple().getArch() == llvm::Triple::x86) {
3030 switch (SSELevel) {
3031 case AVX512F:
3032 case AVX2:
3033 case AVX:
3034 case SSE42:
3035 case SSE41:
3036 case SSSE3:
3037 case SSE3:
3038 case SSE2:
3039 Builder.defineMacro("_M_IX86_FP", Twine(2));
3040 break;
3041 case SSE1:
3042 Builder.defineMacro("_M_IX86_FP", Twine(1));
3043 break;
3044 default:
3045 Builder.defineMacro("_M_IX86_FP", Twine(0));
3046 }
3047 }
3048
3049 // Each case falls through to the previous one here.
3050 switch (MMX3DNowLevel) {
3051 case AMD3DNowAthlon:
3052 Builder.defineMacro("__3dNOW_A__");
3053 case AMD3DNow:
3054 Builder.defineMacro("__3dNOW__");
3055 case MMX:
3056 Builder.defineMacro("__MMX__");
3057 case NoMMX3DNow:
3058 break;
3059 }
3060
3061 if (CPU >= CK_i486) {
3062 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
3063 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
3064 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
3065 }
3066 if (CPU >= CK_i586)
3067 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
3068}
3069
3070bool X86TargetInfo::hasFeature(StringRef Feature) const {
3071 return llvm::StringSwitch<bool>(Feature)
3072 .Case("aes", HasAES)
3073 .Case("avx", SSELevel >= AVX)
3074 .Case("avx2", SSELevel >= AVX2)
3075 .Case("avx512f", SSELevel >= AVX512F)
3076 .Case("avx512cd", HasAVX512CD)
3077 .Case("avx512er", HasAVX512ER)
3078 .Case("avx512pf", HasAVX512PF)
3079 .Case("avx512dq", HasAVX512DQ)
3080 .Case("avx512bw", HasAVX512BW)
3081 .Case("avx512vl", HasAVX512VL)
3082 .Case("bmi", HasBMI)
3083 .Case("bmi2", HasBMI2)
3084 .Case("cx16", HasCX16)
3085 .Case("f16c", HasF16C)
3086 .Case("fma", HasFMA)
3087 .Case("fma4", XOPLevel >= FMA4)
3088 .Case("fsgsbase", HasFSGSBASE)
3089 .Case("lzcnt", HasLZCNT)
3090 .Case("mm3dnow", MMX3DNowLevel >= AMD3DNow)
3091 .Case("mm3dnowa", MMX3DNowLevel >= AMD3DNowAthlon)
3092 .Case("mmx", MMX3DNowLevel >= MMX)
3093 .Case("pclmul", HasPCLMUL)
3094 .Case("popcnt", HasPOPCNT)
3095 .Case("prfchw", HasPRFCHW)
3096 .Case("rdrnd", HasRDRND)
3097 .Case("rdseed", HasRDSEED)
3098 .Case("rtm", HasRTM)
3099 .Case("sha", HasSHA)
3100 .Case("sse", SSELevel >= SSE1)
3101 .Case("sse2", SSELevel >= SSE2)
3102 .Case("sse3", SSELevel >= SSE3)
3103 .Case("ssse3", SSELevel >= SSSE3)
3104 .Case("sse4.1", SSELevel >= SSE41)
3105 .Case("sse4.2", SSELevel >= SSE42)
3106 .Case("sse4a", XOPLevel >= SSE4A)
3107 .Case("tbm", HasTBM)
3108 .Case("x86", true)
3109 .Case("x86_32", getTriple().getArch() == llvm::Triple::x86)
3110 .Case("x86_64", getTriple().getArch() == llvm::Triple::x86_64)
3111 .Case("xop", XOPLevel >= XOP)
3112 .Default(false);
3113}
3114
3115bool
3116X86TargetInfo::validateAsmConstraint(const char *&Name,
3117 TargetInfo::ConstraintInfo &Info) const {
3118 switch (*Name) {
3119 default: return false;
3120 case 'I':
3121 Info.setRequiresImmediate(0, 31);
3122 return true;
3123 case 'J':
3124 Info.setRequiresImmediate(0, 63);
3125 return true;
3126 case 'K':
3127 Info.setRequiresImmediate(-128, 127);
3128 return true;
3129 case 'L':
3130 // FIXME: properly analyze this constraint:
3131 // must be one of 0xff, 0xffff, or 0xffffffff
3132 return true;
3133 case 'M':
3134 Info.setRequiresImmediate(0, 3);
3135 return true;
3136 case 'N':
3137 Info.setRequiresImmediate(0, 255);
3138 return true;
3139 case 'O':
3140 Info.setRequiresImmediate(0, 127);
3141 return true;
3142 case 'Y': // first letter of a pair:
3143 switch (*(Name+1)) {
3144 default: return false;
3145 case '0': // First SSE register.
3146 case 't': // Any SSE register, when SSE2 is enabled.
3147 case 'i': // Any SSE register, when SSE2 and inter-unit moves enabled.
3148 case 'm': // any MMX register, when inter-unit moves enabled.
3149 break; // falls through to setAllowsRegister.
3150 }
3151 case 'f': // any x87 floating point stack register.
3152 // Constraint 'f' cannot be used for output operands.
3153 if (Info.ConstraintStr[0] == '=')
3154 return false;
3155
3156 Info.setAllowsRegister();
3157 return true;
3158 case 'a': // eax.
3159 case 'b': // ebx.
3160 case 'c': // ecx.
3161 case 'd': // edx.
3162 case 'S': // esi.
3163 case 'D': // edi.
3164 case 'A': // edx:eax.
3165 case 't': // top of floating point stack.
3166 case 'u': // second from top of floating point stack.
3167 case 'q': // Any register accessible as [r]l: a, b, c, and d.
3168 case 'y': // Any MMX register.
3169 case 'x': // Any SSE register.
3170 case 'Q': // Any register accessible as [r]h: a, b, c, and d.
3171 case 'R': // "Legacy" registers: ax, bx, cx, dx, di, si, sp, bp.
3172 case 'l': // "Index" registers: any general register that can be used as an
3173 // index in a base+index memory access.
3174 Info.setAllowsRegister();
3175 return true;
3176 case 'C': // SSE floating point constant.
3177 case 'G': // x87 floating point constant.
3178 case 'e': // 32-bit signed integer constant for use with zero-extending
3179 // x86_64 instructions.
3180 case 'Z': // 32-bit unsigned integer constant for use with zero-extending
3181 // x86_64 instructions.
3182 return true;
3183 }
3184}
3185
3186bool X86TargetInfo::validateOutputSize(StringRef Constraint,
3187 unsigned Size) const {
3188 // Strip off constraint modifiers.
3189 while (Constraint[0] == '=' ||
3190 Constraint[0] == '+' ||
3191 Constraint[0] == '&')
3192 Constraint = Constraint.substr(1);
3193
3194 return validateOperandSize(Constraint, Size);
3195}
3196
3197bool X86TargetInfo::validateInputSize(StringRef Constraint,
3198 unsigned Size) const {
3199 return validateOperandSize(Constraint, Size);
3200}
3201
3202bool X86TargetInfo::validateOperandSize(StringRef Constraint,
3203 unsigned Size) const {
3204 switch (Constraint[0]) {
3205 default: break;
3206 case 'y':
3207 return Size <= 64;
3208 case 'f':
3209 case 't':
3210 case 'u':
3211 return Size <= 128;
3212 case 'x':
3213 // 256-bit ymm registers can be used if target supports AVX.
3214 return Size <= (SSELevel >= AVX ? 256U : 128U);
3215 }
3216
3217 return true;
3218}
3219
3220std::string
3221X86TargetInfo::convertConstraint(const char *&Constraint) const {
3222 switch (*Constraint) {
3223 case 'a': return std::string("{ax}");
3224 case 'b': return std::string("{bx}");
3225 case 'c': return std::string("{cx}");
3226 case 'd': return std::string("{dx}");
3227 case 'S': return std::string("{si}");
3228 case 'D': return std::string("{di}");
3229 case 'p': // address
3230 return std::string("im");
3231 case 't': // top of floating point stack.
3232 return std::string("{st}");
3233 case 'u': // second from top of floating point stack.
3234 return std::string("{st(1)}"); // second from top of floating point stack.
3235 default:
3236 return std::string(1, *Constraint);
3237 }
3238}
3239} // end anonymous namespace
3240
3241namespace {
3242// X86-32 generic target
3243class X86_32TargetInfo : public X86TargetInfo {
3244public:
3245 X86_32TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
3246 DoubleAlign = LongLongAlign = 32;
3247 LongDoubleWidth = 96;
3248 LongDoubleAlign = 32;
3249 SuitableAlign = 128;
3250 DescriptionString = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128";
3251 SizeType = UnsignedInt;
3252 PtrDiffType = SignedInt;
3253 IntPtrType = SignedInt;
3254 RegParmMax = 3;
3255
3256 // Use fpret for all types.
3257 RealTypeUsesObjCFPRet = ((1 << TargetInfo::Float) |
3258 (1 << TargetInfo::Double) |
3259 (1 << TargetInfo::LongDouble));
3260
3261 // x86-32 has atomics up to 8 bytes
3262 // FIXME: Check that we actually have cmpxchg8b before setting
3263 // MaxAtomicInlineWidth. (cmpxchg8b is an i586 instruction.)
3264 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
3265 }
3266 BuiltinVaListKind getBuiltinVaListKind() const override {
3267 return TargetInfo::CharPtrBuiltinVaList;
3268 }
3269
3270 int getEHDataRegisterNumber(unsigned RegNo) const override {
3271 if (RegNo == 0) return 0;
3272 if (RegNo == 1) return 2;
3273 return -1;
3274 }
3275 bool validateOperandSize(StringRef Constraint,
3276 unsigned Size) const override {
3277 switch (Constraint[0]) {
3278 default: break;
3279 case 'R':
3280 case 'q':
3281 case 'Q':
3282 case 'a':
3283 case 'b':
3284 case 'c':
3285 case 'd':
3286 case 'S':
3287 case 'D':
3288 return Size <= 32;
3289 case 'A':
3290 return Size <= 64;
3291 }
3292
3293 return X86TargetInfo::validateOperandSize(Constraint, Size);
3294 }
3295};
3296} // end anonymous namespace
3297
3298namespace {
3299class NetBSDI386TargetInfo : public NetBSDTargetInfo<X86_32TargetInfo> {
3300public:
3301 NetBSDI386TargetInfo(const llvm::Triple &Triple)
3302 : NetBSDTargetInfo<X86_32TargetInfo>(Triple) {}
3303
3304 unsigned getFloatEvalMethod() const override {
3305 unsigned Major, Minor, Micro;
3306 getTriple().getOSVersion(Major, Minor, Micro);
3307 // New NetBSD uses the default rounding mode.
3308 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 26) || Major == 0)
3309 return X86_32TargetInfo::getFloatEvalMethod();
3310 // NetBSD before 6.99.26 defaults to "double" rounding.
3311 return 1;
3312 }
3313};
3314} // end anonymous namespace
3315
3316namespace {
3317class OpenBSDI386TargetInfo : public OpenBSDTargetInfo<X86_32TargetInfo> {
3318public:
3319 OpenBSDI386TargetInfo(const llvm::Triple &Triple)
3320 : OpenBSDTargetInfo<X86_32TargetInfo>(Triple) {
3321 SizeType = UnsignedLong;
3322 IntPtrType = SignedLong;
3323 PtrDiffType = SignedLong;
3324 }
3325};
3326} // end anonymous namespace
3327
3328namespace {
3329class BitrigI386TargetInfo : public BitrigTargetInfo<X86_32TargetInfo> {
3330public:
3331 BitrigI386TargetInfo(const llvm::Triple &Triple)
3332 : BitrigTargetInfo<X86_32TargetInfo>(Triple) {
3333 SizeType = UnsignedLong;
3334 IntPtrType = SignedLong;
3335 PtrDiffType = SignedLong;
3336 }
3337};
3338} // end anonymous namespace
3339
3340namespace {
3341class DarwinI386TargetInfo : public DarwinTargetInfo<X86_32TargetInfo> {
3342public:
3343 DarwinI386TargetInfo(const llvm::Triple &Triple)
3344 : DarwinTargetInfo<X86_32TargetInfo>(Triple) {
3345 LongDoubleWidth = 128;
3346 LongDoubleAlign = 128;
3347 SuitableAlign = 128;
3348 MaxVectorAlign = 256;
3349 SizeType = UnsignedLong;
3350 IntPtrType = SignedLong;
3351 DescriptionString = "e-m:o-p:32:32-f64:32:64-f80:128-n8:16:32-S128";
3352 HasAlignMac68kSupport = true;
3353 }
3354
3355};
3356} // end anonymous namespace
3357
3358namespace {
3359// x86-32 Windows target
3360class WindowsX86_32TargetInfo : public WindowsTargetInfo<X86_32TargetInfo> {
3361public:
3362 WindowsX86_32TargetInfo(const llvm::Triple &Triple)
3363 : WindowsTargetInfo<X86_32TargetInfo>(Triple) {
3364 WCharType = UnsignedShort;
3365 DoubleAlign = LongLongAlign = 64;
3357 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
3366 bool IsWinCOFF =
3367 getTriple().isOSWindows() && getTriple().isOSBinFormatCOFF();
3368 DescriptionString = IsWinCOFF ? "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32"
3369 : "e-m:e-p:32:32-i64:64-f80:32-n8:16:32-S32";
3358 }
3359 void getTargetDefines(const LangOptions &Opts,
3360 MacroBuilder &Builder) const override {
3361 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3362 }
3363};
3364
3365// x86-32 Windows Visual Studio target
3366class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
3367public:
3368 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
3369 : WindowsX86_32TargetInfo(Triple) {
3370 LongDoubleWidth = LongDoubleAlign = 64;
3371 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3372 }
3373 void getTargetDefines(const LangOptions &Opts,
3374 MacroBuilder &Builder) const override {
3375 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3376 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3377 // The value of the following reflects processor type.
3378 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3379 // We lost the original triple, so we use the default.
3380 Builder.defineMacro("_M_IX86", "600");
3381 }
3382};
3383} // end anonymous namespace
3384
3385static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3386 Builder.defineMacro("__MSVCRT__");
3387 Builder.defineMacro("__MINGW32__");
3388
3389 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3390 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3391 // macro anyway for pre-processor compatibility.
3392 if (Opts.MicrosoftExt)
3393 Builder.defineMacro("__declspec", "__declspec");
3394 else
3395 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3396
3397 if (!Opts.MicrosoftExt) {
3398 // Provide macros for all the calling convention keywords. Provide both
3399 // single and double underscore prefixed variants. These are available on
3400 // x64 as well as x86, even though they have no effect.
3401 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3402 for (const char *CC : CCs) {
3403 std::string GCCSpelling = "__attribute__((__";
3404 GCCSpelling += CC;
3405 GCCSpelling += "__))";
3406 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3407 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3408 }
3409 }
3410}
3411
3412namespace {
3413// x86-32 MinGW target
3414class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3415public:
3416 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3417 : WindowsX86_32TargetInfo(Triple) {}
3418 void getTargetDefines(const LangOptions &Opts,
3419 MacroBuilder &Builder) const override {
3420 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3421 DefineStd(Builder, "WIN32", Opts);
3422 DefineStd(Builder, "WINNT", Opts);
3423 Builder.defineMacro("_X86_");
3424 addMinGWDefines(Opts, Builder);
3425 }
3426};
3427} // end anonymous namespace
3428
3429namespace {
3430// x86-32 Cygwin target
3431class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3432public:
3433 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3434 : X86_32TargetInfo(Triple) {
3435 TLSSupported = false;
3436 WCharType = UnsignedShort;
3437 DoubleAlign = LongLongAlign = 64;
3438 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
3439 }
3440 void getTargetDefines(const LangOptions &Opts,
3441 MacroBuilder &Builder) const override {
3442 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3443 Builder.defineMacro("_X86_");
3444 Builder.defineMacro("__CYGWIN__");
3445 Builder.defineMacro("__CYGWIN32__");
3446 DefineStd(Builder, "unix", Opts);
3447 if (Opts.CPlusPlus)
3448 Builder.defineMacro("_GNU_SOURCE");
3449 }
3450};
3451} // end anonymous namespace
3452
3453namespace {
3454// x86-32 Haiku target
3455class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3456public:
3457 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
3458 SizeType = UnsignedLong;
3459 IntPtrType = SignedLong;
3460 PtrDiffType = SignedLong;
3461 ProcessIDType = SignedLong;
3462 this->UserLabelPrefix = "";
3463 this->TLSSupported = false;
3464 }
3465 void getTargetDefines(const LangOptions &Opts,
3466 MacroBuilder &Builder) const override {
3467 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3468 Builder.defineMacro("__INTEL__");
3469 Builder.defineMacro("__HAIKU__");
3470 }
3471};
3472} // end anonymous namespace
3473
3474// RTEMS Target
3475template<typename Target>
3476class RTEMSTargetInfo : public OSTargetInfo<Target> {
3477protected:
3478 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3479 MacroBuilder &Builder) const override {
3480 // RTEMS defines; list based off of gcc output
3481
3482 Builder.defineMacro("__rtems__");
3483 Builder.defineMacro("__ELF__");
3484 }
3485
3486public:
3487 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3488 this->UserLabelPrefix = "";
3489
3490 switch (Triple.getArch()) {
3491 default:
3492 case llvm::Triple::x86:
3493 // this->MCountName = ".mcount";
3494 break;
3495 case llvm::Triple::mips:
3496 case llvm::Triple::mipsel:
3497 case llvm::Triple::ppc:
3498 case llvm::Triple::ppc64:
3499 case llvm::Triple::ppc64le:
3500 // this->MCountName = "_mcount";
3501 break;
3502 case llvm::Triple::arm:
3503 // this->MCountName = "__mcount";
3504 break;
3505 }
3506 }
3507};
3508
3509namespace {
3510// x86-32 RTEMS target
3511class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3512public:
3513 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
3514 SizeType = UnsignedLong;
3515 IntPtrType = SignedLong;
3516 PtrDiffType = SignedLong;
3517 this->UserLabelPrefix = "";
3518 }
3519 void getTargetDefines(const LangOptions &Opts,
3520 MacroBuilder &Builder) const override {
3521 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3522 Builder.defineMacro("__INTEL__");
3523 Builder.defineMacro("__rtems__");
3524 }
3525};
3526} // end anonymous namespace
3527
3528namespace {
3529// x86-64 generic target
3530class X86_64TargetInfo : public X86TargetInfo {
3531public:
3532 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
3533 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
3534 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
3535 LongDoubleWidth = 128;
3536 LongDoubleAlign = 128;
3537 LargeArrayMinWidth = 128;
3538 LargeArrayAlign = 128;
3539 SuitableAlign = 128;
3540 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3541 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3542 IntPtrType = IsX32 ? SignedInt : SignedLong;
3543 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
3544 Int64Type = IsX32 ? SignedLongLong : SignedLong;
3545 RegParmMax = 6;
3546
3547 // Pointers are 32-bit in x32.
3548 DescriptionString = (IsX32)
3549 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3550 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
3551
3552 // Use fpret only for long double.
3553 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
3554
3555 // Use fp2ret for _Complex long double.
3556 ComplexLongDoubleUsesFP2Ret = true;
3557
3558 // x86-64 has atomics up to 16 bytes.
3559 MaxAtomicPromoteWidth = 128;
3560 MaxAtomicInlineWidth = 128;
3561 }
3562 BuiltinVaListKind getBuiltinVaListKind() const override {
3563 return TargetInfo::X86_64ABIBuiltinVaList;
3564 }
3565
3566 int getEHDataRegisterNumber(unsigned RegNo) const override {
3567 if (RegNo == 0) return 0;
3568 if (RegNo == 1) return 1;
3569 return -1;
3570 }
3571
3572 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
3573 return (CC == CC_C ||
3574 CC == CC_X86VectorCall ||
3575 CC == CC_IntelOclBicc ||
3576 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
3577 }
3578
3579 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
3580 return CC_C;
3581 }
3582
3583 // for x32 we need it here explicitly
3584 bool hasInt128Type() const override { return true; }
3585};
3586} // end anonymous namespace
3587
3588namespace {
3589// x86-64 Windows target
3590class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
3591public:
3592 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3593 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
3594 WCharType = UnsignedShort;
3595 LongWidth = LongAlign = 32;
3596 DoubleAlign = LongLongAlign = 64;
3597 IntMaxType = SignedLongLong;
3598 Int64Type = SignedLongLong;
3599 SizeType = UnsignedLongLong;
3600 PtrDiffType = SignedLongLong;
3601 IntPtrType = SignedLongLong;
3602 this->UserLabelPrefix = "";
3603 }
3604 void getTargetDefines(const LangOptions &Opts,
3605 MacroBuilder &Builder) const override {
3606 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
3607 Builder.defineMacro("_WIN64");
3608 }
3609 BuiltinVaListKind getBuiltinVaListKind() const override {
3610 return TargetInfo::CharPtrBuiltinVaList;
3611 }
3612 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
3613 return (CC == CC_C ||
3614 CC == CC_X86VectorCall ||
3615 CC == CC_IntelOclBicc ||
3616 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3617 }
3618};
3619} // end anonymous namespace
3620
3621namespace {
3622// x86-64 Windows Visual Studio target
3623class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
3624public:
3625 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
3626 : WindowsX86_64TargetInfo(Triple) {
3627 LongDoubleWidth = LongDoubleAlign = 64;
3628 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3629 }
3630 void getTargetDefines(const LangOptions &Opts,
3631 MacroBuilder &Builder) const override {
3632 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3633 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
3634 Builder.defineMacro("_M_X64");
3635 Builder.defineMacro("_M_AMD64");
3636 }
3637};
3638} // end anonymous namespace
3639
3640namespace {
3641// x86-64 MinGW target
3642class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3643public:
3644 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3645 : WindowsX86_64TargetInfo(Triple) {}
3646 void getTargetDefines(const LangOptions &Opts,
3647 MacroBuilder &Builder) const override {
3648 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3649 DefineStd(Builder, "WIN64", Opts);
3650 Builder.defineMacro("__MINGW64__");
3651 addMinGWDefines(Opts, Builder);
3652
3653 // GCC defines this macro when it is using __gxx_personality_seh0.
3654 if (!Opts.SjLjExceptions)
3655 Builder.defineMacro("__SEH__");
3656 }
3657};
3658} // end anonymous namespace
3659
3660namespace {
3661class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3662public:
3663 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3664 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
3665 Int64Type = SignedLongLong;
3666 MaxVectorAlign = 256;
3667 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3668 llvm::Triple T = llvm::Triple(Triple);
3669 if (T.isiOS())
3670 UseSignedCharForObjCBool = false;
3671 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
3672 }
3673};
3674} // end anonymous namespace
3675
3676namespace {
3677class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3678public:
3679 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3680 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
3681 IntMaxType = SignedLongLong;
3682 Int64Type = SignedLongLong;
3683 }
3684};
3685} // end anonymous namespace
3686
3687namespace {
3688class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3689public:
3690 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3691 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3692 IntMaxType = SignedLongLong;
3693 Int64Type = SignedLongLong;
3694 }
3695};
3696}
3697
3698
3699namespace {
3700class ARMTargetInfo : public TargetInfo {
3701 // Possible FPU choices.
3702 enum FPUMode {
3703 VFP2FPU = (1 << 0),
3704 VFP3FPU = (1 << 1),
3705 VFP4FPU = (1 << 2),
3706 NeonFPU = (1 << 3),
3707 FPARMV8 = (1 << 4)
3708 };
3709
3710 // Possible HWDiv features.
3711 enum HWDivMode {
3712 HWDivThumb = (1 << 0),
3713 HWDivARM = (1 << 1)
3714 };
3715
3716 static bool FPUModeIsVFP(FPUMode Mode) {
3717 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
3718 }
3719
3720 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3721 static const char * const GCCRegNames[];
3722
3723 std::string ABI, CPU;
3724
3725 enum {
3726 FP_Default,
3727 FP_VFP,
3728 FP_Neon
3729 } FPMath;
3730
3731 unsigned FPU : 5;
3732
3733 unsigned IsAAPCS : 1;
3734 unsigned IsThumb : 1;
3735 unsigned HWDiv : 2;
3736
3737 // Initialized via features.
3738 unsigned SoftFloat : 1;
3739 unsigned SoftFloatABI : 1;
3740
3741 unsigned CRC : 1;
3742 unsigned Crypto : 1;
3743
3744 // ACLE 6.5.1 Hardware floating point
3745 enum {
3746 HW_FP_HP = (1 << 1), /// half (16-bit)
3747 HW_FP_SP = (1 << 2), /// single (32-bit)
3748 HW_FP_DP = (1 << 3), /// double (64-bit)
3749 };
3750 uint32_t HW_FP;
3751
3752 static const Builtin::Info BuiltinInfo[];
3753
3754 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
3755 StringRef ArchName = T.getArchName();
3756 if (T.getArch() == llvm::Triple::arm ||
3757 T.getArch() == llvm::Triple::armeb) {
3758 StringRef VersionStr;
3759 if (ArchName.startswith("armv"))
3760 VersionStr = ArchName.substr(4, 1);
3761 else if (ArchName.startswith("armebv"))
3762 VersionStr = ArchName.substr(6, 1);
3763 else
3764 return false;
3765 unsigned Version;
3766 if (VersionStr.getAsInteger(10, Version))
3767 return false;
3768 return Version >= 6;
3769 }
3770 assert(T.getArch() == llvm::Triple::thumb ||
3771 T.getArch() == llvm::Triple::thumbeb);
3772 StringRef VersionStr;
3773 if (ArchName.startswith("thumbv"))
3774 VersionStr = ArchName.substr(6, 1);
3775 else if (ArchName.startswith("thumbebv"))
3776 VersionStr = ArchName.substr(8, 1);
3777 else
3778 return false;
3779 unsigned Version;
3780 if (VersionStr.getAsInteger(10, Version))
3781 return false;
3782 return Version >= 7;
3783 }
3784
3785 void setABIAAPCS() {
3786 IsAAPCS = true;
3787
3788 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
3789 const llvm::Triple &T = getTriple();
3790
3791 // size_t is unsigned long on MachO-derived environments and NetBSD.
3792 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD)
3793 SizeType = UnsignedLong;
3794 else
3795 SizeType = UnsignedInt;
3796
3797 switch (T.getOS()) {
3798 case llvm::Triple::NetBSD:
3799 WCharType = SignedInt;
3800 break;
3801 case llvm::Triple::Win32:
3802 WCharType = UnsignedShort;
3803 break;
3804 case llvm::Triple::Linux:
3805 default:
3806 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3807 WCharType = UnsignedInt;
3808 break;
3809 }
3810
3811 UseBitFieldTypeAlignment = true;
3812
3813 ZeroLengthBitfieldBoundary = 0;
3814
3815 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3816 // so set preferred for small types to 32.
3817 if (T.isOSBinFormatMachO()) {
3818 DescriptionString =
3819 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3820 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3821 } else if (T.isOSWindows()) {
3822 // FIXME: this is invalid for WindowsCE
3823 assert(!BigEndian && "Windows on ARM does not support big endian");
3824 DescriptionString = "e"
3825 "-m:e"
3826 "-p:32:32"
3827 "-i64:64"
3828 "-v128:64:128"
3829 "-a:0:32"
3830 "-n32"
3831 "-S64";
3832 } else {
3833 DescriptionString =
3834 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3835 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3836 }
3837
3838 // FIXME: Enumerated types are variable width in straight AAPCS.
3839 }
3840
3841 void setABIAPCS() {
3842 const llvm::Triple &T = getTriple();
3843
3844 IsAAPCS = false;
3845
3846 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
3847
3848 // size_t is unsigned int on FreeBSD.
3849 if (T.getOS() == llvm::Triple::FreeBSD)
3850 SizeType = UnsignedInt;
3851 else
3852 SizeType = UnsignedLong;
3853
3854 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3855 WCharType = SignedInt;
3856
3857 // Do not respect the alignment of bit-field types when laying out
3858 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3859 UseBitFieldTypeAlignment = false;
3860
3861 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3862 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3863 /// gcc.
3864 ZeroLengthBitfieldBoundary = 32;
3865
3866 if (T.isOSBinFormatMachO())
3867 DescriptionString =
3868 BigEndian
3869 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3870 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3871 else
3872 DescriptionString =
3873 BigEndian
3874 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3875 : "e-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3876
3877 // FIXME: Override "preferred align" for double and long long.
3878 }
3879
3880public:
3881 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
3882 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
3883 IsAAPCS(true), HW_FP(0) {
3884 BigEndian = IsBigEndian;
3885
3886 switch (getTriple().getOS()) {
3887 case llvm::Triple::NetBSD:
3888 PtrDiffType = SignedLong;
3889 break;
3890 default:
3891 PtrDiffType = SignedInt;
3892 break;
3893 }
3894
3895 // {} in inline assembly are neon specifiers, not assembly variant
3896 // specifiers.
3897 NoAsmVariants = true;
3898
3899 // FIXME: Should we just treat this as a feature?
3900 IsThumb = getTriple().getArchName().startswith("thumb");
3901
3902 // FIXME: This duplicates code from the driver that sets the -target-abi
3903 // option - this code is used if -target-abi isn't passed and should
3904 // be unified in some way.
3905 if (Triple.isOSBinFormatMachO()) {
3906 // The backend is hardwired to assume AAPCS for M-class processors, ensure
3907 // the frontend matches that.
3908 if (Triple.getEnvironment() == llvm::Triple::EABI ||
3909 Triple.getOS() == llvm::Triple::UnknownOS ||
3910 StringRef(CPU).startswith("cortex-m")) {
3911 setABI("aapcs");
3912 } else {
3913 setABI("apcs-gnu");
3914 }
3915 } else if (Triple.isOSWindows()) {
3916 // FIXME: this is invalid for WindowsCE
3917 setABI("aapcs");
3918 } else {
3919 // Select the default based on the platform.
3920 switch (Triple.getEnvironment()) {
3921 case llvm::Triple::Android:
3922 case llvm::Triple::GNUEABI:
3923 case llvm::Triple::GNUEABIHF:
3924 setABI("aapcs-linux");
3925 break;
3926 case llvm::Triple::EABIHF:
3927 case llvm::Triple::EABI:
3928 setABI("aapcs");
3929 break;
3930 case llvm::Triple::GNU:
3931 setABI("apcs-gnu");
3932 break;
3933 default:
3934 if (Triple.getOS() == llvm::Triple::NetBSD)
3935 setABI("apcs-gnu");
3936 else
3937 setABI("aapcs");
3938 break;
3939 }
3940 }
3941
3942 // ARM targets default to using the ARM C++ ABI.
3943 TheCXXABI.set(TargetCXXABI::GenericARM);
3944
3945 // ARM has atomics up to 8 bytes
3946 MaxAtomicPromoteWidth = 64;
3947 if (shouldUseInlineAtomic(getTriple()))
3948 MaxAtomicInlineWidth = 64;
3949
3950 // Do force alignment of members that follow zero length bitfields. If
3951 // the alignment of the zero-length bitfield is greater than the member
3952 // that follows it, `bar', `bar' will be aligned as the type of the
3953 // zero length bitfield.
3954 UseZeroLengthBitfieldAlignment = true;
3955 }
3956 StringRef getABI() const override { return ABI; }
3957 bool setABI(const std::string &Name) override {
3958 ABI = Name;
3959
3960 // The defaults (above) are for AAPCS, check if we need to change them.
3961 //
3962 // FIXME: We need support for -meabi... we could just mangle it into the
3963 // name.
3964 if (Name == "apcs-gnu") {
3965 setABIAPCS();
3966 return true;
3967 }
3968 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3969 setABIAAPCS();
3970 return true;
3971 }
3972 return false;
3973 }
3974
3975 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
3976 StringRef ArchName = getTriple().getArchName();
3977 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3978 Features["vfp2"] = true;
3979 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
3980 Features["vfp3"] = true;
3981 Features["neon"] = true;
3982 }
3983 else if (CPU == "cortex-a5") {
3984 Features["vfp4"] = true;
3985 Features["neon"] = true;
3986 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3987 CPU == "cortex-a12" || CPU == "cortex-a15" ||
3988 CPU == "cortex-a17" || CPU == "krait") {
3989 Features["vfp4"] = true;
3990 Features["neon"] = true;
3991 Features["hwdiv"] = true;
3992 Features["hwdiv-arm"] = true;
3993 } else if (CPU == "cyclone") {
3994 Features["v8fp"] = true;
3995 Features["neon"] = true;
3996 Features["hwdiv"] = true;
3997 Features["hwdiv-arm"] = true;
3998 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
3999 Features["fp-armv8"] = true;
4000 Features["neon"] = true;
4001 Features["hwdiv"] = true;
4002 Features["hwdiv-arm"] = true;
4003 Features["crc"] = true;
4004 Features["crypto"] = true;
4005 } else if (CPU == "cortex-r5" ||
4006 // Enable the hwdiv extension for all v8a AArch32 cores by
4007 // default.
4008 ArchName == "armv8a" || ArchName == "armv8" ||
4009 ArchName == "armebv8a" || ArchName == "armebv8" ||
4010 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
4011 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
4012 Features["hwdiv"] = true;
4013 Features["hwdiv-arm"] = true;
4014 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7") {
4015 Features["hwdiv"] = true;
4016 }
4017 }
4018
4019 bool handleTargetFeatures(std::vector<std::string> &Features,
4020 DiagnosticsEngine &Diags) override {
4021 FPU = 0;
4022 CRC = 0;
4023 Crypto = 0;
4024 SoftFloat = SoftFloatABI = false;
4025 HWDiv = 0;
4026
4027 for (const auto &Feature : Features) {
4028 if (Feature == "+soft-float") {
4029 SoftFloat = true;
4030 } else if (Feature == "+soft-float-abi") {
4031 SoftFloatABI = true;
4032 } else if (Feature == "+vfp2") {
4033 FPU |= VFP2FPU;
4034 HW_FP = HW_FP_SP | HW_FP_DP;
4035 } else if (Feature == "+vfp3") {
4036 FPU |= VFP3FPU;
4037 HW_FP = HW_FP_SP | HW_FP_DP;
4038 } else if (Feature == "+vfp4") {
4039 FPU |= VFP4FPU;
4040 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4041 } else if (Feature == "+fp-armv8") {
4042 FPU |= FPARMV8;
4043 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4044 } else if (Feature == "+neon") {
4045 FPU |= NeonFPU;
4046 HW_FP = HW_FP_SP | HW_FP_DP;
4047 } else if (Feature == "+hwdiv") {
4048 HWDiv |= HWDivThumb;
4049 } else if (Feature == "+hwdiv-arm") {
4050 HWDiv |= HWDivARM;
4051 } else if (Feature == "+crc") {
4052 CRC = 1;
4053 } else if (Feature == "+crypto") {
4054 Crypto = 1;
4055 } else if (Feature == "+fp-only-sp") {
4056 HW_FP &= ~HW_FP_DP;
4057 }
4058 }
4059
4060 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4061 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4062 return false;
4063 }
4064
4065 if (FPMath == FP_Neon)
4066 Features.push_back("+neonfp");
4067 else if (FPMath == FP_VFP)
4068 Features.push_back("-neonfp");
4069
4070 // Remove front-end specific options which the backend handles differently.
4071 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
4072 for (const auto &FEFeature : FrontEndFeatures) {
4073 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
4074 if (Feature != Features.end())
4075 Features.erase(Feature);
4076 }
4077
4078 return true;
4079 }
4080
4081 bool hasFeature(StringRef Feature) const override {
4082 return llvm::StringSwitch<bool>(Feature)
4083 .Case("arm", true)
4084 .Case("softfloat", SoftFloat)
4085 .Case("thumb", IsThumb)
4086 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
4087 .Case("hwdiv", HWDiv & HWDivThumb)
4088 .Case("hwdiv-arm", HWDiv & HWDivARM)
4089 .Default(false);
4090 }
4091 // FIXME: Should we actually have some table instead of these switches?
4092 static const char *getCPUDefineSuffix(StringRef Name) {
4093 return llvm::StringSwitch<const char *>(Name)
4094 .Cases("arm8", "arm810", "4")
4095 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4096 "4")
4097 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4098 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4099 .Case("ep9312", "4T")
4100 .Cases("arm10tdmi", "arm1020t", "5T")
4101 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4102 .Case("arm926ej-s", "5TEJ")
4103 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4104 .Cases("xscale", "iwmmxt", "5TE")
4105 .Case("arm1136j-s", "6J")
4106 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
4107 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
4108 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4109 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4110 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4111 "7A")
4112 .Cases("cortex-r4", "cortex-r5", "7R")
4113 .Case("swift", "7S")
4114 .Case("cyclone", "8A")
4115 .Case("cortex-m3", "7M")
4116 .Cases("cortex-m4", "cortex-m7", "7EM")
4117 .Case("cortex-m0", "6M")
4118 .Cases("cortex-a53", "cortex-a57", "8A")
4119 .Default(nullptr);
4120 }
4121 static const char *getCPUProfile(StringRef Name) {
4122 return llvm::StringSwitch<const char *>(Name)
4123 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
4124 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4125 "A")
4126 .Cases("cortex-a53", "cortex-a57", "A")
4127 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m7", "M")
4128 .Cases("cortex-r4", "cortex-r5", "R")
4129 .Default("");
4130 }
4131 bool setCPU(const std::string &Name) override {
4132 if (!getCPUDefineSuffix(Name))
4133 return false;
4134
4135 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4136 StringRef Profile = getCPUProfile(Name);
4137 if (Profile == "M" && MaxAtomicInlineWidth) {
4138 MaxAtomicPromoteWidth = 32;
4139 MaxAtomicInlineWidth = 32;
4140 }
4141
4142 CPU = Name;
4143 return true;
4144 }
4145 bool setFPMath(StringRef Name) override;
4146 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4147 unsigned CPUArchVer) const {
4148 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4149 (CPUArch.find('M') != StringRef::npos);
4150 }
4151 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4152 unsigned CPUArchVer) const {
4153 // We check both CPUArchVer and ArchName because when only triple is
4154 // specified, the default CPU is arm1136j-s.
4155 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4156 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4157 }
4158 void getTargetDefines(const LangOptions &Opts,
4159 MacroBuilder &Builder) const override {
4160 // Target identification.
4161 Builder.defineMacro("__arm");
4162 Builder.defineMacro("__arm__");
4163
4164 // Target properties.
4165 Builder.defineMacro("__REGISTER_PREFIX__", "");
4166
4167 StringRef CPUArch = getCPUDefineSuffix(CPU);
4168 unsigned int CPUArchVer;
4169 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
4170 llvm_unreachable("Invalid char for architecture version number");
4171 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
4172
4173 // ACLE 6.4.1 ARM/Thumb instruction set architecture
4174 StringRef CPUProfile = getCPUProfile(CPU);
4175 StringRef ArchName = getTriple().getArchName();
4176
4177 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4178 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
4179 if (CPUArch[0] >= '8') {
4180 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4181 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
4182 }
4183
4184 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4185 // is not defined for the M-profile.
4186 // NOTE that the deffault profile is assumed to be 'A'
4187 if (CPUProfile.empty() || CPUProfile != "M")
4188 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4189
4190 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4191 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4192 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4193 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4194 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4195 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4196 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4197
4198 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4199 // instruction set such as ARM or Thumb.
4200 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4201
4202 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4203
4204 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
4205 if (!CPUProfile.empty())
4206 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
4207
4208 // ACLE 6.5.1 Hardware Floating Point
4209 if (HW_FP)
4210 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
4211
4212 // ACLE predefines.
4213 Builder.defineMacro("__ARM_ACLE", "200");
4214
4215 // Subtarget options.
4216
4217 // FIXME: It's more complicated than this and we don't really support
4218 // interworking.
4219 // Windows on ARM does not "support" interworking
4220 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
4221 Builder.defineMacro("__THUMB_INTERWORK__");
4222
4223 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
4224 // Embedded targets on Darwin follow AAPCS, but not EABI.
4225 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4226 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
4227 Builder.defineMacro("__ARM_EABI__");
4228 Builder.defineMacro("__ARM_PCS", "1");
4229
4230 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
4231 Builder.defineMacro("__ARM_PCS_VFP", "1");
4232 }
4233
4234 if (SoftFloat)
4235 Builder.defineMacro("__SOFTFP__");
4236
4237 if (CPU == "xscale")
4238 Builder.defineMacro("__XSCALE__");
4239
4240 if (IsThumb) {
4241 Builder.defineMacro("__THUMBEL__");
4242 Builder.defineMacro("__thumb__");
4243 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4244 Builder.defineMacro("__thumb2__");
4245 }
4246 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4247 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
4248
4249 // Note, this is always on in gcc, even though it doesn't make sense.
4250 Builder.defineMacro("__APCS_32__");
4251
4252 if (FPUModeIsVFP((FPUMode) FPU)) {
4253 Builder.defineMacro("__VFP_FP__");
4254 if (FPU & VFP2FPU)
4255 Builder.defineMacro("__ARM_VFPV2__");
4256 if (FPU & VFP3FPU)
4257 Builder.defineMacro("__ARM_VFPV3__");
4258 if (FPU & VFP4FPU)
4259 Builder.defineMacro("__ARM_VFPV4__");
4260 }
4261
4262 // This only gets set when Neon instructions are actually available, unlike
4263 // the VFP define, hence the soft float and arch check. This is subtly
4264 // different from gcc, we follow the intent which was that it should be set
4265 // when Neon instructions are actually available.
4266 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4267 Builder.defineMacro("__ARM_NEON");
4268 Builder.defineMacro("__ARM_NEON__");
4269 }
4270
4271 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4272 Opts.ShortWChar ? "2" : "4");
4273
4274 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4275 Opts.ShortEnums ? "1" : "4");
4276
4277 if (CRC)
4278 Builder.defineMacro("__ARM_FEATURE_CRC32");
4279
4280 if (Crypto)
4281 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4282
4283 if (CPUArchVer >= 6 && CPUArch != "6M") {
4284 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4285 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4286 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4287 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4288 }
4289
4290 bool is5EOrAbove = (CPUArchVer >= 6 ||
4291 (CPUArchVer == 5 &&
4292 CPUArch.find('E') != StringRef::npos));
4293 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4294 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4295 Builder.defineMacro("__ARM_FEATURE_DSP");
4296 }
4297 void getTargetBuiltins(const Builtin::Info *&Records,
4298 unsigned &NumRecords) const override {
4299 Records = BuiltinInfo;
4300 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
4301 }
4302 bool isCLZForZeroUndef() const override { return false; }
4303 BuiltinVaListKind getBuiltinVaListKind() const override {
4304 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
4305 }
4306 void getGCCRegNames(const char * const *&Names,
4307 unsigned &NumNames) const override;
4308 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4309 unsigned &NumAliases) const override;
4310 bool validateAsmConstraint(const char *&Name,
4311 TargetInfo::ConstraintInfo &Info) const override {
4312 switch (*Name) {
4313 default: break;
4314 case 'l': // r0-r7
4315 case 'h': // r8-r15
4316 case 'w': // VFP Floating point register single precision
4317 case 'P': // VFP Floating point register double precision
4318 Info.setAllowsRegister();
4319 return true;
4320 case 'I':
4321 case 'J':
4322 case 'K':
4323 case 'L':
4324 case 'M':
4325 // FIXME
4326 return true;
4327 case 'Q': // A memory address that is a single base register.
4328 Info.setAllowsMemory();
4329 return true;
4330 case 'U': // a memory reference...
4331 switch (Name[1]) {
4332 case 'q': // ...ARMV4 ldrsb
4333 case 'v': // ...VFP load/store (reg+constant offset)
4334 case 'y': // ...iWMMXt load/store
4335 case 't': // address valid for load/store opaque types wider
4336 // than 128-bits
4337 case 'n': // valid address for Neon doubleword vector load/store
4338 case 'm': // valid address for Neon element and structure load/store
4339 case 's': // valid address for non-offset loads/stores of quad-word
4340 // values in four ARM registers
4341 Info.setAllowsMemory();
4342 Name++;
4343 return true;
4344 }
4345 }
4346 return false;
4347 }
4348 std::string convertConstraint(const char *&Constraint) const override {
4349 std::string R;
4350 switch (*Constraint) {
4351 case 'U': // Two-character constraint; add "^" hint for later parsing.
4352 R = std::string("^") + std::string(Constraint, 2);
4353 Constraint++;
4354 break;
4355 case 'p': // 'p' should be translated to 'r' by default.
4356 R = std::string("r");
4357 break;
4358 default:
4359 return std::string(1, *Constraint);
4360 }
4361 return R;
4362 }
4363 bool
4364 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
4365 std::string &SuggestedModifier) const override {
4366 bool isOutput = (Constraint[0] == '=');
4367 bool isInOut = (Constraint[0] == '+');
4368
4369 // Strip off constraint modifiers.
4370 while (Constraint[0] == '=' ||
4371 Constraint[0] == '+' ||
4372 Constraint[0] == '&')
4373 Constraint = Constraint.substr(1);
4374
4375 switch (Constraint[0]) {
4376 default: break;
4377 case 'r': {
4378 switch (Modifier) {
4379 default:
4380 return (isInOut || isOutput || Size <= 64);
4381 case 'q':
4382 // A register of size 32 cannot fit a vector type.
4383 return false;
4384 }
4385 }
4386 }
4387
4388 return true;
4389 }
4390 const char *getClobbers() const override {
4391 // FIXME: Is this really right?
4392 return "";
4393 }
4394
4395 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4396 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4397 }
4398
4399 int getEHDataRegisterNumber(unsigned RegNo) const override {
4400 if (RegNo == 0) return 0;
4401 if (RegNo == 1) return 1;
4402 return -1;
4403 }
4404};
4405
4406bool ARMTargetInfo::setFPMath(StringRef Name) {
4407 if (Name == "neon") {
4408 FPMath = FP_Neon;
4409 return true;
4410 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4411 Name == "vfp4") {
4412 FPMath = FP_VFP;
4413 return true;
4414 }
4415 return false;
4416}
4417
4418const char * const ARMTargetInfo::GCCRegNames[] = {
4419 // Integer registers
4420 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4421 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4422
4423 // Float registers
4424 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4425 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4426 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
4427 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4428
4429 // Double registers
4430 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4431 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
4432 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4433 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4434
4435 // Quad registers
4436 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4437 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
4438};
4439
4440void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
4441 unsigned &NumNames) const {
4442 Names = GCCRegNames;
4443 NumNames = llvm::array_lengthof(GCCRegNames);
4444}
4445
4446const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
4447 { { "a1" }, "r0" },
4448 { { "a2" }, "r1" },
4449 { { "a3" }, "r2" },
4450 { { "a4" }, "r3" },
4451 { { "v1" }, "r4" },
4452 { { "v2" }, "r5" },
4453 { { "v3" }, "r6" },
4454 { { "v4" }, "r7" },
4455 { { "v5" }, "r8" },
4456 { { "v6", "rfp" }, "r9" },
4457 { { "sl" }, "r10" },
4458 { { "fp" }, "r11" },
4459 { { "ip" }, "r12" },
4460 { { "r13" }, "sp" },
4461 { { "r14" }, "lr" },
4462 { { "r15" }, "pc" },
4463 // The S, D and Q registers overlap, but aren't really aliases; we
4464 // don't want to substitute one of these for a different-sized one.
4465};
4466
4467void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4468 unsigned &NumAliases) const {
4469 Aliases = GCCRegAliases;
4470 NumAliases = llvm::array_lengthof(GCCRegAliases);
4471}
4472
4473const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
4474#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4475#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4476 ALL_LANGUAGES },
4477#include "clang/Basic/BuiltinsNEON.def"
4478
4479#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4480#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
4481#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4482 ALL_LANGUAGES },
4483#include "clang/Basic/BuiltinsARM.def"
4484};
4485
4486class ARMleTargetInfo : public ARMTargetInfo {
4487public:
4488 ARMleTargetInfo(const llvm::Triple &Triple)
4489 : ARMTargetInfo(Triple, false) { }
4490 virtual void getTargetDefines(const LangOptions &Opts,
4491 MacroBuilder &Builder) const {
4492 Builder.defineMacro("__ARMEL__");
4493 ARMTargetInfo::getTargetDefines(Opts, Builder);
4494 }
4495};
4496
4497class ARMbeTargetInfo : public ARMTargetInfo {
4498public:
4499 ARMbeTargetInfo(const llvm::Triple &Triple)
4500 : ARMTargetInfo(Triple, true) { }
4501 virtual void getTargetDefines(const LangOptions &Opts,
4502 MacroBuilder &Builder) const {
4503 Builder.defineMacro("__ARMEB__");
4504 Builder.defineMacro("__ARM_BIG_ENDIAN");
4505 ARMTargetInfo::getTargetDefines(Opts, Builder);
4506 }
4507};
4508} // end anonymous namespace.
4509
4510namespace {
4511class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4512 const llvm::Triple Triple;
4513public:
4514 WindowsARMTargetInfo(const llvm::Triple &Triple)
4515 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4516 TLSSupported = false;
4517 WCharType = UnsignedShort;
4518 SizeType = UnsignedInt;
4519 UserLabelPrefix = "";
4520 }
4521 void getVisualStudioDefines(const LangOptions &Opts,
4522 MacroBuilder &Builder) const {
4523 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4524
4525 // FIXME: this is invalid for WindowsCE
4526 Builder.defineMacro("_M_ARM_NT", "1");
4527 Builder.defineMacro("_M_ARMT", "_M_ARM");
4528 Builder.defineMacro("_M_THUMB", "_M_ARM");
4529
4530 assert((Triple.getArch() == llvm::Triple::arm ||
4531 Triple.getArch() == llvm::Triple::thumb) &&
4532 "invalid architecture for Windows ARM target info");
4533 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4534 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4535
4536 // TODO map the complete set of values
4537 // 31: VFPv3 40: VFPv4
4538 Builder.defineMacro("_M_ARM_FP", "31");
4539 }
4540 BuiltinVaListKind getBuiltinVaListKind() const override {
4541 return TargetInfo::CharPtrBuiltinVaList;
4542 }
4543};
4544
4545// Windows ARM + Itanium C++ ABI Target
4546class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4547public:
4548 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4549 : WindowsARMTargetInfo(Triple) {
4550 TheCXXABI.set(TargetCXXABI::GenericARM);
4551 }
4552
4553 void getTargetDefines(const LangOptions &Opts,
4554 MacroBuilder &Builder) const override {
4555 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4556
4557 if (Opts.MSVCCompat)
4558 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4559 }
4560};
4561
4562// Windows ARM, MS (C++) ABI
4563class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4564public:
4565 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4566 : WindowsARMTargetInfo(Triple) {
4567 TheCXXABI.set(TargetCXXABI::Microsoft);
4568 }
4569
4570 void getTargetDefines(const LangOptions &Opts,
4571 MacroBuilder &Builder) const override {
4572 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4573 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4574 }
4575};
4576}
4577
4578
4579namespace {
4580class DarwinARMTargetInfo :
4581 public DarwinTargetInfo<ARMleTargetInfo> {
4582protected:
4583 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4584 MacroBuilder &Builder) const override {
4585 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4586 }
4587
4588public:
4589 DarwinARMTargetInfo(const llvm::Triple &Triple)
4590 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
4591 HasAlignMac68kSupport = true;
4592 // iOS always has 64-bit atomic instructions.
4593 // FIXME: This should be based off of the target features in
4594 // ARMleTargetInfo.
4595 MaxAtomicInlineWidth = 64;
4596
4597 // Darwin on iOS uses a variant of the ARM C++ ABI.
4598 TheCXXABI.set(TargetCXXABI::iOS);
4599 }
4600};
4601} // end anonymous namespace.
4602
4603
4604namespace {
4605class AArch64TargetInfo : public TargetInfo {
4606 virtual void setDescriptionString() = 0;
4607 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4608 static const char *const GCCRegNames[];
4609
4610 enum FPUModeEnum {
4611 FPUMode,
4612 NeonMode
4613 };
4614
4615 unsigned FPU;
4616 unsigned CRC;
4617 unsigned Crypto;
4618
4619 static const Builtin::Info BuiltinInfo[];
4620
4621 std::string ABI;
4622
4623public:
4624 AArch64TargetInfo(const llvm::Triple &Triple)
4625 : TargetInfo(Triple), ABI("aapcs") {
4626
4627 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4628 WCharType = SignedInt;
4629
4630 // NetBSD apparently prefers consistency across ARM targets to consistency
4631 // across 64-bit targets.
4632 Int64Type = SignedLongLong;
4633 IntMaxType = SignedLongLong;
4634 } else {
4635 WCharType = UnsignedInt;
4636 Int64Type = SignedLong;
4637 IntMaxType = SignedLong;
4638 }
4639
4640 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
4641 MaxVectorAlign = 128;
4642 RegParmMax = 8;
4643 MaxAtomicInlineWidth = 128;
4644 MaxAtomicPromoteWidth = 128;
4645
4646 LongDoubleWidth = LongDoubleAlign = 128;
4647 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4648
4649 // {} in inline assembly are neon specifiers, not assembly variant
4650 // specifiers.
4651 NoAsmVariants = true;
4652
4653 // AArch64 targets default to using the ARM C++ ABI.
4654 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4655 }
4656
4657 StringRef getABI() const override { return ABI; }
4658 bool setABI(const std::string &Name) override {
4659 if (Name != "aapcs" && Name != "darwinpcs")
4660 return false;
4661
4662 ABI = Name;
4663 return true;
4664 }
4665
4666 bool setCPU(const std::string &Name) override {
4667 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4668 .Case("generic", true)
4669 .Cases("cortex-a53", "cortex-a57", true)
4670 .Case("cyclone", true)
4671 .Default(false);
4672 return CPUKnown;
4673 }
4674
4675 virtual void getTargetDefines(const LangOptions &Opts,
4676 MacroBuilder &Builder) const override {
4677 // Target identification.
4678 Builder.defineMacro("__aarch64__");
4679
4680 // Target properties.
4681 Builder.defineMacro("_LP64");
4682 Builder.defineMacro("__LP64__");
4683
4684 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4685 Builder.defineMacro("__ARM_ACLE", "200");
4686 Builder.defineMacro("__ARM_ARCH", "8");
4687 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4688
4689 Builder.defineMacro("__ARM_64BIT_STATE");
4690 Builder.defineMacro("__ARM_PCS_AAPCS64");
4691 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4692
4693 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4694 Builder.defineMacro("__ARM_FEATURE_CLZ");
4695 Builder.defineMacro("__ARM_FEATURE_FMA");
4696 Builder.defineMacro("__ARM_FEATURE_DIV");
4697 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4698 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4699 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4700 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
4701
4702 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4703
4704 // 0xe implies support for half, single and double precision operations.
4705 Builder.defineMacro("__ARM_FP", "0xe");
4706
4707 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4708 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4709 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4710
4711 if (Opts.FastMath || Opts.FiniteMathOnly)
4712 Builder.defineMacro("__ARM_FP_FAST");
4713
4714 if (Opts.C99 && !Opts.Freestanding)
4715 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4716
4717 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4718
4719 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4720 Opts.ShortEnums ? "1" : "4");
4721
4722 if (FPU == NeonMode) {
4723 Builder.defineMacro("__ARM_NEON");
4724 // 64-bit NEON supports half, single and double precision operations.
4725 Builder.defineMacro("__ARM_NEON_FP", "0xe");
4726 }
4727
4728 if (CRC)
4729 Builder.defineMacro("__ARM_FEATURE_CRC32");
4730
4731 if (Crypto)
4732 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4733 }
4734
4735 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4736 unsigned &NumRecords) const override {
4737 Records = BuiltinInfo;
4738 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
4739 }
4740
4741 bool hasFeature(StringRef Feature) const override {
4742 return Feature == "aarch64" ||
4743 Feature == "arm64" ||
4744 (Feature == "neon" && FPU == NeonMode);
4745 }
4746
4747 bool handleTargetFeatures(std::vector<std::string> &Features,
4748 DiagnosticsEngine &Diags) override {
4749 FPU = FPUMode;
4750 CRC = 0;
4751 Crypto = 0;
4752 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4753 if (Features[i] == "+neon")
4754 FPU = NeonMode;
4755 if (Features[i] == "+crc")
4756 CRC = 1;
4757 if (Features[i] == "+crypto")
4758 Crypto = 1;
4759 }
4760
4761 setDescriptionString();
4762
4763 return true;
4764 }
4765
4766 bool isCLZForZeroUndef() const override { return false; }
4767
4768 BuiltinVaListKind getBuiltinVaListKind() const override {
4769 return TargetInfo::AArch64ABIBuiltinVaList;
4770 }
4771
4772 virtual void getGCCRegNames(const char *const *&Names,
4773 unsigned &NumNames) const override;
4774 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4775 unsigned &NumAliases) const override;
4776
4777 virtual bool
4778 validateAsmConstraint(const char *&Name,
4779 TargetInfo::ConstraintInfo &Info) const override {
4780 switch (*Name) {
4781 default:
4782 return false;
4783 case 'w': // Floating point and SIMD registers (V0-V31)
4784 Info.setAllowsRegister();
4785 return true;
4786 case 'I': // Constant that can be used with an ADD instruction
4787 case 'J': // Constant that can be used with a SUB instruction
4788 case 'K': // Constant that can be used with a 32-bit logical instruction
4789 case 'L': // Constant that can be used with a 64-bit logical instruction
4790 case 'M': // Constant that can be used as a 32-bit MOV immediate
4791 case 'N': // Constant that can be used as a 64-bit MOV immediate
4792 case 'Y': // Floating point constant zero
4793 case 'Z': // Integer constant zero
4794 return true;
4795 case 'Q': // A memory reference with base register and no offset
4796 Info.setAllowsMemory();
4797 return true;
4798 case 'S': // A symbolic address
4799 Info.setAllowsRegister();
4800 return true;
4801 case 'U':
4802 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4803 // Utf: A memory address suitable for ldp/stp in TF mode.
4804 // Usa: An absolute symbolic address.
4805 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4806 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
4807 case 'z': // Zero register, wzr or xzr
4808 Info.setAllowsRegister();
4809 return true;
4810 case 'x': // Floating point and SIMD registers (V0-V15)
4811 Info.setAllowsRegister();
4812 return true;
4813 }
4814 return false;
4815 }
4816
4817 bool
4818 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
4819 std::string &SuggestedModifier) const override {
4820 // Strip off constraint modifiers.
4821 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4822 Constraint = Constraint.substr(1);
4823
4824 switch (Constraint[0]) {
4825 default:
4826 return true;
4827 case 'z':
4828 case 'r': {
4829 switch (Modifier) {
4830 case 'x':
4831 case 'w':
4832 // For now assume that the person knows what they're
4833 // doing with the modifier.
4834 return true;
4835 default:
4836 // By default an 'r' constraint will be in the 'x'
4837 // registers.
4838 if (Size == 64)
4839 return true;
4840
4841 SuggestedModifier = "w";
4842 return false;
4843 }
4844 }
4845 }
4846 }
4847
4848 const char *getClobbers() const override { return ""; }
4849
4850 int getEHDataRegisterNumber(unsigned RegNo) const override {
4851 if (RegNo == 0)
4852 return 0;
4853 if (RegNo == 1)
4854 return 1;
4855 return -1;
4856 }
4857};
4858
4859const char *const AArch64TargetInfo::GCCRegNames[] = {
4860 // 32-bit Integer registers
4861 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4862 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4863 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4864
4865 // 64-bit Integer registers
4866 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4867 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4868 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4869
4870 // 32-bit floating point regsisters
4871 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4872 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4873 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4874
4875 // 64-bit floating point regsisters
4876 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4877 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4878 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4879
4880 // Vector registers
4881 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4882 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4883 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4884};
4885
4886void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
4887 unsigned &NumNames) const {
4888 Names = GCCRegNames;
4889 NumNames = llvm::array_lengthof(GCCRegNames);
4890}
4891
4892const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
4893 { { "w31" }, "wsp" },
4894 { { "x29" }, "fp" },
4895 { { "x30" }, "lr" },
4896 { { "x31" }, "sp" },
4897 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4898 // don't want to substitute one of these for a different-sized one.
4899};
4900
4901void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4902 unsigned &NumAliases) const {
4903 Aliases = GCCRegAliases;
4904 NumAliases = llvm::array_lengthof(GCCRegAliases);
4905}
4906
4907const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
4908#define BUILTIN(ID, TYPE, ATTRS) \
4909 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4910#include "clang/Basic/BuiltinsNEON.def"
4911
4912#define BUILTIN(ID, TYPE, ATTRS) \
4913 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4914#include "clang/Basic/BuiltinsAArch64.def"
4915};
4916
4917class AArch64leTargetInfo : public AArch64TargetInfo {
4918 void setDescriptionString() override {
4919 if (getTriple().isOSBinFormatMachO())
4920 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4921 else
4922 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4923 }
4924
4925public:
4926 AArch64leTargetInfo(const llvm::Triple &Triple)
4927 : AArch64TargetInfo(Triple) {
4928 BigEndian = false;
4929 }
4930 void getTargetDefines(const LangOptions &Opts,
4931 MacroBuilder &Builder) const override {
4932 Builder.defineMacro("__AARCH64EL__");
4933 AArch64TargetInfo::getTargetDefines(Opts, Builder);
4934 }
4935};
4936
4937class AArch64beTargetInfo : public AArch64TargetInfo {
4938 void setDescriptionString() override {
4939 assert(!getTriple().isOSBinFormatMachO());
4940 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4941 }
4942
4943public:
4944 AArch64beTargetInfo(const llvm::Triple &Triple)
4945 : AArch64TargetInfo(Triple) { }
4946 void getTargetDefines(const LangOptions &Opts,
4947 MacroBuilder &Builder) const override {
4948 Builder.defineMacro("__AARCH64EB__");
4949 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4950 Builder.defineMacro("__ARM_BIG_ENDIAN");
4951 AArch64TargetInfo::getTargetDefines(Opts, Builder);
4952 }
4953};
4954} // end anonymous namespace.
4955
4956namespace {
4957class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
4958protected:
4959 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4960 MacroBuilder &Builder) const override {
4961 Builder.defineMacro("__AARCH64_SIMD__");
4962 Builder.defineMacro("__ARM64_ARCH_8__");
4963 Builder.defineMacro("__ARM_NEON__");
4964 Builder.defineMacro("__LITTLE_ENDIAN__");
4965 Builder.defineMacro("__REGISTER_PREFIX__", "");
4966 Builder.defineMacro("__arm64", "1");
4967 Builder.defineMacro("__arm64__", "1");
4968
4969 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4970 }
4971
4972public:
4973 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
4974 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
4975 Int64Type = SignedLongLong;
4976 WCharType = SignedInt;
4977 UseSignedCharForObjCBool = false;
4978
4979 LongDoubleWidth = LongDoubleAlign = 64;
4980 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4981
4982 TheCXXABI.set(TargetCXXABI::iOS64);
4983 }
4984
4985 BuiltinVaListKind getBuiltinVaListKind() const override {
4986 return TargetInfo::CharPtrBuiltinVaList;
4987 }
4988};
4989} // end anonymous namespace
4990
4991namespace {
4992// Hexagon abstract base class
4993class HexagonTargetInfo : public TargetInfo {
4994 static const Builtin::Info BuiltinInfo[];
4995 static const char * const GCCRegNames[];
4996 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4997 std::string CPU;
4998public:
4999 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5000 BigEndian = false;
5001 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
5002
5003 // {} in inline assembly are packet specifiers, not assembly variant
5004 // specifiers.
5005 NoAsmVariants = true;
5006 }
5007
5008 void getTargetBuiltins(const Builtin::Info *&Records,
5009 unsigned &NumRecords) const override {
5010 Records = BuiltinInfo;
5011 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5012 }
5013
5014 bool validateAsmConstraint(const char *&Name,
5015 TargetInfo::ConstraintInfo &Info) const override {
5016 return true;
5017 }
5018
5019 void getTargetDefines(const LangOptions &Opts,
5020 MacroBuilder &Builder) const override;
5021
5022 bool hasFeature(StringRef Feature) const override {
5023 return Feature == "hexagon";
5024 }
5025
5026 BuiltinVaListKind getBuiltinVaListKind() const override {
5027 return TargetInfo::CharPtrBuiltinVaList;
5028 }
5029 void getGCCRegNames(const char * const *&Names,
5030 unsigned &NumNames) const override;
5031 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5032 unsigned &NumAliases) const override;
5033 const char *getClobbers() const override {
5034 return "";
5035 }
5036
5037 static const char *getHexagonCPUSuffix(StringRef Name) {
5038 return llvm::StringSwitch<const char*>(Name)
5039 .Case("hexagonv4", "4")
5040 .Case("hexagonv5", "5")
5041 .Default(nullptr);
5042 }
5043
5044 bool setCPU(const std::string &Name) override {
5045 if (!getHexagonCPUSuffix(Name))
5046 return false;
5047
5048 CPU = Name;
5049 return true;
5050 }
5051};
5052
5053void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5054 MacroBuilder &Builder) const {
5055 Builder.defineMacro("qdsp6");
5056 Builder.defineMacro("__qdsp6", "1");
5057 Builder.defineMacro("__qdsp6__", "1");
5058
5059 Builder.defineMacro("hexagon");
5060 Builder.defineMacro("__hexagon", "1");
5061 Builder.defineMacro("__hexagon__", "1");
5062
5063 if(CPU == "hexagonv1") {
5064 Builder.defineMacro("__HEXAGON_V1__");
5065 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5066 if(Opts.HexagonQdsp6Compat) {
5067 Builder.defineMacro("__QDSP6_V1__");
5068 Builder.defineMacro("__QDSP6_ARCH__", "1");
5069 }
5070 }
5071 else if(CPU == "hexagonv2") {
5072 Builder.defineMacro("__HEXAGON_V2__");
5073 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5074 if(Opts.HexagonQdsp6Compat) {
5075 Builder.defineMacro("__QDSP6_V2__");
5076 Builder.defineMacro("__QDSP6_ARCH__", "2");
5077 }
5078 }
5079 else if(CPU == "hexagonv3") {
5080 Builder.defineMacro("__HEXAGON_V3__");
5081 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5082 if(Opts.HexagonQdsp6Compat) {
5083 Builder.defineMacro("__QDSP6_V3__");
5084 Builder.defineMacro("__QDSP6_ARCH__", "3");
5085 }
5086 }
5087 else if(CPU == "hexagonv4") {
5088 Builder.defineMacro("__HEXAGON_V4__");
5089 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5090 if(Opts.HexagonQdsp6Compat) {
5091 Builder.defineMacro("__QDSP6_V4__");
5092 Builder.defineMacro("__QDSP6_ARCH__", "4");
5093 }
5094 }
5095 else if(CPU == "hexagonv5") {
5096 Builder.defineMacro("__HEXAGON_V5__");
5097 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5098 if(Opts.HexagonQdsp6Compat) {
5099 Builder.defineMacro("__QDSP6_V5__");
5100 Builder.defineMacro("__QDSP6_ARCH__", "5");
5101 }
5102 }
5103}
5104
5105const char * const HexagonTargetInfo::GCCRegNames[] = {
5106 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5107 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5108 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5109 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5110 "p0", "p1", "p2", "p3",
5111 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5112};
5113
5114void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5115 unsigned &NumNames) const {
5116 Names = GCCRegNames;
5117 NumNames = llvm::array_lengthof(GCCRegNames);
5118}
5119
5120
5121const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5122 { { "sp" }, "r29" },
5123 { { "fp" }, "r30" },
5124 { { "lr" }, "r31" },
5125 };
5126
5127void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5128 unsigned &NumAliases) const {
5129 Aliases = GCCRegAliases;
5130 NumAliases = llvm::array_lengthof(GCCRegAliases);
5131}
5132
5133
5134const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5135#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5136#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5137 ALL_LANGUAGES },
5138#include "clang/Basic/BuiltinsHexagon.def"
5139};
5140}
5141
5142
5143namespace {
5144// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5145class SparcTargetInfo : public TargetInfo {
5146 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5147 static const char * const GCCRegNames[];
5148 bool SoftFloat;
5149public:
5150 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
5151
5152 bool handleTargetFeatures(std::vector<std::string> &Features,
5153 DiagnosticsEngine &Diags) override {
5154 SoftFloat = false;
5155 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5156 if (Features[i] == "+soft-float")
5157 SoftFloat = true;
5158 return true;
5159 }
5160 void getTargetDefines(const LangOptions &Opts,
5161 MacroBuilder &Builder) const override {
5162 DefineStd(Builder, "sparc", Opts);
5163 Builder.defineMacro("__REGISTER_PREFIX__", "");
5164
5165 if (SoftFloat)
5166 Builder.defineMacro("SOFT_FLOAT", "1");
5167 }
5168
5169 bool hasFeature(StringRef Feature) const override {
5170 return llvm::StringSwitch<bool>(Feature)
5171 .Case("softfloat", SoftFloat)
5172 .Case("sparc", true)
5173 .Default(false);
5174 }
5175
5176 void getTargetBuiltins(const Builtin::Info *&Records,
5177 unsigned &NumRecords) const override {
5178 // FIXME: Implement!
5179 }
5180 BuiltinVaListKind getBuiltinVaListKind() const override {
5181 return TargetInfo::VoidPtrBuiltinVaList;
5182 }
5183 void getGCCRegNames(const char * const *&Names,
5184 unsigned &NumNames) const override;
5185 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5186 unsigned &NumAliases) const override;
5187 bool validateAsmConstraint(const char *&Name,
5188 TargetInfo::ConstraintInfo &info) const override {
5189 // FIXME: Implement!
5190 switch (*Name) {
5191 case 'I': // Signed 13-bit constant
5192 case 'J': // Zero
5193 case 'K': // 32-bit constant with the low 12 bits clear
5194 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5195 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5196 case 'N': // Same as 'K' but zext (required for SIMode)
5197 case 'O': // The constant 4096
5198 return true;
5199 }
5200 return false;
5201 }
5202 const char *getClobbers() const override {
5203 // FIXME: Implement!
5204 return "";
5205 }
5206};
5207
5208const char * const SparcTargetInfo::GCCRegNames[] = {
5209 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5210 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5211 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5212 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5213};
5214
5215void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5216 unsigned &NumNames) const {
5217 Names = GCCRegNames;
5218 NumNames = llvm::array_lengthof(GCCRegNames);
5219}
5220
5221const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
5222 { { "g0" }, "r0" },
5223 { { "g1" }, "r1" },
5224 { { "g2" }, "r2" },
5225 { { "g3" }, "r3" },
5226 { { "g4" }, "r4" },
5227 { { "g5" }, "r5" },
5228 { { "g6" }, "r6" },
5229 { { "g7" }, "r7" },
5230 { { "o0" }, "r8" },
5231 { { "o1" }, "r9" },
5232 { { "o2" }, "r10" },
5233 { { "o3" }, "r11" },
5234 { { "o4" }, "r12" },
5235 { { "o5" }, "r13" },
5236 { { "o6", "sp" }, "r14" },
5237 { { "o7" }, "r15" },
5238 { { "l0" }, "r16" },
5239 { { "l1" }, "r17" },
5240 { { "l2" }, "r18" },
5241 { { "l3" }, "r19" },
5242 { { "l4" }, "r20" },
5243 { { "l5" }, "r21" },
5244 { { "l6" }, "r22" },
5245 { { "l7" }, "r23" },
5246 { { "i0" }, "r24" },
5247 { { "i1" }, "r25" },
5248 { { "i2" }, "r26" },
5249 { { "i3" }, "r27" },
5250 { { "i4" }, "r28" },
5251 { { "i5" }, "r29" },
5252 { { "i6", "fp" }, "r30" },
5253 { { "i7" }, "r31" },
5254};
5255
5256void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5257 unsigned &NumAliases) const {
5258 Aliases = GCCRegAliases;
5259 NumAliases = llvm::array_lengthof(GCCRegAliases);
5260}
5261
5262// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5263class SparcV8TargetInfo : public SparcTargetInfo {
5264public:
5265 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
5266 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
5267 }
5268
5269 void getTargetDefines(const LangOptions &Opts,
5270 MacroBuilder &Builder) const override {
5271 SparcTargetInfo::getTargetDefines(Opts, Builder);
5272 Builder.defineMacro("__sparcv8");
5273 }
5274};
5275
5276// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5277class SparcV9TargetInfo : public SparcTargetInfo {
5278public:
5279 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
5280 // FIXME: Support Sparc quad-precision long double?
5281 DescriptionString = "E-m:e-i64:64-n32:64-S128";
5282 // This is an LP64 platform.
5283 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
5284
5285 // OpenBSD uses long long for int64_t and intmax_t.
5286 if (getTriple().getOS() == llvm::Triple::OpenBSD)
5287 IntMaxType = SignedLongLong;
5288 else
5289 IntMaxType = SignedLong;
5290 Int64Type = IntMaxType;
5291
5292 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5293 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5294 LongDoubleWidth = 128;
5295 LongDoubleAlign = 128;
5296 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5297 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5298 }
5299
5300 void getTargetDefines(const LangOptions &Opts,
5301 MacroBuilder &Builder) const override {
5302 SparcTargetInfo::getTargetDefines(Opts, Builder);
5303 Builder.defineMacro("__sparcv9");
5304 Builder.defineMacro("__arch64__");
5305 // Solaris doesn't need these variants, but the BSDs do.
5306 if (getTriple().getOS() != llvm::Triple::Solaris) {
5307 Builder.defineMacro("__sparc64__");
5308 Builder.defineMacro("__sparc_v9__");
5309 Builder.defineMacro("__sparcv9__");
5310 }
5311 }
5312
5313 bool setCPU(const std::string &Name) override {
5314 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5315 .Case("v9", true)
5316 .Case("ultrasparc", true)
5317 .Case("ultrasparc3", true)
5318 .Case("niagara", true)
5319 .Case("niagara2", true)
5320 .Case("niagara3", true)
5321 .Case("niagara4", true)
5322 .Default(false);
5323
5324 // No need to store the CPU yet. There aren't any CPU-specific
5325 // macros to define.
5326 return CPUKnown;
5327 }
5328};
5329
5330} // end anonymous namespace.
5331
5332namespace {
5333class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
5334public:
5335 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5336 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
5337 SizeType = UnsignedInt;
5338 PtrDiffType = SignedInt;
5339 }
5340};
5341} // end anonymous namespace.
5342
5343namespace {
5344class SystemZTargetInfo : public TargetInfo {
5345 static const char *const GCCRegNames[];
5346
5347public:
5348 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5349 TLSSupported = true;
5350 IntWidth = IntAlign = 32;
5351 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5352 PointerWidth = PointerAlign = 64;
5353 LongDoubleWidth = 128;
5354 LongDoubleAlign = 64;
5355 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5356 MinGlobalAlign = 16;
5357 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5358 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5359 }
5360 void getTargetDefines(const LangOptions &Opts,
5361 MacroBuilder &Builder) const override {
5362 Builder.defineMacro("__s390__");
5363 Builder.defineMacro("__s390x__");
5364 Builder.defineMacro("__zarch__");
5365 Builder.defineMacro("__LONG_DOUBLE_128__");
5366 }
5367 void getTargetBuiltins(const Builtin::Info *&Records,
5368 unsigned &NumRecords) const override {
5369 // FIXME: Implement.
5370 Records = nullptr;
5371 NumRecords = 0;
5372 }
5373
5374 void getGCCRegNames(const char *const *&Names,
5375 unsigned &NumNames) const override;
5376 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5377 unsigned &NumAliases) const override {
5378 // No aliases.
5379 Aliases = nullptr;
5380 NumAliases = 0;
5381 }
5382 bool validateAsmConstraint(const char *&Name,
5383 TargetInfo::ConstraintInfo &info) const override;
5384 const char *getClobbers() const override {
5385 // FIXME: Is this really right?
5386 return "";
5387 }
5388 BuiltinVaListKind getBuiltinVaListKind() const override {
5389 return TargetInfo::SystemZBuiltinVaList;
5390 }
5391 bool setCPU(const std::string &Name) override {
5392 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5393 .Case("z10", true)
5394 .Case("z196", true)
5395 .Case("zEC12", true)
5396 .Default(false);
5397
5398 // No need to store the CPU yet. There aren't any CPU-specific
5399 // macros to define.
5400 return CPUKnown;
5401 }
5402};
5403
5404const char *const SystemZTargetInfo::GCCRegNames[] = {
5405 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5406 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5407 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5408 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5409};
5410
5411void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5412 unsigned &NumNames) const {
5413 Names = GCCRegNames;
5414 NumNames = llvm::array_lengthof(GCCRegNames);
5415}
5416
5417bool SystemZTargetInfo::
5418validateAsmConstraint(const char *&Name,
5419 TargetInfo::ConstraintInfo &Info) const {
5420 switch (*Name) {
5421 default:
5422 return false;
5423
5424 case 'a': // Address register
5425 case 'd': // Data register (equivalent to 'r')
5426 case 'f': // Floating-point register
5427 Info.setAllowsRegister();
5428 return true;
5429
5430 case 'I': // Unsigned 8-bit constant
5431 case 'J': // Unsigned 12-bit constant
5432 case 'K': // Signed 16-bit constant
5433 case 'L': // Signed 20-bit displacement (on all targets we support)
5434 case 'M': // 0x7fffffff
5435 return true;
5436
5437 case 'Q': // Memory with base and unsigned 12-bit displacement
5438 case 'R': // Likewise, plus an index
5439 case 'S': // Memory with base and signed 20-bit displacement
5440 case 'T': // Likewise, plus an index
5441 Info.setAllowsMemory();
5442 return true;
5443 }
5444}
5445}
5446
5447namespace {
5448 class MSP430TargetInfo : public TargetInfo {
5449 static const char * const GCCRegNames[];
5450 public:
5451 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5452 BigEndian = false;
5453 TLSSupported = false;
5454 IntWidth = 16; IntAlign = 16;
5455 LongWidth = 32; LongLongWidth = 64;
5456 LongAlign = LongLongAlign = 16;
5457 PointerWidth = 16; PointerAlign = 16;
5458 SuitableAlign = 16;
5459 SizeType = UnsignedInt;
5460 IntMaxType = SignedLongLong;
5461 IntPtrType = SignedInt;
5462 PtrDiffType = SignedInt;
5463 SigAtomicType = SignedLong;
5464 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
5465 }
5466 void getTargetDefines(const LangOptions &Opts,
5467 MacroBuilder &Builder) const override {
5468 Builder.defineMacro("MSP430");
5469 Builder.defineMacro("__MSP430__");
5470 // FIXME: defines for different 'flavours' of MCU
5471 }
5472 void getTargetBuiltins(const Builtin::Info *&Records,
5473 unsigned &NumRecords) const override {
5474 // FIXME: Implement.
5475 Records = nullptr;
5476 NumRecords = 0;
5477 }
5478 bool hasFeature(StringRef Feature) const override {
5479 return Feature == "msp430";
5480 }
5481 void getGCCRegNames(const char * const *&Names,
5482 unsigned &NumNames) const override;
5483 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5484 unsigned &NumAliases) const override {
5485 // No aliases.
5486 Aliases = nullptr;
5487 NumAliases = 0;
5488 }
5489 bool
5490 validateAsmConstraint(const char *&Name,
5491 TargetInfo::ConstraintInfo &info) const override {
5492 // FIXME: implement
5493 switch (*Name) {
5494 case 'K': // the constant 1
5495 case 'L': // constant -1^20 .. 1^19
5496 case 'M': // constant 1-4:
5497 return true;
5498 }
5499 // No target constraints for now.
5500 return false;
5501 }
5502 const char *getClobbers() const override {
5503 // FIXME: Is this really right?
5504 return "";
5505 }
5506 BuiltinVaListKind getBuiltinVaListKind() const override {
5507 // FIXME: implement
5508 return TargetInfo::CharPtrBuiltinVaList;
5509 }
5510 };
5511
5512 const char * const MSP430TargetInfo::GCCRegNames[] = {
5513 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5514 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5515 };
5516
5517 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5518 unsigned &NumNames) const {
5519 Names = GCCRegNames;
5520 NumNames = llvm::array_lengthof(GCCRegNames);
5521 }
5522}
5523
5524namespace {
5525
5526 // LLVM and Clang cannot be used directly to output native binaries for
5527 // target, but is used to compile C code to llvm bitcode with correct
5528 // type and alignment information.
5529 //
5530 // TCE uses the llvm bitcode as input and uses it for generating customized
5531 // target processor and program binary. TCE co-design environment is
5532 // publicly available in http://tce.cs.tut.fi
5533
5534 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5535 3, // opencl_global
5536 4, // opencl_local
5537 5, // opencl_constant
5538 // FIXME: generic has to be added to the target
5539 0, // opencl_generic
5540 0, // cuda_device
5541 0, // cuda_constant
5542 0 // cuda_shared
5543 };
5544
5545 class TCETargetInfo : public TargetInfo{
5546 public:
5547 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5548 TLSSupported = false;
5549 IntWidth = 32;
5550 LongWidth = LongLongWidth = 32;
5551 PointerWidth = 32;
5552 IntAlign = 32;
5553 LongAlign = LongLongAlign = 32;
5554 PointerAlign = 32;
5555 SuitableAlign = 32;
5556 SizeType = UnsignedInt;
5557 IntMaxType = SignedLong;
5558 IntPtrType = SignedInt;
5559 PtrDiffType = SignedInt;
5560 FloatWidth = 32;
5561 FloatAlign = 32;
5562 DoubleWidth = 32;
5563 DoubleAlign = 32;
5564 LongDoubleWidth = 32;
5565 LongDoubleAlign = 32;
5566 FloatFormat = &llvm::APFloat::IEEEsingle;
5567 DoubleFormat = &llvm::APFloat::IEEEsingle;
5568 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
5569 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5570 "-f64:32-v64:32-v128:32-a:0:32-n32";
5571 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
5572 UseAddrSpaceMapMangling = true;
5573 }
5574
5575 void getTargetDefines(const LangOptions &Opts,
5576 MacroBuilder &Builder) const override {
5577 DefineStd(Builder, "tce", Opts);
5578 Builder.defineMacro("__TCE__");
5579 Builder.defineMacro("__TCE_V1__");
5580 }
5581 bool hasFeature(StringRef Feature) const override {
5582 return Feature == "tce";
5583 }
5584
5585 void getTargetBuiltins(const Builtin::Info *&Records,
5586 unsigned &NumRecords) const override {}
5587 const char *getClobbers() const override {
5588 return "";
5589 }
5590 BuiltinVaListKind getBuiltinVaListKind() const override {
5591 return TargetInfo::VoidPtrBuiltinVaList;
5592 }
5593 void getGCCRegNames(const char * const *&Names,
5594 unsigned &NumNames) const override {}
5595 bool validateAsmConstraint(const char *&Name,
5596 TargetInfo::ConstraintInfo &info) const override{
5597 return true;
5598 }
5599 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5600 unsigned &NumAliases) const override {}
5601 };
5602}
5603
5604namespace {
5605class MipsTargetInfoBase : public TargetInfo {
5606 virtual void setDescriptionString() = 0;
5607
5608 static const Builtin::Info BuiltinInfo[];
5609 std::string CPU;
5610 bool IsMips16;
5611 bool IsMicromips;
5612 bool IsNan2008;
5613 bool IsSingleFloat;
5614 enum MipsFloatABI {
5615 HardFloat, SoftFloat
5616 } FloatABI;
5617 enum DspRevEnum {
5618 NoDSP, DSP1, DSP2
5619 } DspRev;
5620 bool HasMSA;
5621
5622protected:
5623 bool HasFP64;
5624 std::string ABI;
5625
5626public:
5627 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5628 const std::string &CPUStr)
5629 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
5630 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
3370 }
3371 void getTargetDefines(const LangOptions &Opts,
3372 MacroBuilder &Builder) const override {
3373 WindowsTargetInfo<X86_32TargetInfo>::getTargetDefines(Opts, Builder);
3374 }
3375};
3376
3377// x86-32 Windows Visual Studio target
3378class MicrosoftX86_32TargetInfo : public WindowsX86_32TargetInfo {
3379public:
3380 MicrosoftX86_32TargetInfo(const llvm::Triple &Triple)
3381 : WindowsX86_32TargetInfo(Triple) {
3382 LongDoubleWidth = LongDoubleAlign = 64;
3383 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3384 }
3385 void getTargetDefines(const LangOptions &Opts,
3386 MacroBuilder &Builder) const override {
3387 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3388 WindowsX86_32TargetInfo::getVisualStudioDefines(Opts, Builder);
3389 // The value of the following reflects processor type.
3390 // 300=386, 400=486, 500=Pentium, 600=Blend (default)
3391 // We lost the original triple, so we use the default.
3392 Builder.defineMacro("_M_IX86", "600");
3393 }
3394};
3395} // end anonymous namespace
3396
3397static void addMinGWDefines(const LangOptions &Opts, MacroBuilder &Builder) {
3398 Builder.defineMacro("__MSVCRT__");
3399 Builder.defineMacro("__MINGW32__");
3400
3401 // Mingw defines __declspec(a) to __attribute__((a)). Clang supports
3402 // __declspec natively under -fms-extensions, but we define a no-op __declspec
3403 // macro anyway for pre-processor compatibility.
3404 if (Opts.MicrosoftExt)
3405 Builder.defineMacro("__declspec", "__declspec");
3406 else
3407 Builder.defineMacro("__declspec(a)", "__attribute__((a))");
3408
3409 if (!Opts.MicrosoftExt) {
3410 // Provide macros for all the calling convention keywords. Provide both
3411 // single and double underscore prefixed variants. These are available on
3412 // x64 as well as x86, even though they have no effect.
3413 const char *CCs[] = {"cdecl", "stdcall", "fastcall", "thiscall", "pascal"};
3414 for (const char *CC : CCs) {
3415 std::string GCCSpelling = "__attribute__((__";
3416 GCCSpelling += CC;
3417 GCCSpelling += "__))";
3418 Builder.defineMacro(Twine("_") + CC, GCCSpelling);
3419 Builder.defineMacro(Twine("__") + CC, GCCSpelling);
3420 }
3421 }
3422}
3423
3424namespace {
3425// x86-32 MinGW target
3426class MinGWX86_32TargetInfo : public WindowsX86_32TargetInfo {
3427public:
3428 MinGWX86_32TargetInfo(const llvm::Triple &Triple)
3429 : WindowsX86_32TargetInfo(Triple) {}
3430 void getTargetDefines(const LangOptions &Opts,
3431 MacroBuilder &Builder) const override {
3432 WindowsX86_32TargetInfo::getTargetDefines(Opts, Builder);
3433 DefineStd(Builder, "WIN32", Opts);
3434 DefineStd(Builder, "WINNT", Opts);
3435 Builder.defineMacro("_X86_");
3436 addMinGWDefines(Opts, Builder);
3437 }
3438};
3439} // end anonymous namespace
3440
3441namespace {
3442// x86-32 Cygwin target
3443class CygwinX86_32TargetInfo : public X86_32TargetInfo {
3444public:
3445 CygwinX86_32TargetInfo(const llvm::Triple &Triple)
3446 : X86_32TargetInfo(Triple) {
3447 TLSSupported = false;
3448 WCharType = UnsignedShort;
3449 DoubleAlign = LongLongAlign = 64;
3450 DescriptionString = "e-m:w-p:32:32-i64:64-f80:32-n8:16:32-S32";
3451 }
3452 void getTargetDefines(const LangOptions &Opts,
3453 MacroBuilder &Builder) const override {
3454 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3455 Builder.defineMacro("_X86_");
3456 Builder.defineMacro("__CYGWIN__");
3457 Builder.defineMacro("__CYGWIN32__");
3458 DefineStd(Builder, "unix", Opts);
3459 if (Opts.CPlusPlus)
3460 Builder.defineMacro("_GNU_SOURCE");
3461 }
3462};
3463} // end anonymous namespace
3464
3465namespace {
3466// x86-32 Haiku target
3467class HaikuX86_32TargetInfo : public X86_32TargetInfo {
3468public:
3469 HaikuX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
3470 SizeType = UnsignedLong;
3471 IntPtrType = SignedLong;
3472 PtrDiffType = SignedLong;
3473 ProcessIDType = SignedLong;
3474 this->UserLabelPrefix = "";
3475 this->TLSSupported = false;
3476 }
3477 void getTargetDefines(const LangOptions &Opts,
3478 MacroBuilder &Builder) const override {
3479 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3480 Builder.defineMacro("__INTEL__");
3481 Builder.defineMacro("__HAIKU__");
3482 }
3483};
3484} // end anonymous namespace
3485
3486// RTEMS Target
3487template<typename Target>
3488class RTEMSTargetInfo : public OSTargetInfo<Target> {
3489protected:
3490 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
3491 MacroBuilder &Builder) const override {
3492 // RTEMS defines; list based off of gcc output
3493
3494 Builder.defineMacro("__rtems__");
3495 Builder.defineMacro("__ELF__");
3496 }
3497
3498public:
3499 RTEMSTargetInfo(const llvm::Triple &Triple) : OSTargetInfo<Target>(Triple) {
3500 this->UserLabelPrefix = "";
3501
3502 switch (Triple.getArch()) {
3503 default:
3504 case llvm::Triple::x86:
3505 // this->MCountName = ".mcount";
3506 break;
3507 case llvm::Triple::mips:
3508 case llvm::Triple::mipsel:
3509 case llvm::Triple::ppc:
3510 case llvm::Triple::ppc64:
3511 case llvm::Triple::ppc64le:
3512 // this->MCountName = "_mcount";
3513 break;
3514 case llvm::Triple::arm:
3515 // this->MCountName = "__mcount";
3516 break;
3517 }
3518 }
3519};
3520
3521namespace {
3522// x86-32 RTEMS target
3523class RTEMSX86_32TargetInfo : public X86_32TargetInfo {
3524public:
3525 RTEMSX86_32TargetInfo(const llvm::Triple &Triple) : X86_32TargetInfo(Triple) {
3526 SizeType = UnsignedLong;
3527 IntPtrType = SignedLong;
3528 PtrDiffType = SignedLong;
3529 this->UserLabelPrefix = "";
3530 }
3531 void getTargetDefines(const LangOptions &Opts,
3532 MacroBuilder &Builder) const override {
3533 X86_32TargetInfo::getTargetDefines(Opts, Builder);
3534 Builder.defineMacro("__INTEL__");
3535 Builder.defineMacro("__rtems__");
3536 }
3537};
3538} // end anonymous namespace
3539
3540namespace {
3541// x86-64 generic target
3542class X86_64TargetInfo : public X86TargetInfo {
3543public:
3544 X86_64TargetInfo(const llvm::Triple &Triple) : X86TargetInfo(Triple) {
3545 const bool IsX32 = getTriple().getEnvironment() == llvm::Triple::GNUX32;
3546 LongWidth = LongAlign = PointerWidth = PointerAlign = IsX32 ? 32 : 64;
3547 LongDoubleWidth = 128;
3548 LongDoubleAlign = 128;
3549 LargeArrayMinWidth = 128;
3550 LargeArrayAlign = 128;
3551 SuitableAlign = 128;
3552 SizeType = IsX32 ? UnsignedInt : UnsignedLong;
3553 PtrDiffType = IsX32 ? SignedInt : SignedLong;
3554 IntPtrType = IsX32 ? SignedInt : SignedLong;
3555 IntMaxType = IsX32 ? SignedLongLong : SignedLong;
3556 Int64Type = IsX32 ? SignedLongLong : SignedLong;
3557 RegParmMax = 6;
3558
3559 // Pointers are 32-bit in x32.
3560 DescriptionString = (IsX32)
3561 ? "e-m:e-p:32:32-i64:64-f80:128-n8:16:32:64-S128"
3562 : "e-m:e-i64:64-f80:128-n8:16:32:64-S128";
3563
3564 // Use fpret only for long double.
3565 RealTypeUsesObjCFPRet = (1 << TargetInfo::LongDouble);
3566
3567 // Use fp2ret for _Complex long double.
3568 ComplexLongDoubleUsesFP2Ret = true;
3569
3570 // x86-64 has atomics up to 16 bytes.
3571 MaxAtomicPromoteWidth = 128;
3572 MaxAtomicInlineWidth = 128;
3573 }
3574 BuiltinVaListKind getBuiltinVaListKind() const override {
3575 return TargetInfo::X86_64ABIBuiltinVaList;
3576 }
3577
3578 int getEHDataRegisterNumber(unsigned RegNo) const override {
3579 if (RegNo == 0) return 0;
3580 if (RegNo == 1) return 1;
3581 return -1;
3582 }
3583
3584 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
3585 return (CC == CC_C ||
3586 CC == CC_X86VectorCall ||
3587 CC == CC_IntelOclBicc ||
3588 CC == CC_X86_64Win64) ? CCCR_OK : CCCR_Warning;
3589 }
3590
3591 CallingConv getDefaultCallingConv(CallingConvMethodType MT) const override {
3592 return CC_C;
3593 }
3594
3595 // for x32 we need it here explicitly
3596 bool hasInt128Type() const override { return true; }
3597};
3598} // end anonymous namespace
3599
3600namespace {
3601// x86-64 Windows target
3602class WindowsX86_64TargetInfo : public WindowsTargetInfo<X86_64TargetInfo> {
3603public:
3604 WindowsX86_64TargetInfo(const llvm::Triple &Triple)
3605 : WindowsTargetInfo<X86_64TargetInfo>(Triple) {
3606 WCharType = UnsignedShort;
3607 LongWidth = LongAlign = 32;
3608 DoubleAlign = LongLongAlign = 64;
3609 IntMaxType = SignedLongLong;
3610 Int64Type = SignedLongLong;
3611 SizeType = UnsignedLongLong;
3612 PtrDiffType = SignedLongLong;
3613 IntPtrType = SignedLongLong;
3614 this->UserLabelPrefix = "";
3615 }
3616 void getTargetDefines(const LangOptions &Opts,
3617 MacroBuilder &Builder) const override {
3618 WindowsTargetInfo<X86_64TargetInfo>::getTargetDefines(Opts, Builder);
3619 Builder.defineMacro("_WIN64");
3620 }
3621 BuiltinVaListKind getBuiltinVaListKind() const override {
3622 return TargetInfo::CharPtrBuiltinVaList;
3623 }
3624 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
3625 return (CC == CC_C ||
3626 CC == CC_X86VectorCall ||
3627 CC == CC_IntelOclBicc ||
3628 CC == CC_X86_64SysV) ? CCCR_OK : CCCR_Warning;
3629 }
3630};
3631} // end anonymous namespace
3632
3633namespace {
3634// x86-64 Windows Visual Studio target
3635class MicrosoftX86_64TargetInfo : public WindowsX86_64TargetInfo {
3636public:
3637 MicrosoftX86_64TargetInfo(const llvm::Triple &Triple)
3638 : WindowsX86_64TargetInfo(Triple) {
3639 LongDoubleWidth = LongDoubleAlign = 64;
3640 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
3641 }
3642 void getTargetDefines(const LangOptions &Opts,
3643 MacroBuilder &Builder) const override {
3644 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3645 WindowsX86_64TargetInfo::getVisualStudioDefines(Opts, Builder);
3646 Builder.defineMacro("_M_X64");
3647 Builder.defineMacro("_M_AMD64");
3648 }
3649};
3650} // end anonymous namespace
3651
3652namespace {
3653// x86-64 MinGW target
3654class MinGWX86_64TargetInfo : public WindowsX86_64TargetInfo {
3655public:
3656 MinGWX86_64TargetInfo(const llvm::Triple &Triple)
3657 : WindowsX86_64TargetInfo(Triple) {}
3658 void getTargetDefines(const LangOptions &Opts,
3659 MacroBuilder &Builder) const override {
3660 WindowsX86_64TargetInfo::getTargetDefines(Opts, Builder);
3661 DefineStd(Builder, "WIN64", Opts);
3662 Builder.defineMacro("__MINGW64__");
3663 addMinGWDefines(Opts, Builder);
3664
3665 // GCC defines this macro when it is using __gxx_personality_seh0.
3666 if (!Opts.SjLjExceptions)
3667 Builder.defineMacro("__SEH__");
3668 }
3669};
3670} // end anonymous namespace
3671
3672namespace {
3673class DarwinX86_64TargetInfo : public DarwinTargetInfo<X86_64TargetInfo> {
3674public:
3675 DarwinX86_64TargetInfo(const llvm::Triple &Triple)
3676 : DarwinTargetInfo<X86_64TargetInfo>(Triple) {
3677 Int64Type = SignedLongLong;
3678 MaxVectorAlign = 256;
3679 // The 64-bit iOS simulator uses the builtin bool type for Objective-C.
3680 llvm::Triple T = llvm::Triple(Triple);
3681 if (T.isiOS())
3682 UseSignedCharForObjCBool = false;
3683 DescriptionString = "e-m:o-i64:64-f80:128-n8:16:32:64-S128";
3684 }
3685};
3686} // end anonymous namespace
3687
3688namespace {
3689class OpenBSDX86_64TargetInfo : public OpenBSDTargetInfo<X86_64TargetInfo> {
3690public:
3691 OpenBSDX86_64TargetInfo(const llvm::Triple &Triple)
3692 : OpenBSDTargetInfo<X86_64TargetInfo>(Triple) {
3693 IntMaxType = SignedLongLong;
3694 Int64Type = SignedLongLong;
3695 }
3696};
3697} // end anonymous namespace
3698
3699namespace {
3700class BitrigX86_64TargetInfo : public BitrigTargetInfo<X86_64TargetInfo> {
3701public:
3702 BitrigX86_64TargetInfo(const llvm::Triple &Triple)
3703 : BitrigTargetInfo<X86_64TargetInfo>(Triple) {
3704 IntMaxType = SignedLongLong;
3705 Int64Type = SignedLongLong;
3706 }
3707};
3708}
3709
3710
3711namespace {
3712class ARMTargetInfo : public TargetInfo {
3713 // Possible FPU choices.
3714 enum FPUMode {
3715 VFP2FPU = (1 << 0),
3716 VFP3FPU = (1 << 1),
3717 VFP4FPU = (1 << 2),
3718 NeonFPU = (1 << 3),
3719 FPARMV8 = (1 << 4)
3720 };
3721
3722 // Possible HWDiv features.
3723 enum HWDivMode {
3724 HWDivThumb = (1 << 0),
3725 HWDivARM = (1 << 1)
3726 };
3727
3728 static bool FPUModeIsVFP(FPUMode Mode) {
3729 return Mode & (VFP2FPU | VFP3FPU | VFP4FPU | NeonFPU | FPARMV8);
3730 }
3731
3732 static const TargetInfo::GCCRegAlias GCCRegAliases[];
3733 static const char * const GCCRegNames[];
3734
3735 std::string ABI, CPU;
3736
3737 enum {
3738 FP_Default,
3739 FP_VFP,
3740 FP_Neon
3741 } FPMath;
3742
3743 unsigned FPU : 5;
3744
3745 unsigned IsAAPCS : 1;
3746 unsigned IsThumb : 1;
3747 unsigned HWDiv : 2;
3748
3749 // Initialized via features.
3750 unsigned SoftFloat : 1;
3751 unsigned SoftFloatABI : 1;
3752
3753 unsigned CRC : 1;
3754 unsigned Crypto : 1;
3755
3756 // ACLE 6.5.1 Hardware floating point
3757 enum {
3758 HW_FP_HP = (1 << 1), /// half (16-bit)
3759 HW_FP_SP = (1 << 2), /// single (32-bit)
3760 HW_FP_DP = (1 << 3), /// double (64-bit)
3761 };
3762 uint32_t HW_FP;
3763
3764 static const Builtin::Info BuiltinInfo[];
3765
3766 static bool shouldUseInlineAtomic(const llvm::Triple &T) {
3767 StringRef ArchName = T.getArchName();
3768 if (T.getArch() == llvm::Triple::arm ||
3769 T.getArch() == llvm::Triple::armeb) {
3770 StringRef VersionStr;
3771 if (ArchName.startswith("armv"))
3772 VersionStr = ArchName.substr(4, 1);
3773 else if (ArchName.startswith("armebv"))
3774 VersionStr = ArchName.substr(6, 1);
3775 else
3776 return false;
3777 unsigned Version;
3778 if (VersionStr.getAsInteger(10, Version))
3779 return false;
3780 return Version >= 6;
3781 }
3782 assert(T.getArch() == llvm::Triple::thumb ||
3783 T.getArch() == llvm::Triple::thumbeb);
3784 StringRef VersionStr;
3785 if (ArchName.startswith("thumbv"))
3786 VersionStr = ArchName.substr(6, 1);
3787 else if (ArchName.startswith("thumbebv"))
3788 VersionStr = ArchName.substr(8, 1);
3789 else
3790 return false;
3791 unsigned Version;
3792 if (VersionStr.getAsInteger(10, Version))
3793 return false;
3794 return Version >= 7;
3795 }
3796
3797 void setABIAAPCS() {
3798 IsAAPCS = true;
3799
3800 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 64;
3801 const llvm::Triple &T = getTriple();
3802
3803 // size_t is unsigned long on MachO-derived environments and NetBSD.
3804 if (T.isOSBinFormatMachO() || T.getOS() == llvm::Triple::NetBSD)
3805 SizeType = UnsignedLong;
3806 else
3807 SizeType = UnsignedInt;
3808
3809 switch (T.getOS()) {
3810 case llvm::Triple::NetBSD:
3811 WCharType = SignedInt;
3812 break;
3813 case llvm::Triple::Win32:
3814 WCharType = UnsignedShort;
3815 break;
3816 case llvm::Triple::Linux:
3817 default:
3818 // AAPCS 7.1.1, ARM-Linux ABI 2.4: type of wchar_t is unsigned int.
3819 WCharType = UnsignedInt;
3820 break;
3821 }
3822
3823 UseBitFieldTypeAlignment = true;
3824
3825 ZeroLengthBitfieldBoundary = 0;
3826
3827 // Thumb1 add sp, #imm requires the immediate value be multiple of 4,
3828 // so set preferred for small types to 32.
3829 if (T.isOSBinFormatMachO()) {
3830 DescriptionString =
3831 BigEndian ? "E-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3832 : "e-m:o-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3833 } else if (T.isOSWindows()) {
3834 // FIXME: this is invalid for WindowsCE
3835 assert(!BigEndian && "Windows on ARM does not support big endian");
3836 DescriptionString = "e"
3837 "-m:e"
3838 "-p:32:32"
3839 "-i64:64"
3840 "-v128:64:128"
3841 "-a:0:32"
3842 "-n32"
3843 "-S64";
3844 } else {
3845 DescriptionString =
3846 BigEndian ? "E-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
3847 : "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64";
3848 }
3849
3850 // FIXME: Enumerated types are variable width in straight AAPCS.
3851 }
3852
3853 void setABIAPCS() {
3854 const llvm::Triple &T = getTriple();
3855
3856 IsAAPCS = false;
3857
3858 DoubleAlign = LongLongAlign = LongDoubleAlign = SuitableAlign = 32;
3859
3860 // size_t is unsigned int on FreeBSD.
3861 if (T.getOS() == llvm::Triple::FreeBSD)
3862 SizeType = UnsignedInt;
3863 else
3864 SizeType = UnsignedLong;
3865
3866 // Revert to using SignedInt on apcs-gnu to comply with existing behaviour.
3867 WCharType = SignedInt;
3868
3869 // Do not respect the alignment of bit-field types when laying out
3870 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
3871 UseBitFieldTypeAlignment = false;
3872
3873 /// gcc forces the alignment to 4 bytes, regardless of the type of the
3874 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
3875 /// gcc.
3876 ZeroLengthBitfieldBoundary = 32;
3877
3878 if (T.isOSBinFormatMachO())
3879 DescriptionString =
3880 BigEndian
3881 ? "E-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3882 : "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3883 else
3884 DescriptionString =
3885 BigEndian
3886 ? "E-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
3887 : "e-m:e-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32";
3888
3889 // FIXME: Override "preferred align" for double and long long.
3890 }
3891
3892public:
3893 ARMTargetInfo(const llvm::Triple &Triple, bool IsBigEndian)
3894 : TargetInfo(Triple), CPU("arm1136j-s"), FPMath(FP_Default),
3895 IsAAPCS(true), HW_FP(0) {
3896 BigEndian = IsBigEndian;
3897
3898 switch (getTriple().getOS()) {
3899 case llvm::Triple::NetBSD:
3900 PtrDiffType = SignedLong;
3901 break;
3902 default:
3903 PtrDiffType = SignedInt;
3904 break;
3905 }
3906
3907 // {} in inline assembly are neon specifiers, not assembly variant
3908 // specifiers.
3909 NoAsmVariants = true;
3910
3911 // FIXME: Should we just treat this as a feature?
3912 IsThumb = getTriple().getArchName().startswith("thumb");
3913
3914 // FIXME: This duplicates code from the driver that sets the -target-abi
3915 // option - this code is used if -target-abi isn't passed and should
3916 // be unified in some way.
3917 if (Triple.isOSBinFormatMachO()) {
3918 // The backend is hardwired to assume AAPCS for M-class processors, ensure
3919 // the frontend matches that.
3920 if (Triple.getEnvironment() == llvm::Triple::EABI ||
3921 Triple.getOS() == llvm::Triple::UnknownOS ||
3922 StringRef(CPU).startswith("cortex-m")) {
3923 setABI("aapcs");
3924 } else {
3925 setABI("apcs-gnu");
3926 }
3927 } else if (Triple.isOSWindows()) {
3928 // FIXME: this is invalid for WindowsCE
3929 setABI("aapcs");
3930 } else {
3931 // Select the default based on the platform.
3932 switch (Triple.getEnvironment()) {
3933 case llvm::Triple::Android:
3934 case llvm::Triple::GNUEABI:
3935 case llvm::Triple::GNUEABIHF:
3936 setABI("aapcs-linux");
3937 break;
3938 case llvm::Triple::EABIHF:
3939 case llvm::Triple::EABI:
3940 setABI("aapcs");
3941 break;
3942 case llvm::Triple::GNU:
3943 setABI("apcs-gnu");
3944 break;
3945 default:
3946 if (Triple.getOS() == llvm::Triple::NetBSD)
3947 setABI("apcs-gnu");
3948 else
3949 setABI("aapcs");
3950 break;
3951 }
3952 }
3953
3954 // ARM targets default to using the ARM C++ ABI.
3955 TheCXXABI.set(TargetCXXABI::GenericARM);
3956
3957 // ARM has atomics up to 8 bytes
3958 MaxAtomicPromoteWidth = 64;
3959 if (shouldUseInlineAtomic(getTriple()))
3960 MaxAtomicInlineWidth = 64;
3961
3962 // Do force alignment of members that follow zero length bitfields. If
3963 // the alignment of the zero-length bitfield is greater than the member
3964 // that follows it, `bar', `bar' will be aligned as the type of the
3965 // zero length bitfield.
3966 UseZeroLengthBitfieldAlignment = true;
3967 }
3968 StringRef getABI() const override { return ABI; }
3969 bool setABI(const std::string &Name) override {
3970 ABI = Name;
3971
3972 // The defaults (above) are for AAPCS, check if we need to change them.
3973 //
3974 // FIXME: We need support for -meabi... we could just mangle it into the
3975 // name.
3976 if (Name == "apcs-gnu") {
3977 setABIAPCS();
3978 return true;
3979 }
3980 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
3981 setABIAAPCS();
3982 return true;
3983 }
3984 return false;
3985 }
3986
3987 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
3988 StringRef ArchName = getTriple().getArchName();
3989 if (CPU == "arm1136jf-s" || CPU == "arm1176jzf-s" || CPU == "mpcore")
3990 Features["vfp2"] = true;
3991 else if (CPU == "cortex-a8" || CPU == "cortex-a9") {
3992 Features["vfp3"] = true;
3993 Features["neon"] = true;
3994 }
3995 else if (CPU == "cortex-a5") {
3996 Features["vfp4"] = true;
3997 Features["neon"] = true;
3998 } else if (CPU == "swift" || CPU == "cortex-a7" ||
3999 CPU == "cortex-a12" || CPU == "cortex-a15" ||
4000 CPU == "cortex-a17" || CPU == "krait") {
4001 Features["vfp4"] = true;
4002 Features["neon"] = true;
4003 Features["hwdiv"] = true;
4004 Features["hwdiv-arm"] = true;
4005 } else if (CPU == "cyclone") {
4006 Features["v8fp"] = true;
4007 Features["neon"] = true;
4008 Features["hwdiv"] = true;
4009 Features["hwdiv-arm"] = true;
4010 } else if (CPU == "cortex-a53" || CPU == "cortex-a57") {
4011 Features["fp-armv8"] = true;
4012 Features["neon"] = true;
4013 Features["hwdiv"] = true;
4014 Features["hwdiv-arm"] = true;
4015 Features["crc"] = true;
4016 Features["crypto"] = true;
4017 } else if (CPU == "cortex-r5" ||
4018 // Enable the hwdiv extension for all v8a AArch32 cores by
4019 // default.
4020 ArchName == "armv8a" || ArchName == "armv8" ||
4021 ArchName == "armebv8a" || ArchName == "armebv8" ||
4022 ArchName == "thumbv8a" || ArchName == "thumbv8" ||
4023 ArchName == "thumbebv8a" || ArchName == "thumbebv8") {
4024 Features["hwdiv"] = true;
4025 Features["hwdiv-arm"] = true;
4026 } else if (CPU == "cortex-m3" || CPU == "cortex-m4" || CPU == "cortex-m7") {
4027 Features["hwdiv"] = true;
4028 }
4029 }
4030
4031 bool handleTargetFeatures(std::vector<std::string> &Features,
4032 DiagnosticsEngine &Diags) override {
4033 FPU = 0;
4034 CRC = 0;
4035 Crypto = 0;
4036 SoftFloat = SoftFloatABI = false;
4037 HWDiv = 0;
4038
4039 for (const auto &Feature : Features) {
4040 if (Feature == "+soft-float") {
4041 SoftFloat = true;
4042 } else if (Feature == "+soft-float-abi") {
4043 SoftFloatABI = true;
4044 } else if (Feature == "+vfp2") {
4045 FPU |= VFP2FPU;
4046 HW_FP = HW_FP_SP | HW_FP_DP;
4047 } else if (Feature == "+vfp3") {
4048 FPU |= VFP3FPU;
4049 HW_FP = HW_FP_SP | HW_FP_DP;
4050 } else if (Feature == "+vfp4") {
4051 FPU |= VFP4FPU;
4052 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4053 } else if (Feature == "+fp-armv8") {
4054 FPU |= FPARMV8;
4055 HW_FP = HW_FP_SP | HW_FP_DP | HW_FP_HP;
4056 } else if (Feature == "+neon") {
4057 FPU |= NeonFPU;
4058 HW_FP = HW_FP_SP | HW_FP_DP;
4059 } else if (Feature == "+hwdiv") {
4060 HWDiv |= HWDivThumb;
4061 } else if (Feature == "+hwdiv-arm") {
4062 HWDiv |= HWDivARM;
4063 } else if (Feature == "+crc") {
4064 CRC = 1;
4065 } else if (Feature == "+crypto") {
4066 Crypto = 1;
4067 } else if (Feature == "+fp-only-sp") {
4068 HW_FP &= ~HW_FP_DP;
4069 }
4070 }
4071
4072 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
4073 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
4074 return false;
4075 }
4076
4077 if (FPMath == FP_Neon)
4078 Features.push_back("+neonfp");
4079 else if (FPMath == FP_VFP)
4080 Features.push_back("-neonfp");
4081
4082 // Remove front-end specific options which the backend handles differently.
4083 const StringRef FrontEndFeatures[] = { "+soft-float", "+soft-float-abi" };
4084 for (const auto &FEFeature : FrontEndFeatures) {
4085 auto Feature = std::find(Features.begin(), Features.end(), FEFeature);
4086 if (Feature != Features.end())
4087 Features.erase(Feature);
4088 }
4089
4090 return true;
4091 }
4092
4093 bool hasFeature(StringRef Feature) const override {
4094 return llvm::StringSwitch<bool>(Feature)
4095 .Case("arm", true)
4096 .Case("softfloat", SoftFloat)
4097 .Case("thumb", IsThumb)
4098 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
4099 .Case("hwdiv", HWDiv & HWDivThumb)
4100 .Case("hwdiv-arm", HWDiv & HWDivARM)
4101 .Default(false);
4102 }
4103 // FIXME: Should we actually have some table instead of these switches?
4104 static const char *getCPUDefineSuffix(StringRef Name) {
4105 return llvm::StringSwitch<const char *>(Name)
4106 .Cases("arm8", "arm810", "4")
4107 .Cases("strongarm", "strongarm110", "strongarm1100", "strongarm1110",
4108 "4")
4109 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "arm720t", "arm9", "4T")
4110 .Cases("arm9tdmi", "arm920", "arm920t", "arm922t", "arm940t", "4T")
4111 .Case("ep9312", "4T")
4112 .Cases("arm10tdmi", "arm1020t", "5T")
4113 .Cases("arm9e", "arm946e-s", "arm966e-s", "arm968e-s", "5TE")
4114 .Case("arm926ej-s", "5TEJ")
4115 .Cases("arm10e", "arm1020e", "arm1022e", "5TE")
4116 .Cases("xscale", "iwmmxt", "5TE")
4117 .Case("arm1136j-s", "6J")
4118 .Cases("arm1176jz-s", "arm1176jzf-s", "6ZK")
4119 .Cases("arm1136jf-s", "mpcorenovfp", "mpcore", "6K")
4120 .Cases("arm1156t2-s", "arm1156t2f-s", "6T2")
4121 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "7A")
4122 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4123 "7A")
4124 .Cases("cortex-r4", "cortex-r5", "7R")
4125 .Case("swift", "7S")
4126 .Case("cyclone", "8A")
4127 .Case("cortex-m3", "7M")
4128 .Cases("cortex-m4", "cortex-m7", "7EM")
4129 .Case("cortex-m0", "6M")
4130 .Cases("cortex-a53", "cortex-a57", "8A")
4131 .Default(nullptr);
4132 }
4133 static const char *getCPUProfile(StringRef Name) {
4134 return llvm::StringSwitch<const char *>(Name)
4135 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "A")
4136 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "cortex-a17", "krait",
4137 "A")
4138 .Cases("cortex-a53", "cortex-a57", "A")
4139 .Cases("cortex-m3", "cortex-m4", "cortex-m0", "cortex-m7", "M")
4140 .Cases("cortex-r4", "cortex-r5", "R")
4141 .Default("");
4142 }
4143 bool setCPU(const std::string &Name) override {
4144 if (!getCPUDefineSuffix(Name))
4145 return false;
4146
4147 // Cortex M does not support 8 byte atomics, while general Thumb2 does.
4148 StringRef Profile = getCPUProfile(Name);
4149 if (Profile == "M" && MaxAtomicInlineWidth) {
4150 MaxAtomicPromoteWidth = 32;
4151 MaxAtomicInlineWidth = 32;
4152 }
4153
4154 CPU = Name;
4155 return true;
4156 }
4157 bool setFPMath(StringRef Name) override;
4158 bool supportsThumb(StringRef ArchName, StringRef CPUArch,
4159 unsigned CPUArchVer) const {
4160 return CPUArchVer >= 7 || (CPUArch.find('T') != StringRef::npos) ||
4161 (CPUArch.find('M') != StringRef::npos);
4162 }
4163 bool supportsThumb2(StringRef ArchName, StringRef CPUArch,
4164 unsigned CPUArchVer) const {
4165 // We check both CPUArchVer and ArchName because when only triple is
4166 // specified, the default CPU is arm1136j-s.
4167 return ArchName.endswith("v6t2") || ArchName.endswith("v7") ||
4168 ArchName.endswith("v8") || CPUArch == "6T2" || CPUArchVer >= 7;
4169 }
4170 void getTargetDefines(const LangOptions &Opts,
4171 MacroBuilder &Builder) const override {
4172 // Target identification.
4173 Builder.defineMacro("__arm");
4174 Builder.defineMacro("__arm__");
4175
4176 // Target properties.
4177 Builder.defineMacro("__REGISTER_PREFIX__", "");
4178
4179 StringRef CPUArch = getCPUDefineSuffix(CPU);
4180 unsigned int CPUArchVer;
4181 if (CPUArch.substr(0, 1).getAsInteger<unsigned int>(10, CPUArchVer))
4182 llvm_unreachable("Invalid char for architecture version number");
4183 Builder.defineMacro("__ARM_ARCH_" + CPUArch + "__");
4184
4185 // ACLE 6.4.1 ARM/Thumb instruction set architecture
4186 StringRef CPUProfile = getCPUProfile(CPU);
4187 StringRef ArchName = getTriple().getArchName();
4188
4189 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
4190 Builder.defineMacro("__ARM_ARCH", CPUArch.substr(0, 1));
4191 if (CPUArch[0] >= '8') {
4192 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4193 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
4194 }
4195
4196 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
4197 // is not defined for the M-profile.
4198 // NOTE that the deffault profile is assumed to be 'A'
4199 if (CPUProfile.empty() || CPUProfile != "M")
4200 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
4201
4202 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supporst the original
4203 // Thumb ISA (including v6-M). It is set to 2 if the core supports the
4204 // Thumb-2 ISA as found in the v6T2 architecture and all v7 architecture.
4205 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4206 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
4207 else if (supportsThumb(ArchName, CPUArch, CPUArchVer))
4208 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
4209
4210 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
4211 // instruction set such as ARM or Thumb.
4212 Builder.defineMacro("__ARM_32BIT_STATE", "1");
4213
4214 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
4215
4216 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
4217 if (!CPUProfile.empty())
4218 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
4219
4220 // ACLE 6.5.1 Hardware Floating Point
4221 if (HW_FP)
4222 Builder.defineMacro("__ARM_FP", "0x" + llvm::utohexstr(HW_FP));
4223
4224 // ACLE predefines.
4225 Builder.defineMacro("__ARM_ACLE", "200");
4226
4227 // Subtarget options.
4228
4229 // FIXME: It's more complicated than this and we don't really support
4230 // interworking.
4231 // Windows on ARM does not "support" interworking
4232 if (5 <= CPUArchVer && CPUArchVer <= 8 && !getTriple().isOSWindows())
4233 Builder.defineMacro("__THUMB_INTERWORK__");
4234
4235 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
4236 // Embedded targets on Darwin follow AAPCS, but not EABI.
4237 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
4238 if (!getTriple().isOSDarwin() && !getTriple().isOSWindows())
4239 Builder.defineMacro("__ARM_EABI__");
4240 Builder.defineMacro("__ARM_PCS", "1");
4241
4242 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp")
4243 Builder.defineMacro("__ARM_PCS_VFP", "1");
4244 }
4245
4246 if (SoftFloat)
4247 Builder.defineMacro("__SOFTFP__");
4248
4249 if (CPU == "xscale")
4250 Builder.defineMacro("__XSCALE__");
4251
4252 if (IsThumb) {
4253 Builder.defineMacro("__THUMBEL__");
4254 Builder.defineMacro("__thumb__");
4255 if (supportsThumb2(ArchName, CPUArch, CPUArchVer))
4256 Builder.defineMacro("__thumb2__");
4257 }
4258 if (((HWDiv & HWDivThumb) && IsThumb) || ((HWDiv & HWDivARM) && !IsThumb))
4259 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
4260
4261 // Note, this is always on in gcc, even though it doesn't make sense.
4262 Builder.defineMacro("__APCS_32__");
4263
4264 if (FPUModeIsVFP((FPUMode) FPU)) {
4265 Builder.defineMacro("__VFP_FP__");
4266 if (FPU & VFP2FPU)
4267 Builder.defineMacro("__ARM_VFPV2__");
4268 if (FPU & VFP3FPU)
4269 Builder.defineMacro("__ARM_VFPV3__");
4270 if (FPU & VFP4FPU)
4271 Builder.defineMacro("__ARM_VFPV4__");
4272 }
4273
4274 // This only gets set when Neon instructions are actually available, unlike
4275 // the VFP define, hence the soft float and arch check. This is subtly
4276 // different from gcc, we follow the intent which was that it should be set
4277 // when Neon instructions are actually available.
4278 if ((FPU & NeonFPU) && !SoftFloat && CPUArchVer >= 7) {
4279 Builder.defineMacro("__ARM_NEON");
4280 Builder.defineMacro("__ARM_NEON__");
4281 }
4282
4283 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
4284 Opts.ShortWChar ? "2" : "4");
4285
4286 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4287 Opts.ShortEnums ? "1" : "4");
4288
4289 if (CRC)
4290 Builder.defineMacro("__ARM_FEATURE_CRC32");
4291
4292 if (Crypto)
4293 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4294
4295 if (CPUArchVer >= 6 && CPUArch != "6M") {
4296 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
4297 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
4298 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
4299 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
4300 }
4301
4302 bool is5EOrAbove = (CPUArchVer >= 6 ||
4303 (CPUArchVer == 5 &&
4304 CPUArch.find('E') != StringRef::npos));
4305 bool is32Bit = (!IsThumb || supportsThumb2(ArchName, CPUArch, CPUArchVer));
4306 if (is5EOrAbove && is32Bit && (CPUProfile != "M" || CPUArch == "7EM"))
4307 Builder.defineMacro("__ARM_FEATURE_DSP");
4308 }
4309 void getTargetBuiltins(const Builtin::Info *&Records,
4310 unsigned &NumRecords) const override {
4311 Records = BuiltinInfo;
4312 NumRecords = clang::ARM::LastTSBuiltin-Builtin::FirstTSBuiltin;
4313 }
4314 bool isCLZForZeroUndef() const override { return false; }
4315 BuiltinVaListKind getBuiltinVaListKind() const override {
4316 return IsAAPCS ? AAPCSABIBuiltinVaList : TargetInfo::VoidPtrBuiltinVaList;
4317 }
4318 void getGCCRegNames(const char * const *&Names,
4319 unsigned &NumNames) const override;
4320 void getGCCRegAliases(const GCCRegAlias *&Aliases,
4321 unsigned &NumAliases) const override;
4322 bool validateAsmConstraint(const char *&Name,
4323 TargetInfo::ConstraintInfo &Info) const override {
4324 switch (*Name) {
4325 default: break;
4326 case 'l': // r0-r7
4327 case 'h': // r8-r15
4328 case 'w': // VFP Floating point register single precision
4329 case 'P': // VFP Floating point register double precision
4330 Info.setAllowsRegister();
4331 return true;
4332 case 'I':
4333 case 'J':
4334 case 'K':
4335 case 'L':
4336 case 'M':
4337 // FIXME
4338 return true;
4339 case 'Q': // A memory address that is a single base register.
4340 Info.setAllowsMemory();
4341 return true;
4342 case 'U': // a memory reference...
4343 switch (Name[1]) {
4344 case 'q': // ...ARMV4 ldrsb
4345 case 'v': // ...VFP load/store (reg+constant offset)
4346 case 'y': // ...iWMMXt load/store
4347 case 't': // address valid for load/store opaque types wider
4348 // than 128-bits
4349 case 'n': // valid address for Neon doubleword vector load/store
4350 case 'm': // valid address for Neon element and structure load/store
4351 case 's': // valid address for non-offset loads/stores of quad-word
4352 // values in four ARM registers
4353 Info.setAllowsMemory();
4354 Name++;
4355 return true;
4356 }
4357 }
4358 return false;
4359 }
4360 std::string convertConstraint(const char *&Constraint) const override {
4361 std::string R;
4362 switch (*Constraint) {
4363 case 'U': // Two-character constraint; add "^" hint for later parsing.
4364 R = std::string("^") + std::string(Constraint, 2);
4365 Constraint++;
4366 break;
4367 case 'p': // 'p' should be translated to 'r' by default.
4368 R = std::string("r");
4369 break;
4370 default:
4371 return std::string(1, *Constraint);
4372 }
4373 return R;
4374 }
4375 bool
4376 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
4377 std::string &SuggestedModifier) const override {
4378 bool isOutput = (Constraint[0] == '=');
4379 bool isInOut = (Constraint[0] == '+');
4380
4381 // Strip off constraint modifiers.
4382 while (Constraint[0] == '=' ||
4383 Constraint[0] == '+' ||
4384 Constraint[0] == '&')
4385 Constraint = Constraint.substr(1);
4386
4387 switch (Constraint[0]) {
4388 default: break;
4389 case 'r': {
4390 switch (Modifier) {
4391 default:
4392 return (isInOut || isOutput || Size <= 64);
4393 case 'q':
4394 // A register of size 32 cannot fit a vector type.
4395 return false;
4396 }
4397 }
4398 }
4399
4400 return true;
4401 }
4402 const char *getClobbers() const override {
4403 // FIXME: Is this really right?
4404 return "";
4405 }
4406
4407 CallingConvCheckResult checkCallingConvention(CallingConv CC) const override {
4408 return (CC == CC_AAPCS || CC == CC_AAPCS_VFP) ? CCCR_OK : CCCR_Warning;
4409 }
4410
4411 int getEHDataRegisterNumber(unsigned RegNo) const override {
4412 if (RegNo == 0) return 0;
4413 if (RegNo == 1) return 1;
4414 return -1;
4415 }
4416};
4417
4418bool ARMTargetInfo::setFPMath(StringRef Name) {
4419 if (Name == "neon") {
4420 FPMath = FP_Neon;
4421 return true;
4422 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
4423 Name == "vfp4") {
4424 FPMath = FP_VFP;
4425 return true;
4426 }
4427 return false;
4428}
4429
4430const char * const ARMTargetInfo::GCCRegNames[] = {
4431 // Integer registers
4432 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
4433 "r8", "r9", "r10", "r11", "r12", "sp", "lr", "pc",
4434
4435 // Float registers
4436 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
4437 "s8", "s9", "s10", "s11", "s12", "s13", "s14", "s15",
4438 "s16", "s17", "s18", "s19", "s20", "s21", "s22", "s23",
4439 "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4440
4441 // Double registers
4442 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7",
4443 "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15",
4444 "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23",
4445 "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4446
4447 // Quad registers
4448 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7",
4449 "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"
4450};
4451
4452void ARMTargetInfo::getGCCRegNames(const char * const *&Names,
4453 unsigned &NumNames) const {
4454 Names = GCCRegNames;
4455 NumNames = llvm::array_lengthof(GCCRegNames);
4456}
4457
4458const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
4459 { { "a1" }, "r0" },
4460 { { "a2" }, "r1" },
4461 { { "a3" }, "r2" },
4462 { { "a4" }, "r3" },
4463 { { "v1" }, "r4" },
4464 { { "v2" }, "r5" },
4465 { { "v3" }, "r6" },
4466 { { "v4" }, "r7" },
4467 { { "v5" }, "r8" },
4468 { { "v6", "rfp" }, "r9" },
4469 { { "sl" }, "r10" },
4470 { { "fp" }, "r11" },
4471 { { "ip" }, "r12" },
4472 { { "r13" }, "sp" },
4473 { { "r14" }, "lr" },
4474 { { "r15" }, "pc" },
4475 // The S, D and Q registers overlap, but aren't really aliases; we
4476 // don't want to substitute one of these for a different-sized one.
4477};
4478
4479void ARMTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4480 unsigned &NumAliases) const {
4481 Aliases = GCCRegAliases;
4482 NumAliases = llvm::array_lengthof(GCCRegAliases);
4483}
4484
4485const Builtin::Info ARMTargetInfo::BuiltinInfo[] = {
4486#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4487#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4488 ALL_LANGUAGES },
4489#include "clang/Basic/BuiltinsNEON.def"
4490
4491#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4492#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) { #ID, TYPE, ATTRS, 0, LANG },
4493#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
4494 ALL_LANGUAGES },
4495#include "clang/Basic/BuiltinsARM.def"
4496};
4497
4498class ARMleTargetInfo : public ARMTargetInfo {
4499public:
4500 ARMleTargetInfo(const llvm::Triple &Triple)
4501 : ARMTargetInfo(Triple, false) { }
4502 virtual void getTargetDefines(const LangOptions &Opts,
4503 MacroBuilder &Builder) const {
4504 Builder.defineMacro("__ARMEL__");
4505 ARMTargetInfo::getTargetDefines(Opts, Builder);
4506 }
4507};
4508
4509class ARMbeTargetInfo : public ARMTargetInfo {
4510public:
4511 ARMbeTargetInfo(const llvm::Triple &Triple)
4512 : ARMTargetInfo(Triple, true) { }
4513 virtual void getTargetDefines(const LangOptions &Opts,
4514 MacroBuilder &Builder) const {
4515 Builder.defineMacro("__ARMEB__");
4516 Builder.defineMacro("__ARM_BIG_ENDIAN");
4517 ARMTargetInfo::getTargetDefines(Opts, Builder);
4518 }
4519};
4520} // end anonymous namespace.
4521
4522namespace {
4523class WindowsARMTargetInfo : public WindowsTargetInfo<ARMleTargetInfo> {
4524 const llvm::Triple Triple;
4525public:
4526 WindowsARMTargetInfo(const llvm::Triple &Triple)
4527 : WindowsTargetInfo<ARMleTargetInfo>(Triple), Triple(Triple) {
4528 TLSSupported = false;
4529 WCharType = UnsignedShort;
4530 SizeType = UnsignedInt;
4531 UserLabelPrefix = "";
4532 }
4533 void getVisualStudioDefines(const LangOptions &Opts,
4534 MacroBuilder &Builder) const {
4535 WindowsTargetInfo<ARMleTargetInfo>::getVisualStudioDefines(Opts, Builder);
4536
4537 // FIXME: this is invalid for WindowsCE
4538 Builder.defineMacro("_M_ARM_NT", "1");
4539 Builder.defineMacro("_M_ARMT", "_M_ARM");
4540 Builder.defineMacro("_M_THUMB", "_M_ARM");
4541
4542 assert((Triple.getArch() == llvm::Triple::arm ||
4543 Triple.getArch() == llvm::Triple::thumb) &&
4544 "invalid architecture for Windows ARM target info");
4545 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
4546 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
4547
4548 // TODO map the complete set of values
4549 // 31: VFPv3 40: VFPv4
4550 Builder.defineMacro("_M_ARM_FP", "31");
4551 }
4552 BuiltinVaListKind getBuiltinVaListKind() const override {
4553 return TargetInfo::CharPtrBuiltinVaList;
4554 }
4555};
4556
4557// Windows ARM + Itanium C++ ABI Target
4558class ItaniumWindowsARMleTargetInfo : public WindowsARMTargetInfo {
4559public:
4560 ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple)
4561 : WindowsARMTargetInfo(Triple) {
4562 TheCXXABI.set(TargetCXXABI::GenericARM);
4563 }
4564
4565 void getTargetDefines(const LangOptions &Opts,
4566 MacroBuilder &Builder) const override {
4567 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4568
4569 if (Opts.MSVCCompat)
4570 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4571 }
4572};
4573
4574// Windows ARM, MS (C++) ABI
4575class MicrosoftARMleTargetInfo : public WindowsARMTargetInfo {
4576public:
4577 MicrosoftARMleTargetInfo(const llvm::Triple &Triple)
4578 : WindowsARMTargetInfo(Triple) {
4579 TheCXXABI.set(TargetCXXABI::Microsoft);
4580 }
4581
4582 void getTargetDefines(const LangOptions &Opts,
4583 MacroBuilder &Builder) const override {
4584 WindowsARMTargetInfo::getTargetDefines(Opts, Builder);
4585 WindowsARMTargetInfo::getVisualStudioDefines(Opts, Builder);
4586 }
4587};
4588}
4589
4590
4591namespace {
4592class DarwinARMTargetInfo :
4593 public DarwinTargetInfo<ARMleTargetInfo> {
4594protected:
4595 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4596 MacroBuilder &Builder) const override {
4597 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4598 }
4599
4600public:
4601 DarwinARMTargetInfo(const llvm::Triple &Triple)
4602 : DarwinTargetInfo<ARMleTargetInfo>(Triple) {
4603 HasAlignMac68kSupport = true;
4604 // iOS always has 64-bit atomic instructions.
4605 // FIXME: This should be based off of the target features in
4606 // ARMleTargetInfo.
4607 MaxAtomicInlineWidth = 64;
4608
4609 // Darwin on iOS uses a variant of the ARM C++ ABI.
4610 TheCXXABI.set(TargetCXXABI::iOS);
4611 }
4612};
4613} // end anonymous namespace.
4614
4615
4616namespace {
4617class AArch64TargetInfo : public TargetInfo {
4618 virtual void setDescriptionString() = 0;
4619 static const TargetInfo::GCCRegAlias GCCRegAliases[];
4620 static const char *const GCCRegNames[];
4621
4622 enum FPUModeEnum {
4623 FPUMode,
4624 NeonMode
4625 };
4626
4627 unsigned FPU;
4628 unsigned CRC;
4629 unsigned Crypto;
4630
4631 static const Builtin::Info BuiltinInfo[];
4632
4633 std::string ABI;
4634
4635public:
4636 AArch64TargetInfo(const llvm::Triple &Triple)
4637 : TargetInfo(Triple), ABI("aapcs") {
4638
4639 if (getTriple().getOS() == llvm::Triple::NetBSD) {
4640 WCharType = SignedInt;
4641
4642 // NetBSD apparently prefers consistency across ARM targets to consistency
4643 // across 64-bit targets.
4644 Int64Type = SignedLongLong;
4645 IntMaxType = SignedLongLong;
4646 } else {
4647 WCharType = UnsignedInt;
4648 Int64Type = SignedLong;
4649 IntMaxType = SignedLong;
4650 }
4651
4652 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
4653 MaxVectorAlign = 128;
4654 RegParmMax = 8;
4655 MaxAtomicInlineWidth = 128;
4656 MaxAtomicPromoteWidth = 128;
4657
4658 LongDoubleWidth = LongDoubleAlign = 128;
4659 LongDoubleFormat = &llvm::APFloat::IEEEquad;
4660
4661 // {} in inline assembly are neon specifiers, not assembly variant
4662 // specifiers.
4663 NoAsmVariants = true;
4664
4665 // AArch64 targets default to using the ARM C++ ABI.
4666 TheCXXABI.set(TargetCXXABI::GenericAArch64);
4667 }
4668
4669 StringRef getABI() const override { return ABI; }
4670 bool setABI(const std::string &Name) override {
4671 if (Name != "aapcs" && Name != "darwinpcs")
4672 return false;
4673
4674 ABI = Name;
4675 return true;
4676 }
4677
4678 bool setCPU(const std::string &Name) override {
4679 bool CPUKnown = llvm::StringSwitch<bool>(Name)
4680 .Case("generic", true)
4681 .Cases("cortex-a53", "cortex-a57", true)
4682 .Case("cyclone", true)
4683 .Default(false);
4684 return CPUKnown;
4685 }
4686
4687 virtual void getTargetDefines(const LangOptions &Opts,
4688 MacroBuilder &Builder) const override {
4689 // Target identification.
4690 Builder.defineMacro("__aarch64__");
4691
4692 // Target properties.
4693 Builder.defineMacro("_LP64");
4694 Builder.defineMacro("__LP64__");
4695
4696 // ACLE predefines. Many can only have one possible value on v8 AArch64.
4697 Builder.defineMacro("__ARM_ACLE", "200");
4698 Builder.defineMacro("__ARM_ARCH", "8");
4699 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
4700
4701 Builder.defineMacro("__ARM_64BIT_STATE");
4702 Builder.defineMacro("__ARM_PCS_AAPCS64");
4703 Builder.defineMacro("__ARM_ARCH_ISA_A64");
4704
4705 Builder.defineMacro("__ARM_FEATURE_UNALIGNED");
4706 Builder.defineMacro("__ARM_FEATURE_CLZ");
4707 Builder.defineMacro("__ARM_FEATURE_FMA");
4708 Builder.defineMacro("__ARM_FEATURE_DIV");
4709 Builder.defineMacro("__ARM_FEATURE_IDIV"); // As specified in ACLE
4710 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
4711 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN");
4712 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING");
4713
4714 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
4715
4716 // 0xe implies support for half, single and double precision operations.
4717 Builder.defineMacro("__ARM_FP", "0xe");
4718
4719 // PCS specifies this for SysV variants, which is all we support. Other ABIs
4720 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
4721 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE");
4722
4723 if (Opts.FastMath || Opts.FiniteMathOnly)
4724 Builder.defineMacro("__ARM_FP_FAST");
4725
4726 if (Opts.C99 && !Opts.Freestanding)
4727 Builder.defineMacro("__ARM_FP_FENV_ROUNDING");
4728
4729 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T", Opts.ShortWChar ? "2" : "4");
4730
4731 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM",
4732 Opts.ShortEnums ? "1" : "4");
4733
4734 if (FPU == NeonMode) {
4735 Builder.defineMacro("__ARM_NEON");
4736 // 64-bit NEON supports half, single and double precision operations.
4737 Builder.defineMacro("__ARM_NEON_FP", "0xe");
4738 }
4739
4740 if (CRC)
4741 Builder.defineMacro("__ARM_FEATURE_CRC32");
4742
4743 if (Crypto)
4744 Builder.defineMacro("__ARM_FEATURE_CRYPTO");
4745 }
4746
4747 virtual void getTargetBuiltins(const Builtin::Info *&Records,
4748 unsigned &NumRecords) const override {
4749 Records = BuiltinInfo;
4750 NumRecords = clang::AArch64::LastTSBuiltin - Builtin::FirstTSBuiltin;
4751 }
4752
4753 bool hasFeature(StringRef Feature) const override {
4754 return Feature == "aarch64" ||
4755 Feature == "arm64" ||
4756 (Feature == "neon" && FPU == NeonMode);
4757 }
4758
4759 bool handleTargetFeatures(std::vector<std::string> &Features,
4760 DiagnosticsEngine &Diags) override {
4761 FPU = FPUMode;
4762 CRC = 0;
4763 Crypto = 0;
4764 for (unsigned i = 0, e = Features.size(); i != e; ++i) {
4765 if (Features[i] == "+neon")
4766 FPU = NeonMode;
4767 if (Features[i] == "+crc")
4768 CRC = 1;
4769 if (Features[i] == "+crypto")
4770 Crypto = 1;
4771 }
4772
4773 setDescriptionString();
4774
4775 return true;
4776 }
4777
4778 bool isCLZForZeroUndef() const override { return false; }
4779
4780 BuiltinVaListKind getBuiltinVaListKind() const override {
4781 return TargetInfo::AArch64ABIBuiltinVaList;
4782 }
4783
4784 virtual void getGCCRegNames(const char *const *&Names,
4785 unsigned &NumNames) const override;
4786 virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
4787 unsigned &NumAliases) const override;
4788
4789 virtual bool
4790 validateAsmConstraint(const char *&Name,
4791 TargetInfo::ConstraintInfo &Info) const override {
4792 switch (*Name) {
4793 default:
4794 return false;
4795 case 'w': // Floating point and SIMD registers (V0-V31)
4796 Info.setAllowsRegister();
4797 return true;
4798 case 'I': // Constant that can be used with an ADD instruction
4799 case 'J': // Constant that can be used with a SUB instruction
4800 case 'K': // Constant that can be used with a 32-bit logical instruction
4801 case 'L': // Constant that can be used with a 64-bit logical instruction
4802 case 'M': // Constant that can be used as a 32-bit MOV immediate
4803 case 'N': // Constant that can be used as a 64-bit MOV immediate
4804 case 'Y': // Floating point constant zero
4805 case 'Z': // Integer constant zero
4806 return true;
4807 case 'Q': // A memory reference with base register and no offset
4808 Info.setAllowsMemory();
4809 return true;
4810 case 'S': // A symbolic address
4811 Info.setAllowsRegister();
4812 return true;
4813 case 'U':
4814 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
4815 // Utf: A memory address suitable for ldp/stp in TF mode.
4816 // Usa: An absolute symbolic address.
4817 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
4818 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
4819 case 'z': // Zero register, wzr or xzr
4820 Info.setAllowsRegister();
4821 return true;
4822 case 'x': // Floating point and SIMD registers (V0-V15)
4823 Info.setAllowsRegister();
4824 return true;
4825 }
4826 return false;
4827 }
4828
4829 bool
4830 validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size,
4831 std::string &SuggestedModifier) const override {
4832 // Strip off constraint modifiers.
4833 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
4834 Constraint = Constraint.substr(1);
4835
4836 switch (Constraint[0]) {
4837 default:
4838 return true;
4839 case 'z':
4840 case 'r': {
4841 switch (Modifier) {
4842 case 'x':
4843 case 'w':
4844 // For now assume that the person knows what they're
4845 // doing with the modifier.
4846 return true;
4847 default:
4848 // By default an 'r' constraint will be in the 'x'
4849 // registers.
4850 if (Size == 64)
4851 return true;
4852
4853 SuggestedModifier = "w";
4854 return false;
4855 }
4856 }
4857 }
4858 }
4859
4860 const char *getClobbers() const override { return ""; }
4861
4862 int getEHDataRegisterNumber(unsigned RegNo) const override {
4863 if (RegNo == 0)
4864 return 0;
4865 if (RegNo == 1)
4866 return 1;
4867 return -1;
4868 }
4869};
4870
4871const char *const AArch64TargetInfo::GCCRegNames[] = {
4872 // 32-bit Integer registers
4873 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10",
4874 "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
4875 "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
4876
4877 // 64-bit Integer registers
4878 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10",
4879 "x11", "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21",
4880 "x22", "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
4881
4882 // 32-bit floating point regsisters
4883 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10",
4884 "s11", "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21",
4885 "s22", "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
4886
4887 // 64-bit floating point regsisters
4888 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10",
4889 "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21",
4890 "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
4891
4892 // Vector registers
4893 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10",
4894 "v11", "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21",
4895 "v22", "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
4896};
4897
4898void AArch64TargetInfo::getGCCRegNames(const char *const *&Names,
4899 unsigned &NumNames) const {
4900 Names = GCCRegNames;
4901 NumNames = llvm::array_lengthof(GCCRegNames);
4902}
4903
4904const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
4905 { { "w31" }, "wsp" },
4906 { { "x29" }, "fp" },
4907 { { "x30" }, "lr" },
4908 { { "x31" }, "sp" },
4909 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
4910 // don't want to substitute one of these for a different-sized one.
4911};
4912
4913void AArch64TargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
4914 unsigned &NumAliases) const {
4915 Aliases = GCCRegAliases;
4916 NumAliases = llvm::array_lengthof(GCCRegAliases);
4917}
4918
4919const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
4920#define BUILTIN(ID, TYPE, ATTRS) \
4921 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4922#include "clang/Basic/BuiltinsNEON.def"
4923
4924#define BUILTIN(ID, TYPE, ATTRS) \
4925 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
4926#include "clang/Basic/BuiltinsAArch64.def"
4927};
4928
4929class AArch64leTargetInfo : public AArch64TargetInfo {
4930 void setDescriptionString() override {
4931 if (getTriple().isOSBinFormatMachO())
4932 DescriptionString = "e-m:o-i64:64-i128:128-n32:64-S128";
4933 else
4934 DescriptionString = "e-m:e-i64:64-i128:128-n32:64-S128";
4935 }
4936
4937public:
4938 AArch64leTargetInfo(const llvm::Triple &Triple)
4939 : AArch64TargetInfo(Triple) {
4940 BigEndian = false;
4941 }
4942 void getTargetDefines(const LangOptions &Opts,
4943 MacroBuilder &Builder) const override {
4944 Builder.defineMacro("__AARCH64EL__");
4945 AArch64TargetInfo::getTargetDefines(Opts, Builder);
4946 }
4947};
4948
4949class AArch64beTargetInfo : public AArch64TargetInfo {
4950 void setDescriptionString() override {
4951 assert(!getTriple().isOSBinFormatMachO());
4952 DescriptionString = "E-m:e-i64:64-i128:128-n32:64-S128";
4953 }
4954
4955public:
4956 AArch64beTargetInfo(const llvm::Triple &Triple)
4957 : AArch64TargetInfo(Triple) { }
4958 void getTargetDefines(const LangOptions &Opts,
4959 MacroBuilder &Builder) const override {
4960 Builder.defineMacro("__AARCH64EB__");
4961 Builder.defineMacro("__AARCH_BIG_ENDIAN");
4962 Builder.defineMacro("__ARM_BIG_ENDIAN");
4963 AArch64TargetInfo::getTargetDefines(Opts, Builder);
4964 }
4965};
4966} // end anonymous namespace.
4967
4968namespace {
4969class DarwinAArch64TargetInfo : public DarwinTargetInfo<AArch64leTargetInfo> {
4970protected:
4971 void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple,
4972 MacroBuilder &Builder) const override {
4973 Builder.defineMacro("__AARCH64_SIMD__");
4974 Builder.defineMacro("__ARM64_ARCH_8__");
4975 Builder.defineMacro("__ARM_NEON__");
4976 Builder.defineMacro("__LITTLE_ENDIAN__");
4977 Builder.defineMacro("__REGISTER_PREFIX__", "");
4978 Builder.defineMacro("__arm64", "1");
4979 Builder.defineMacro("__arm64__", "1");
4980
4981 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
4982 }
4983
4984public:
4985 DarwinAArch64TargetInfo(const llvm::Triple &Triple)
4986 : DarwinTargetInfo<AArch64leTargetInfo>(Triple) {
4987 Int64Type = SignedLongLong;
4988 WCharType = SignedInt;
4989 UseSignedCharForObjCBool = false;
4990
4991 LongDoubleWidth = LongDoubleAlign = 64;
4992 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
4993
4994 TheCXXABI.set(TargetCXXABI::iOS64);
4995 }
4996
4997 BuiltinVaListKind getBuiltinVaListKind() const override {
4998 return TargetInfo::CharPtrBuiltinVaList;
4999 }
5000};
5001} // end anonymous namespace
5002
5003namespace {
5004// Hexagon abstract base class
5005class HexagonTargetInfo : public TargetInfo {
5006 static const Builtin::Info BuiltinInfo[];
5007 static const char * const GCCRegNames[];
5008 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5009 std::string CPU;
5010public:
5011 HexagonTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5012 BigEndian = false;
5013 DescriptionString = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32";
5014
5015 // {} in inline assembly are packet specifiers, not assembly variant
5016 // specifiers.
5017 NoAsmVariants = true;
5018 }
5019
5020 void getTargetBuiltins(const Builtin::Info *&Records,
5021 unsigned &NumRecords) const override {
5022 Records = BuiltinInfo;
5023 NumRecords = clang::Hexagon::LastTSBuiltin-Builtin::FirstTSBuiltin;
5024 }
5025
5026 bool validateAsmConstraint(const char *&Name,
5027 TargetInfo::ConstraintInfo &Info) const override {
5028 return true;
5029 }
5030
5031 void getTargetDefines(const LangOptions &Opts,
5032 MacroBuilder &Builder) const override;
5033
5034 bool hasFeature(StringRef Feature) const override {
5035 return Feature == "hexagon";
5036 }
5037
5038 BuiltinVaListKind getBuiltinVaListKind() const override {
5039 return TargetInfo::CharPtrBuiltinVaList;
5040 }
5041 void getGCCRegNames(const char * const *&Names,
5042 unsigned &NumNames) const override;
5043 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5044 unsigned &NumAliases) const override;
5045 const char *getClobbers() const override {
5046 return "";
5047 }
5048
5049 static const char *getHexagonCPUSuffix(StringRef Name) {
5050 return llvm::StringSwitch<const char*>(Name)
5051 .Case("hexagonv4", "4")
5052 .Case("hexagonv5", "5")
5053 .Default(nullptr);
5054 }
5055
5056 bool setCPU(const std::string &Name) override {
5057 if (!getHexagonCPUSuffix(Name))
5058 return false;
5059
5060 CPU = Name;
5061 return true;
5062 }
5063};
5064
5065void HexagonTargetInfo::getTargetDefines(const LangOptions &Opts,
5066 MacroBuilder &Builder) const {
5067 Builder.defineMacro("qdsp6");
5068 Builder.defineMacro("__qdsp6", "1");
5069 Builder.defineMacro("__qdsp6__", "1");
5070
5071 Builder.defineMacro("hexagon");
5072 Builder.defineMacro("__hexagon", "1");
5073 Builder.defineMacro("__hexagon__", "1");
5074
5075 if(CPU == "hexagonv1") {
5076 Builder.defineMacro("__HEXAGON_V1__");
5077 Builder.defineMacro("__HEXAGON_ARCH__", "1");
5078 if(Opts.HexagonQdsp6Compat) {
5079 Builder.defineMacro("__QDSP6_V1__");
5080 Builder.defineMacro("__QDSP6_ARCH__", "1");
5081 }
5082 }
5083 else if(CPU == "hexagonv2") {
5084 Builder.defineMacro("__HEXAGON_V2__");
5085 Builder.defineMacro("__HEXAGON_ARCH__", "2");
5086 if(Opts.HexagonQdsp6Compat) {
5087 Builder.defineMacro("__QDSP6_V2__");
5088 Builder.defineMacro("__QDSP6_ARCH__", "2");
5089 }
5090 }
5091 else if(CPU == "hexagonv3") {
5092 Builder.defineMacro("__HEXAGON_V3__");
5093 Builder.defineMacro("__HEXAGON_ARCH__", "3");
5094 if(Opts.HexagonQdsp6Compat) {
5095 Builder.defineMacro("__QDSP6_V3__");
5096 Builder.defineMacro("__QDSP6_ARCH__", "3");
5097 }
5098 }
5099 else if(CPU == "hexagonv4") {
5100 Builder.defineMacro("__HEXAGON_V4__");
5101 Builder.defineMacro("__HEXAGON_ARCH__", "4");
5102 if(Opts.HexagonQdsp6Compat) {
5103 Builder.defineMacro("__QDSP6_V4__");
5104 Builder.defineMacro("__QDSP6_ARCH__", "4");
5105 }
5106 }
5107 else if(CPU == "hexagonv5") {
5108 Builder.defineMacro("__HEXAGON_V5__");
5109 Builder.defineMacro("__HEXAGON_ARCH__", "5");
5110 if(Opts.HexagonQdsp6Compat) {
5111 Builder.defineMacro("__QDSP6_V5__");
5112 Builder.defineMacro("__QDSP6_ARCH__", "5");
5113 }
5114 }
5115}
5116
5117const char * const HexagonTargetInfo::GCCRegNames[] = {
5118 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5119 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5120 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5121 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
5122 "p0", "p1", "p2", "p3",
5123 "sa0", "lc0", "sa1", "lc1", "m0", "m1", "usr", "ugp"
5124};
5125
5126void HexagonTargetInfo::getGCCRegNames(const char * const *&Names,
5127 unsigned &NumNames) const {
5128 Names = GCCRegNames;
5129 NumNames = llvm::array_lengthof(GCCRegNames);
5130}
5131
5132
5133const TargetInfo::GCCRegAlias HexagonTargetInfo::GCCRegAliases[] = {
5134 { { "sp" }, "r29" },
5135 { { "fp" }, "r30" },
5136 { { "lr" }, "r31" },
5137 };
5138
5139void HexagonTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5140 unsigned &NumAliases) const {
5141 Aliases = GCCRegAliases;
5142 NumAliases = llvm::array_lengthof(GCCRegAliases);
5143}
5144
5145
5146const Builtin::Info HexagonTargetInfo::BuiltinInfo[] = {
5147#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5148#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5149 ALL_LANGUAGES },
5150#include "clang/Basic/BuiltinsHexagon.def"
5151};
5152}
5153
5154
5155namespace {
5156// Shared base class for SPARC v8 (32-bit) and SPARC v9 (64-bit).
5157class SparcTargetInfo : public TargetInfo {
5158 static const TargetInfo::GCCRegAlias GCCRegAliases[];
5159 static const char * const GCCRegNames[];
5160 bool SoftFloat;
5161public:
5162 SparcTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {}
5163
5164 bool handleTargetFeatures(std::vector<std::string> &Features,
5165 DiagnosticsEngine &Diags) override {
5166 SoftFloat = false;
5167 for (unsigned i = 0, e = Features.size(); i != e; ++i)
5168 if (Features[i] == "+soft-float")
5169 SoftFloat = true;
5170 return true;
5171 }
5172 void getTargetDefines(const LangOptions &Opts,
5173 MacroBuilder &Builder) const override {
5174 DefineStd(Builder, "sparc", Opts);
5175 Builder.defineMacro("__REGISTER_PREFIX__", "");
5176
5177 if (SoftFloat)
5178 Builder.defineMacro("SOFT_FLOAT", "1");
5179 }
5180
5181 bool hasFeature(StringRef Feature) const override {
5182 return llvm::StringSwitch<bool>(Feature)
5183 .Case("softfloat", SoftFloat)
5184 .Case("sparc", true)
5185 .Default(false);
5186 }
5187
5188 void getTargetBuiltins(const Builtin::Info *&Records,
5189 unsigned &NumRecords) const override {
5190 // FIXME: Implement!
5191 }
5192 BuiltinVaListKind getBuiltinVaListKind() const override {
5193 return TargetInfo::VoidPtrBuiltinVaList;
5194 }
5195 void getGCCRegNames(const char * const *&Names,
5196 unsigned &NumNames) const override;
5197 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5198 unsigned &NumAliases) const override;
5199 bool validateAsmConstraint(const char *&Name,
5200 TargetInfo::ConstraintInfo &info) const override {
5201 // FIXME: Implement!
5202 switch (*Name) {
5203 case 'I': // Signed 13-bit constant
5204 case 'J': // Zero
5205 case 'K': // 32-bit constant with the low 12 bits clear
5206 case 'L': // A constant in the range supported by movcc (11-bit signed imm)
5207 case 'M': // A constant in the range supported by movrcc (19-bit signed imm)
5208 case 'N': // Same as 'K' but zext (required for SIMode)
5209 case 'O': // The constant 4096
5210 return true;
5211 }
5212 return false;
5213 }
5214 const char *getClobbers() const override {
5215 // FIXME: Implement!
5216 return "";
5217 }
5218};
5219
5220const char * const SparcTargetInfo::GCCRegNames[] = {
5221 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5222 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5223 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
5224 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31"
5225};
5226
5227void SparcTargetInfo::getGCCRegNames(const char * const *&Names,
5228 unsigned &NumNames) const {
5229 Names = GCCRegNames;
5230 NumNames = llvm::array_lengthof(GCCRegNames);
5231}
5232
5233const TargetInfo::GCCRegAlias SparcTargetInfo::GCCRegAliases[] = {
5234 { { "g0" }, "r0" },
5235 { { "g1" }, "r1" },
5236 { { "g2" }, "r2" },
5237 { { "g3" }, "r3" },
5238 { { "g4" }, "r4" },
5239 { { "g5" }, "r5" },
5240 { { "g6" }, "r6" },
5241 { { "g7" }, "r7" },
5242 { { "o0" }, "r8" },
5243 { { "o1" }, "r9" },
5244 { { "o2" }, "r10" },
5245 { { "o3" }, "r11" },
5246 { { "o4" }, "r12" },
5247 { { "o5" }, "r13" },
5248 { { "o6", "sp" }, "r14" },
5249 { { "o7" }, "r15" },
5250 { { "l0" }, "r16" },
5251 { { "l1" }, "r17" },
5252 { { "l2" }, "r18" },
5253 { { "l3" }, "r19" },
5254 { { "l4" }, "r20" },
5255 { { "l5" }, "r21" },
5256 { { "l6" }, "r22" },
5257 { { "l7" }, "r23" },
5258 { { "i0" }, "r24" },
5259 { { "i1" }, "r25" },
5260 { { "i2" }, "r26" },
5261 { { "i3" }, "r27" },
5262 { { "i4" }, "r28" },
5263 { { "i5" }, "r29" },
5264 { { "i6", "fp" }, "r30" },
5265 { { "i7" }, "r31" },
5266};
5267
5268void SparcTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
5269 unsigned &NumAliases) const {
5270 Aliases = GCCRegAliases;
5271 NumAliases = llvm::array_lengthof(GCCRegAliases);
5272}
5273
5274// SPARC v8 is the 32-bit mode selected by Triple::sparc.
5275class SparcV8TargetInfo : public SparcTargetInfo {
5276public:
5277 SparcV8TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
5278 DescriptionString = "E-m:e-p:32:32-i64:64-f128:64-n32-S64";
5279 }
5280
5281 void getTargetDefines(const LangOptions &Opts,
5282 MacroBuilder &Builder) const override {
5283 SparcTargetInfo::getTargetDefines(Opts, Builder);
5284 Builder.defineMacro("__sparcv8");
5285 }
5286};
5287
5288// SPARC v9 is the 64-bit mode selected by Triple::sparcv9.
5289class SparcV9TargetInfo : public SparcTargetInfo {
5290public:
5291 SparcV9TargetInfo(const llvm::Triple &Triple) : SparcTargetInfo(Triple) {
5292 // FIXME: Support Sparc quad-precision long double?
5293 DescriptionString = "E-m:e-i64:64-n32:64-S128";
5294 // This is an LP64 platform.
5295 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
5296
5297 // OpenBSD uses long long for int64_t and intmax_t.
5298 if (getTriple().getOS() == llvm::Triple::OpenBSD)
5299 IntMaxType = SignedLongLong;
5300 else
5301 IntMaxType = SignedLong;
5302 Int64Type = IntMaxType;
5303
5304 // The SPARCv8 System V ABI has long double 128-bits in size, but 64-bit
5305 // aligned. The SPARCv9 SCD 2.4.1 says 16-byte aligned.
5306 LongDoubleWidth = 128;
5307 LongDoubleAlign = 128;
5308 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5309 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5310 }
5311
5312 void getTargetDefines(const LangOptions &Opts,
5313 MacroBuilder &Builder) const override {
5314 SparcTargetInfo::getTargetDefines(Opts, Builder);
5315 Builder.defineMacro("__sparcv9");
5316 Builder.defineMacro("__arch64__");
5317 // Solaris doesn't need these variants, but the BSDs do.
5318 if (getTriple().getOS() != llvm::Triple::Solaris) {
5319 Builder.defineMacro("__sparc64__");
5320 Builder.defineMacro("__sparc_v9__");
5321 Builder.defineMacro("__sparcv9__");
5322 }
5323 }
5324
5325 bool setCPU(const std::string &Name) override {
5326 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5327 .Case("v9", true)
5328 .Case("ultrasparc", true)
5329 .Case("ultrasparc3", true)
5330 .Case("niagara", true)
5331 .Case("niagara2", true)
5332 .Case("niagara3", true)
5333 .Case("niagara4", true)
5334 .Default(false);
5335
5336 // No need to store the CPU yet. There aren't any CPU-specific
5337 // macros to define.
5338 return CPUKnown;
5339 }
5340};
5341
5342} // end anonymous namespace.
5343
5344namespace {
5345class SolarisSparcV8TargetInfo : public SolarisTargetInfo<SparcV8TargetInfo> {
5346public:
5347 SolarisSparcV8TargetInfo(const llvm::Triple &Triple)
5348 : SolarisTargetInfo<SparcV8TargetInfo>(Triple) {
5349 SizeType = UnsignedInt;
5350 PtrDiffType = SignedInt;
5351 }
5352};
5353} // end anonymous namespace.
5354
5355namespace {
5356class SystemZTargetInfo : public TargetInfo {
5357 static const char *const GCCRegNames[];
5358
5359public:
5360 SystemZTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5361 TLSSupported = true;
5362 IntWidth = IntAlign = 32;
5363 LongWidth = LongLongWidth = LongAlign = LongLongAlign = 64;
5364 PointerWidth = PointerAlign = 64;
5365 LongDoubleWidth = 128;
5366 LongDoubleAlign = 64;
5367 LongDoubleFormat = &llvm::APFloat::IEEEquad;
5368 MinGlobalAlign = 16;
5369 DescriptionString = "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64";
5370 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
5371 }
5372 void getTargetDefines(const LangOptions &Opts,
5373 MacroBuilder &Builder) const override {
5374 Builder.defineMacro("__s390__");
5375 Builder.defineMacro("__s390x__");
5376 Builder.defineMacro("__zarch__");
5377 Builder.defineMacro("__LONG_DOUBLE_128__");
5378 }
5379 void getTargetBuiltins(const Builtin::Info *&Records,
5380 unsigned &NumRecords) const override {
5381 // FIXME: Implement.
5382 Records = nullptr;
5383 NumRecords = 0;
5384 }
5385
5386 void getGCCRegNames(const char *const *&Names,
5387 unsigned &NumNames) const override;
5388 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5389 unsigned &NumAliases) const override {
5390 // No aliases.
5391 Aliases = nullptr;
5392 NumAliases = 0;
5393 }
5394 bool validateAsmConstraint(const char *&Name,
5395 TargetInfo::ConstraintInfo &info) const override;
5396 const char *getClobbers() const override {
5397 // FIXME: Is this really right?
5398 return "";
5399 }
5400 BuiltinVaListKind getBuiltinVaListKind() const override {
5401 return TargetInfo::SystemZBuiltinVaList;
5402 }
5403 bool setCPU(const std::string &Name) override {
5404 bool CPUKnown = llvm::StringSwitch<bool>(Name)
5405 .Case("z10", true)
5406 .Case("z196", true)
5407 .Case("zEC12", true)
5408 .Default(false);
5409
5410 // No need to store the CPU yet. There aren't any CPU-specific
5411 // macros to define.
5412 return CPUKnown;
5413 }
5414};
5415
5416const char *const SystemZTargetInfo::GCCRegNames[] = {
5417 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5418 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
5419 "f0", "f2", "f4", "f6", "f1", "f3", "f5", "f7",
5420 "f8", "f10", "f12", "f14", "f9", "f11", "f13", "f15"
5421};
5422
5423void SystemZTargetInfo::getGCCRegNames(const char *const *&Names,
5424 unsigned &NumNames) const {
5425 Names = GCCRegNames;
5426 NumNames = llvm::array_lengthof(GCCRegNames);
5427}
5428
5429bool SystemZTargetInfo::
5430validateAsmConstraint(const char *&Name,
5431 TargetInfo::ConstraintInfo &Info) const {
5432 switch (*Name) {
5433 default:
5434 return false;
5435
5436 case 'a': // Address register
5437 case 'd': // Data register (equivalent to 'r')
5438 case 'f': // Floating-point register
5439 Info.setAllowsRegister();
5440 return true;
5441
5442 case 'I': // Unsigned 8-bit constant
5443 case 'J': // Unsigned 12-bit constant
5444 case 'K': // Signed 16-bit constant
5445 case 'L': // Signed 20-bit displacement (on all targets we support)
5446 case 'M': // 0x7fffffff
5447 return true;
5448
5449 case 'Q': // Memory with base and unsigned 12-bit displacement
5450 case 'R': // Likewise, plus an index
5451 case 'S': // Memory with base and signed 20-bit displacement
5452 case 'T': // Likewise, plus an index
5453 Info.setAllowsMemory();
5454 return true;
5455 }
5456}
5457}
5458
5459namespace {
5460 class MSP430TargetInfo : public TargetInfo {
5461 static const char * const GCCRegNames[];
5462 public:
5463 MSP430TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5464 BigEndian = false;
5465 TLSSupported = false;
5466 IntWidth = 16; IntAlign = 16;
5467 LongWidth = 32; LongLongWidth = 64;
5468 LongAlign = LongLongAlign = 16;
5469 PointerWidth = 16; PointerAlign = 16;
5470 SuitableAlign = 16;
5471 SizeType = UnsignedInt;
5472 IntMaxType = SignedLongLong;
5473 IntPtrType = SignedInt;
5474 PtrDiffType = SignedInt;
5475 SigAtomicType = SignedLong;
5476 DescriptionString = "e-m:e-p:16:16-i32:16:32-a:16-n8:16";
5477 }
5478 void getTargetDefines(const LangOptions &Opts,
5479 MacroBuilder &Builder) const override {
5480 Builder.defineMacro("MSP430");
5481 Builder.defineMacro("__MSP430__");
5482 // FIXME: defines for different 'flavours' of MCU
5483 }
5484 void getTargetBuiltins(const Builtin::Info *&Records,
5485 unsigned &NumRecords) const override {
5486 // FIXME: Implement.
5487 Records = nullptr;
5488 NumRecords = 0;
5489 }
5490 bool hasFeature(StringRef Feature) const override {
5491 return Feature == "msp430";
5492 }
5493 void getGCCRegNames(const char * const *&Names,
5494 unsigned &NumNames) const override;
5495 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5496 unsigned &NumAliases) const override {
5497 // No aliases.
5498 Aliases = nullptr;
5499 NumAliases = 0;
5500 }
5501 bool
5502 validateAsmConstraint(const char *&Name,
5503 TargetInfo::ConstraintInfo &info) const override {
5504 // FIXME: implement
5505 switch (*Name) {
5506 case 'K': // the constant 1
5507 case 'L': // constant -1^20 .. 1^19
5508 case 'M': // constant 1-4:
5509 return true;
5510 }
5511 // No target constraints for now.
5512 return false;
5513 }
5514 const char *getClobbers() const override {
5515 // FIXME: Is this really right?
5516 return "";
5517 }
5518 BuiltinVaListKind getBuiltinVaListKind() const override {
5519 // FIXME: implement
5520 return TargetInfo::CharPtrBuiltinVaList;
5521 }
5522 };
5523
5524 const char * const MSP430TargetInfo::GCCRegNames[] = {
5525 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
5526 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
5527 };
5528
5529 void MSP430TargetInfo::getGCCRegNames(const char * const *&Names,
5530 unsigned &NumNames) const {
5531 Names = GCCRegNames;
5532 NumNames = llvm::array_lengthof(GCCRegNames);
5533 }
5534}
5535
5536namespace {
5537
5538 // LLVM and Clang cannot be used directly to output native binaries for
5539 // target, but is used to compile C code to llvm bitcode with correct
5540 // type and alignment information.
5541 //
5542 // TCE uses the llvm bitcode as input and uses it for generating customized
5543 // target processor and program binary. TCE co-design environment is
5544 // publicly available in http://tce.cs.tut.fi
5545
5546 static const unsigned TCEOpenCLAddrSpaceMap[] = {
5547 3, // opencl_global
5548 4, // opencl_local
5549 5, // opencl_constant
5550 // FIXME: generic has to be added to the target
5551 0, // opencl_generic
5552 0, // cuda_device
5553 0, // cuda_constant
5554 0 // cuda_shared
5555 };
5556
5557 class TCETargetInfo : public TargetInfo{
5558 public:
5559 TCETargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
5560 TLSSupported = false;
5561 IntWidth = 32;
5562 LongWidth = LongLongWidth = 32;
5563 PointerWidth = 32;
5564 IntAlign = 32;
5565 LongAlign = LongLongAlign = 32;
5566 PointerAlign = 32;
5567 SuitableAlign = 32;
5568 SizeType = UnsignedInt;
5569 IntMaxType = SignedLong;
5570 IntPtrType = SignedInt;
5571 PtrDiffType = SignedInt;
5572 FloatWidth = 32;
5573 FloatAlign = 32;
5574 DoubleWidth = 32;
5575 DoubleAlign = 32;
5576 LongDoubleWidth = 32;
5577 LongDoubleAlign = 32;
5578 FloatFormat = &llvm::APFloat::IEEEsingle;
5579 DoubleFormat = &llvm::APFloat::IEEEsingle;
5580 LongDoubleFormat = &llvm::APFloat::IEEEsingle;
5581 DescriptionString = "E-p:32:32-i8:8:32-i16:16:32-i64:32"
5582 "-f64:32-v64:32-v128:32-a:0:32-n32";
5583 AddrSpaceMap = &TCEOpenCLAddrSpaceMap;
5584 UseAddrSpaceMapMangling = true;
5585 }
5586
5587 void getTargetDefines(const LangOptions &Opts,
5588 MacroBuilder &Builder) const override {
5589 DefineStd(Builder, "tce", Opts);
5590 Builder.defineMacro("__TCE__");
5591 Builder.defineMacro("__TCE_V1__");
5592 }
5593 bool hasFeature(StringRef Feature) const override {
5594 return Feature == "tce";
5595 }
5596
5597 void getTargetBuiltins(const Builtin::Info *&Records,
5598 unsigned &NumRecords) const override {}
5599 const char *getClobbers() const override {
5600 return "";
5601 }
5602 BuiltinVaListKind getBuiltinVaListKind() const override {
5603 return TargetInfo::VoidPtrBuiltinVaList;
5604 }
5605 void getGCCRegNames(const char * const *&Names,
5606 unsigned &NumNames) const override {}
5607 bool validateAsmConstraint(const char *&Name,
5608 TargetInfo::ConstraintInfo &info) const override{
5609 return true;
5610 }
5611 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5612 unsigned &NumAliases) const override {}
5613 };
5614}
5615
5616namespace {
5617class MipsTargetInfoBase : public TargetInfo {
5618 virtual void setDescriptionString() = 0;
5619
5620 static const Builtin::Info BuiltinInfo[];
5621 std::string CPU;
5622 bool IsMips16;
5623 bool IsMicromips;
5624 bool IsNan2008;
5625 bool IsSingleFloat;
5626 enum MipsFloatABI {
5627 HardFloat, SoftFloat
5628 } FloatABI;
5629 enum DspRevEnum {
5630 NoDSP, DSP1, DSP2
5631 } DspRev;
5632 bool HasMSA;
5633
5634protected:
5635 bool HasFP64;
5636 std::string ABI;
5637
5638public:
5639 MipsTargetInfoBase(const llvm::Triple &Triple, const std::string &ABIStr,
5640 const std::string &CPUStr)
5641 : TargetInfo(Triple), CPU(CPUStr), IsMips16(false), IsMicromips(false),
5642 IsNan2008(false), IsSingleFloat(false), FloatABI(HardFloat),
5631 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {}
5643 DspRev(NoDSP), HasMSA(false), HasFP64(false), ABI(ABIStr) {
5644 TheCXXABI.set(TargetCXXABI::GenericMIPS);
5645 }
5632
5633 bool isNaN2008Default() const {
5634 return CPU == "mips32r6" || CPU == "mips64r6";
5635 }
5636
5637 bool isFP64Default() const {
5638 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5639 }
5640
5641 StringRef getABI() const override { return ABI; }
5642 bool setCPU(const std::string &Name) override {
5643 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5644 getTriple().getArch() == llvm::Triple::mipsel;
5645 CPU = Name;
5646 return llvm::StringSwitch<bool>(Name)
5647 .Case("mips1", IsMips32)
5648 .Case("mips2", IsMips32)
5649 .Case("mips3", true)
5650 .Case("mips4", true)
5651 .Case("mips5", true)
5652 .Case("mips32", IsMips32)
5653 .Case("mips32r2", IsMips32)
5654 .Case("mips32r6", IsMips32)
5655 .Case("mips64", true)
5656 .Case("mips64r2", true)
5657 .Case("mips64r6", true)
5658 .Case("octeon", true)
5659 .Default(false);
5660 }
5661 const std::string& getCPU() const { return CPU; }
5662 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
5663 // The backend enables certain ABI's by default according to the
5664 // architecture.
5665 // Disable both possible defaults so that we don't end up with multiple
5666 // ABI's selected and trigger an assertion.
5667 Features["o32"] = false;
5668 Features["n64"] = false;
5669
5670 Features[ABI] = true;
5671 if (CPU == "octeon")
5672 Features["mips64r2"] = Features["cnmips"] = true;
5673 else
5674 Features[CPU] = true;
5675 }
5676
5677 void getTargetDefines(const LangOptions &Opts,
5678 MacroBuilder &Builder) const override {
5679 Builder.defineMacro("__mips__");
5680 Builder.defineMacro("_mips");
5681 if (Opts.GNUMode)
5682 Builder.defineMacro("mips");
5683
5684 Builder.defineMacro("__REGISTER_PREFIX__", "");
5685
5686 switch (FloatABI) {
5687 case HardFloat:
5688 Builder.defineMacro("__mips_hard_float", Twine(1));
5689 break;
5690 case SoftFloat:
5691 Builder.defineMacro("__mips_soft_float", Twine(1));
5692 break;
5693 }
5694
5695 if (IsSingleFloat)
5696 Builder.defineMacro("__mips_single_float", Twine(1));
5697
5698 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5699 Builder.defineMacro("_MIPS_FPSET",
5700 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5701
5702 if (IsMips16)
5703 Builder.defineMacro("__mips16", Twine(1));
5704
5705 if (IsMicromips)
5706 Builder.defineMacro("__mips_micromips", Twine(1));
5707
5708 if (IsNan2008)
5709 Builder.defineMacro("__mips_nan2008", Twine(1));
5710
5711 switch (DspRev) {
5712 default:
5713 break;
5714 case DSP1:
5715 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5716 Builder.defineMacro("__mips_dsp", Twine(1));
5717 break;
5718 case DSP2:
5719 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5720 Builder.defineMacro("__mips_dspr2", Twine(1));
5721 Builder.defineMacro("__mips_dsp", Twine(1));
5722 break;
5723 }
5724
5725 if (HasMSA)
5726 Builder.defineMacro("__mips_msa", Twine(1));
5727
5728 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5729 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5730 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
5731
5732 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5733 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
5734 }
5735
5736 void getTargetBuiltins(const Builtin::Info *&Records,
5737 unsigned &NumRecords) const override {
5738 Records = BuiltinInfo;
5739 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
5740 }
5741 bool hasFeature(StringRef Feature) const override {
5742 return llvm::StringSwitch<bool>(Feature)
5743 .Case("mips", true)
5744 .Case("fp64", HasFP64)
5745 .Default(false);
5746 }
5747 BuiltinVaListKind getBuiltinVaListKind() const override {
5748 return TargetInfo::VoidPtrBuiltinVaList;
5749 }
5750 void getGCCRegNames(const char * const *&Names,
5751 unsigned &NumNames) const override {
5752 static const char *const GCCRegNames[] = {
5753 // CPU register names
5754 // Must match second column of GCCRegAliases
5755 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5756 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5757 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
5758 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5759 // Floating point register names
5760 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5761 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5762 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5763 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
5764 // Hi/lo and condition register names
5765 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
5766 "$fcc5","$fcc6","$fcc7",
5767 // MSA register names
5768 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5769 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5770 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5771 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5772 // MSA control register names
5773 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5774 "$msarequest", "$msamap", "$msaunmap"
5775 };
5776 Names = GCCRegNames;
5777 NumNames = llvm::array_lengthof(GCCRegNames);
5778 }
5779 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5780 unsigned &NumAliases) const override = 0;
5781 bool validateAsmConstraint(const char *&Name,
5782 TargetInfo::ConstraintInfo &Info) const override {
5783 switch (*Name) {
5784 default:
5785 return false;
5786 case 'r': // CPU registers.
5787 case 'd': // Equivalent to "r" unless generating MIPS16 code.
5788 case 'y': // Equivalent to "r", backward compatibility only.
5789 case 'f': // floating-point registers.
5790 case 'c': // $25 for indirect jumps
5791 case 'l': // lo register
5792 case 'x': // hilo register pair
5793 Info.setAllowsRegister();
5794 return true;
5795 case 'I': // Signed 16-bit constant
5796 case 'J': // Integer 0
5797 case 'K': // Unsigned 16-bit constant
5798 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
5799 case 'M': // Constants not loadable via lui, addiu, or ori
5800 case 'N': // Constant -1 to -65535
5801 case 'O': // A signed 15-bit constant
5802 case 'P': // A constant between 1 go 65535
5803 return true;
5804 case 'R': // An address that can be used in a non-macro load or store
5805 Info.setAllowsMemory();
5806 return true;
5807 }
5808 }
5809
5810 const char *getClobbers() const override {
5811 // In GCC, $1 is not widely used in generated code (it's used only in a few
5812 // specific situations), so there is no real need for users to add it to
5813 // the clobbers list if they want to use it in their inline assembly code.
5814 //
5815 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
5816 // code generation, so using it in inline assembly without adding it to the
5817 // clobbers list can cause conflicts between the inline assembly code and
5818 // the surrounding generated code.
5819 //
5820 // Another problem is that LLVM is allowed to choose $1 for inline assembly
5821 // operands, which will conflict with the ".set at" assembler option (which
5822 // we use only for inline assembly, in order to maintain compatibility with
5823 // GCC) and will also conflict with the user's usage of $1.
5824 //
5825 // The easiest way to avoid these conflicts and keep $1 as an allocatable
5826 // register for generated code is to automatically clobber $1 for all inline
5827 // assembly code.
5828 //
5829 // FIXME: We should automatically clobber $1 only for inline assembly code
5830 // which actually uses it. This would allow LLVM to use $1 for inline
5831 // assembly operands if the user's assembly code doesn't use it.
5832 return "~{$1}";
5833 }
5834
5835 bool handleTargetFeatures(std::vector<std::string> &Features,
5836 DiagnosticsEngine &Diags) override {
5837 IsMips16 = false;
5838 IsMicromips = false;
5839 IsNan2008 = isNaN2008Default();
5840 IsSingleFloat = false;
5841 FloatABI = HardFloat;
5842 DspRev = NoDSP;
5843 HasFP64 = isFP64Default();
5844
5845 for (std::vector<std::string>::iterator it = Features.begin(),
5846 ie = Features.end(); it != ie; ++it) {
5847 if (*it == "+single-float")
5848 IsSingleFloat = true;
5849 else if (*it == "+soft-float")
5850 FloatABI = SoftFloat;
5851 else if (*it == "+mips16")
5852 IsMips16 = true;
5853 else if (*it == "+micromips")
5854 IsMicromips = true;
5855 else if (*it == "+dsp")
5856 DspRev = std::max(DspRev, DSP1);
5857 else if (*it == "+dspr2")
5858 DspRev = std::max(DspRev, DSP2);
5859 else if (*it == "+msa")
5860 HasMSA = true;
5861 else if (*it == "+fp64")
5862 HasFP64 = true;
5863 else if (*it == "-fp64")
5864 HasFP64 = false;
5865 else if (*it == "+nan2008")
5866 IsNan2008 = true;
5867 else if (*it == "-nan2008")
5868 IsNan2008 = false;
5869 }
5870
5871 // Remove front-end specific options.
5872 std::vector<std::string>::iterator it =
5873 std::find(Features.begin(), Features.end(), "+soft-float");
5874 if (it != Features.end())
5875 Features.erase(it);
5876
5877 setDescriptionString();
5878
5879 return true;
5880 }
5881
5882 int getEHDataRegisterNumber(unsigned RegNo) const override {
5883 if (RegNo == 0) return 4;
5884 if (RegNo == 1) return 5;
5885 return -1;
5886 }
5887
5888 bool isCLZForZeroUndef() const override { return false; }
5889};
5890
5891const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5892#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5893#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5894 ALL_LANGUAGES },
5895#include "clang/Basic/BuiltinsMips.def"
5896};
5897
5898class Mips32TargetInfoBase : public MipsTargetInfoBase {
5899public:
5900 Mips32TargetInfoBase(const llvm::Triple &Triple)
5901 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
5902 SizeType = UnsignedInt;
5903 PtrDiffType = SignedInt;
5904 Int64Type = SignedLongLong;
5905 IntMaxType = Int64Type;
5906 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
5907 }
5908 bool setABI(const std::string &Name) override {
5909 if (Name == "o32" || Name == "eabi") {
5910 ABI = Name;
5911 return true;
5912 }
5913 return false;
5914 }
5915 void getTargetDefines(const LangOptions &Opts,
5916 MacroBuilder &Builder) const override {
5917 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
5918
5919 Builder.defineMacro("__mips", "32");
5920 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5921
5922 const std::string& CPUStr = getCPU();
5923 if (CPUStr == "mips32")
5924 Builder.defineMacro("__mips_isa_rev", "1");
5925 else if (CPUStr == "mips32r2")
5926 Builder.defineMacro("__mips_isa_rev", "2");
5927 else if (CPUStr == "mips32r6")
5928 Builder.defineMacro("__mips_isa_rev", "6");
5929
5930 if (ABI == "o32") {
5931 Builder.defineMacro("__mips_o32");
5932 Builder.defineMacro("_ABIO32", "1");
5933 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5934 }
5935 else if (ABI == "eabi")
5936 Builder.defineMacro("__mips_eabi");
5937 else
5938 llvm_unreachable("Invalid ABI for Mips32.");
5939 }
5940 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5941 unsigned &NumAliases) const override {
5942 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5943 { { "at" }, "$1" },
5944 { { "v0" }, "$2" },
5945 { { "v1" }, "$3" },
5946 { { "a0" }, "$4" },
5947 { { "a1" }, "$5" },
5948 { { "a2" }, "$6" },
5949 { { "a3" }, "$7" },
5950 { { "t0" }, "$8" },
5951 { { "t1" }, "$9" },
5952 { { "t2" }, "$10" },
5953 { { "t3" }, "$11" },
5954 { { "t4" }, "$12" },
5955 { { "t5" }, "$13" },
5956 { { "t6" }, "$14" },
5957 { { "t7" }, "$15" },
5958 { { "s0" }, "$16" },
5959 { { "s1" }, "$17" },
5960 { { "s2" }, "$18" },
5961 { { "s3" }, "$19" },
5962 { { "s4" }, "$20" },
5963 { { "s5" }, "$21" },
5964 { { "s6" }, "$22" },
5965 { { "s7" }, "$23" },
5966 { { "t8" }, "$24" },
5967 { { "t9" }, "$25" },
5968 { { "k0" }, "$26" },
5969 { { "k1" }, "$27" },
5970 { { "gp" }, "$28" },
5971 { { "sp","$sp" }, "$29" },
5972 { { "fp","$fp" }, "$30" },
5973 { { "ra" }, "$31" }
5974 };
5975 Aliases = GCCRegAliases;
5976 NumAliases = llvm::array_lengthof(GCCRegAliases);
5977 }
5978};
5979
5980class Mips32EBTargetInfo : public Mips32TargetInfoBase {
5981 void setDescriptionString() override {
5982 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
5983 }
5984
5985public:
5986 Mips32EBTargetInfo(const llvm::Triple &Triple)
5987 : Mips32TargetInfoBase(Triple) {
5988 }
5989 void getTargetDefines(const LangOptions &Opts,
5990 MacroBuilder &Builder) const override {
5991 DefineStd(Builder, "MIPSEB", Opts);
5992 Builder.defineMacro("_MIPSEB");
5993 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
5994 }
5995};
5996
5997class Mips32ELTargetInfo : public Mips32TargetInfoBase {
5998 void setDescriptionString() override {
5999 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
6000 }
6001
6002public:
6003 Mips32ELTargetInfo(const llvm::Triple &Triple)
6004 : Mips32TargetInfoBase(Triple) {
6005 BigEndian = false;
6006 }
6007 void getTargetDefines(const LangOptions &Opts,
6008 MacroBuilder &Builder) const override {
6009 DefineStd(Builder, "MIPSEL", Opts);
6010 Builder.defineMacro("_MIPSEL");
6011 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
6012 }
6013};
6014
6015class Mips64TargetInfoBase : public MipsTargetInfoBase {
6016public:
6017 Mips64TargetInfoBase(const llvm::Triple &Triple)
6018 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
6019 LongDoubleWidth = LongDoubleAlign = 128;
6020 LongDoubleFormat = &llvm::APFloat::IEEEquad;
6021 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6022 LongDoubleWidth = LongDoubleAlign = 64;
6023 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6024 }
6025 setN64ABITypes();
6026 SuitableAlign = 128;
6027 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6028 }
6029
6030 void setN64ABITypes() {
6031 LongWidth = LongAlign = 64;
6032 PointerWidth = PointerAlign = 64;
6033 SizeType = UnsignedLong;
6034 PtrDiffType = SignedLong;
6035 Int64Type = SignedLong;
6036 IntMaxType = Int64Type;
6037 }
6038
6039 void setN32ABITypes() {
6040 LongWidth = LongAlign = 32;
6041 PointerWidth = PointerAlign = 32;
6042 SizeType = UnsignedInt;
6043 PtrDiffType = SignedInt;
6044 Int64Type = SignedLongLong;
6045 IntMaxType = Int64Type;
6046 }
6047
6048 bool setABI(const std::string &Name) override {
6049 if (Name == "n32") {
6050 setN32ABITypes();
6051 ABI = Name;
6052 return true;
6053 }
6054 if (Name == "n64") {
6055 setN64ABITypes();
6056 ABI = Name;
6057 return true;
6058 }
6059 return false;
6060 }
6061
6062 void getTargetDefines(const LangOptions &Opts,
6063 MacroBuilder &Builder) const override {
6064 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
6065
6066 Builder.defineMacro("__mips", "64");
6067 Builder.defineMacro("__mips64");
6068 Builder.defineMacro("__mips64__");
6069 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6070
6071 const std::string& CPUStr = getCPU();
6072 if (CPUStr == "mips64")
6073 Builder.defineMacro("__mips_isa_rev", "1");
6074 else if (CPUStr == "mips64r2")
6075 Builder.defineMacro("__mips_isa_rev", "2");
6076 else if (CPUStr == "mips64r6")
6077 Builder.defineMacro("__mips_isa_rev", "6");
6078
6079 if (ABI == "n32") {
6080 Builder.defineMacro("__mips_n32");
6081 Builder.defineMacro("_ABIN32", "2");
6082 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6083 }
6084 else if (ABI == "n64") {
6085 Builder.defineMacro("__mips_n64");
6086 Builder.defineMacro("_ABI64", "3");
6087 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6088 }
6089 else
6090 llvm_unreachable("Invalid ABI for Mips64.");
6091 }
6092 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6093 unsigned &NumAliases) const override {
6094 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6095 { { "at" }, "$1" },
6096 { { "v0" }, "$2" },
6097 { { "v1" }, "$3" },
6098 { { "a0" }, "$4" },
6099 { { "a1" }, "$5" },
6100 { { "a2" }, "$6" },
6101 { { "a3" }, "$7" },
6102 { { "a4" }, "$8" },
6103 { { "a5" }, "$9" },
6104 { { "a6" }, "$10" },
6105 { { "a7" }, "$11" },
6106 { { "t0" }, "$12" },
6107 { { "t1" }, "$13" },
6108 { { "t2" }, "$14" },
6109 { { "t3" }, "$15" },
6110 { { "s0" }, "$16" },
6111 { { "s1" }, "$17" },
6112 { { "s2" }, "$18" },
6113 { { "s3" }, "$19" },
6114 { { "s4" }, "$20" },
6115 { { "s5" }, "$21" },
6116 { { "s6" }, "$22" },
6117 { { "s7" }, "$23" },
6118 { { "t8" }, "$24" },
6119 { { "t9" }, "$25" },
6120 { { "k0" }, "$26" },
6121 { { "k1" }, "$27" },
6122 { { "gp" }, "$28" },
6123 { { "sp","$sp" }, "$29" },
6124 { { "fp","$fp" }, "$30" },
6125 { { "ra" }, "$31" }
6126 };
6127 Aliases = GCCRegAliases;
6128 NumAliases = llvm::array_lengthof(GCCRegAliases);
6129 }
6130
6131 bool hasInt128Type() const override { return true; }
6132};
6133
6134class Mips64EBTargetInfo : public Mips64TargetInfoBase {
6135 void setDescriptionString() override {
6136 if (ABI == "n32")
6137 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
6138 else
6139 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
6140
6141 }
6142
6143public:
6144 Mips64EBTargetInfo(const llvm::Triple &Triple)
6145 : Mips64TargetInfoBase(Triple) {}
6146 void getTargetDefines(const LangOptions &Opts,
6147 MacroBuilder &Builder) const override {
6148 DefineStd(Builder, "MIPSEB", Opts);
6149 Builder.defineMacro("_MIPSEB");
6150 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
6151 }
6152};
6153
6154class Mips64ELTargetInfo : public Mips64TargetInfoBase {
6155 void setDescriptionString() override {
6156 if (ABI == "n32")
6157 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
6158 else
6159 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
6160 }
6161public:
6162 Mips64ELTargetInfo(const llvm::Triple &Triple)
6163 : Mips64TargetInfoBase(Triple) {
6164 // Default ABI is n64.
6165 BigEndian = false;
6166 }
6167 void getTargetDefines(const LangOptions &Opts,
6168 MacroBuilder &Builder) const override {
6169 DefineStd(Builder, "MIPSEL", Opts);
6170 Builder.defineMacro("_MIPSEL");
6171 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
6172 }
6173};
6174} // end anonymous namespace.
6175
6176namespace {
6177class PNaClTargetInfo : public TargetInfo {
6178public:
6179 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6180 BigEndian = false;
6181 this->UserLabelPrefix = "";
6182 this->LongAlign = 32;
6183 this->LongWidth = 32;
6184 this->PointerAlign = 32;
6185 this->PointerWidth = 32;
6186 this->IntMaxType = TargetInfo::SignedLongLong;
6187 this->Int64Type = TargetInfo::SignedLongLong;
6188 this->DoubleAlign = 64;
6189 this->LongDoubleWidth = 64;
6190 this->LongDoubleAlign = 64;
6191 this->SizeType = TargetInfo::UnsignedInt;
6192 this->PtrDiffType = TargetInfo::SignedInt;
6193 this->IntPtrType = TargetInfo::SignedInt;
6194 this->RegParmMax = 0; // Disallow regparm
6195 }
6196
6197 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
6198 }
6199 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
6200 Builder.defineMacro("__le32__");
6201 Builder.defineMacro("__pnacl__");
6202 }
6203 void getTargetDefines(const LangOptions &Opts,
6204 MacroBuilder &Builder) const override {
6205 getArchDefines(Opts, Builder);
6206 }
6207 bool hasFeature(StringRef Feature) const override {
6208 return Feature == "pnacl";
6209 }
6210 void getTargetBuiltins(const Builtin::Info *&Records,
6211 unsigned &NumRecords) const override {
6212 }
6213 BuiltinVaListKind getBuiltinVaListKind() const override {
6214 return TargetInfo::PNaClABIBuiltinVaList;
6215 }
6216 void getGCCRegNames(const char * const *&Names,
6217 unsigned &NumNames) const override;
6218 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6219 unsigned &NumAliases) const override;
6220 bool validateAsmConstraint(const char *&Name,
6221 TargetInfo::ConstraintInfo &Info) const override {
6222 return false;
6223 }
6224
6225 const char *getClobbers() const override {
6226 return "";
6227 }
6228};
6229
6230void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6231 unsigned &NumNames) const {
6232 Names = nullptr;
6233 NumNames = 0;
6234}
6235
6236void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6237 unsigned &NumAliases) const {
6238 Aliases = nullptr;
6239 NumAliases = 0;
6240}
6241} // end anonymous namespace.
6242
6243namespace {
6244class Le64TargetInfo : public TargetInfo {
6245 static const Builtin::Info BuiltinInfo[];
6246
6247public:
6248 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6249 BigEndian = false;
6250 NoAsmVariants = true;
6251 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6252 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6253 DescriptionString =
6254 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
6255 }
6256
6257 void getTargetDefines(const LangOptions &Opts,
6258 MacroBuilder &Builder) const override {
6259 DefineStd(Builder, "unix", Opts);
6260 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6261 Builder.defineMacro("__ELF__");
6262 }
6263 void getTargetBuiltins(const Builtin::Info *&Records,
6264 unsigned &NumRecords) const override {
6265 Records = BuiltinInfo;
6266 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6267 }
6268 BuiltinVaListKind getBuiltinVaListKind() const override {
6269 return TargetInfo::PNaClABIBuiltinVaList;
6270 }
6271 const char *getClobbers() const override { return ""; }
6272 void getGCCRegNames(const char *const *&Names,
6273 unsigned &NumNames) const override {
6274 Names = nullptr;
6275 NumNames = 0;
6276 }
6277 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6278 unsigned &NumAliases) const override {
6279 Aliases = nullptr;
6280 NumAliases = 0;
6281 }
6282 bool validateAsmConstraint(const char *&Name,
6283 TargetInfo::ConstraintInfo &Info) const override {
6284 return false;
6285 }
6286
6287 bool hasProtectedVisibility() const override { return false; }
6288};
6289} // end anonymous namespace.
6290
6291const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6292#define BUILTIN(ID, TYPE, ATTRS) \
6293 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6294#include "clang/Basic/BuiltinsLe64.def"
6295};
6296
6297namespace {
6298 static const unsigned SPIRAddrSpaceMap[] = {
6299 1, // opencl_global
6300 3, // opencl_local
6301 2, // opencl_constant
6302 4, // opencl_generic
6303 0, // cuda_device
6304 0, // cuda_constant
6305 0 // cuda_shared
6306 };
6307 class SPIRTargetInfo : public TargetInfo {
6308 public:
6309 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6310 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6311 "SPIR target must use unknown OS");
6312 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6313 "SPIR target must use unknown environment type");
6314 BigEndian = false;
6315 TLSSupported = false;
6316 LongWidth = LongAlign = 64;
6317 AddrSpaceMap = &SPIRAddrSpaceMap;
6318 UseAddrSpaceMapMangling = true;
6319 // Define available target features
6320 // These must be defined in sorted order!
6321 NoAsmVariants = true;
6322 }
6323 void getTargetDefines(const LangOptions &Opts,
6324 MacroBuilder &Builder) const override {
6325 DefineStd(Builder, "SPIR", Opts);
6326 }
6327 bool hasFeature(StringRef Feature) const override {
6328 return Feature == "spir";
6329 }
6330
6331 void getTargetBuiltins(const Builtin::Info *&Records,
6332 unsigned &NumRecords) const override {}
6333 const char *getClobbers() const override {
6334 return "";
6335 }
6336 void getGCCRegNames(const char * const *&Names,
6337 unsigned &NumNames) const override {}
6338 bool
6339 validateAsmConstraint(const char *&Name,
6340 TargetInfo::ConstraintInfo &info) const override {
6341 return true;
6342 }
6343 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6344 unsigned &NumAliases) const override {}
6345 BuiltinVaListKind getBuiltinVaListKind() const override {
6346 return TargetInfo::VoidPtrBuiltinVaList;
6347 }
6348 };
6349
6350
6351 class SPIR32TargetInfo : public SPIRTargetInfo {
6352 public:
6353 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
6354 PointerWidth = PointerAlign = 32;
6355 SizeType = TargetInfo::UnsignedInt;
6356 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6357 DescriptionString
6358 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6359 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
6360 }
6361 void getTargetDefines(const LangOptions &Opts,
6362 MacroBuilder &Builder) const override {
6363 DefineStd(Builder, "SPIR32", Opts);
6364 }
6365 };
6366
6367 class SPIR64TargetInfo : public SPIRTargetInfo {
6368 public:
6369 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
6370 PointerWidth = PointerAlign = 64;
6371 SizeType = TargetInfo::UnsignedLong;
6372 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
6373 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6374 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
6375 }
6376 void getTargetDefines(const LangOptions &Opts,
6377 MacroBuilder &Builder) const override {
6378 DefineStd(Builder, "SPIR64", Opts);
6379 }
6380 };
6381}
6382
6383namespace {
6384class XCoreTargetInfo : public TargetInfo {
6385 static const Builtin::Info BuiltinInfo[];
6386public:
6387 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6388 BigEndian = false;
6389 NoAsmVariants = true;
6390 LongLongAlign = 32;
6391 SuitableAlign = 32;
6392 DoubleAlign = LongDoubleAlign = 32;
6393 SizeType = UnsignedInt;
6394 PtrDiffType = SignedInt;
6395 IntPtrType = SignedInt;
6396 WCharType = UnsignedChar;
6397 WIntType = UnsignedInt;
6398 UseZeroLengthBitfieldAlignment = true;
6399 DescriptionString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
6400 "-f64:32-a:0:32-n32";
6401 }
6402 void getTargetDefines(const LangOptions &Opts,
6403 MacroBuilder &Builder) const override {
6404 Builder.defineMacro("__XS1B__");
6405 }
6406 void getTargetBuiltins(const Builtin::Info *&Records,
6407 unsigned &NumRecords) const override {
6408 Records = BuiltinInfo;
6409 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6410 }
6411 BuiltinVaListKind getBuiltinVaListKind() const override {
6412 return TargetInfo::VoidPtrBuiltinVaList;
6413 }
6414 const char *getClobbers() const override {
6415 return "";
6416 }
6417 void getGCCRegNames(const char * const *&Names,
6418 unsigned &NumNames) const override {
6419 static const char * const GCCRegNames[] = {
6420 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6421 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6422 };
6423 Names = GCCRegNames;
6424 NumNames = llvm::array_lengthof(GCCRegNames);
6425 }
6426 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6427 unsigned &NumAliases) const override {
6428 Aliases = nullptr;
6429 NumAliases = 0;
6430 }
6431 bool validateAsmConstraint(const char *&Name,
6432 TargetInfo::ConstraintInfo &Info) const override {
6433 return false;
6434 }
6435 int getEHDataRegisterNumber(unsigned RegNo) const override {
6436 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6437 return (RegNo < 2)? RegNo : -1;
6438 }
6439};
6440
6441const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6442#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6443#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6444 ALL_LANGUAGES },
6445#include "clang/Basic/BuiltinsXCore.def"
6446};
6447} // end anonymous namespace.
6448
6449
6450//===----------------------------------------------------------------------===//
6451// Driver code
6452//===----------------------------------------------------------------------===//
6453
6454static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
6455 llvm::Triple::OSType os = Triple.getOS();
6456
6457 switch (Triple.getArch()) {
6458 default:
6459 return nullptr;
6460
6461 case llvm::Triple::xcore:
6462 return new XCoreTargetInfo(Triple);
6463
6464 case llvm::Triple::hexagon:
6465 return new HexagonTargetInfo(Triple);
6466
6467 case llvm::Triple::aarch64:
6468 if (Triple.isOSDarwin())
6469 return new DarwinAArch64TargetInfo(Triple);
6470
6471 switch (os) {
6472 case llvm::Triple::FreeBSD:
6473 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
6474 case llvm::Triple::Linux:
6475 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
6476 case llvm::Triple::NetBSD:
6477 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
6478 default:
6479 return new AArch64leTargetInfo(Triple);
6480 }
6481
6482 case llvm::Triple::aarch64_be:
6483 switch (os) {
6484 case llvm::Triple::FreeBSD:
6485 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
6486 case llvm::Triple::Linux:
6487 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
6488 case llvm::Triple::NetBSD:
6489 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
6490 default:
6491 return new AArch64beTargetInfo(Triple);
6492 }
6493
6494 case llvm::Triple::arm:
6495 case llvm::Triple::thumb:
6496 if (Triple.isOSBinFormatMachO())
6497 return new DarwinARMTargetInfo(Triple);
6498
6499 switch (os) {
6500 case llvm::Triple::Linux:
6501 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
6502 case llvm::Triple::FreeBSD:
6503 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
6504 case llvm::Triple::NetBSD:
6505 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
6506 case llvm::Triple::OpenBSD:
6507 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
6508 case llvm::Triple::Bitrig:
6509 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
6510 case llvm::Triple::RTEMS:
6511 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
6512 case llvm::Triple::NaCl:
6513 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
6514 case llvm::Triple::Win32:
6515 switch (Triple.getEnvironment()) {
6516 default:
6517 return new ARMleTargetInfo(Triple);
6518 case llvm::Triple::Itanium:
6519 return new ItaniumWindowsARMleTargetInfo(Triple);
6520 case llvm::Triple::MSVC:
6521 return new MicrosoftARMleTargetInfo(Triple);
6522 }
6523 default:
6524 return new ARMleTargetInfo(Triple);
6525 }
6526
6527 case llvm::Triple::armeb:
6528 case llvm::Triple::thumbeb:
6529 if (Triple.isOSDarwin())
6530 return new DarwinARMTargetInfo(Triple);
6531
6532 switch (os) {
6533 case llvm::Triple::Linux:
6534 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6535 case llvm::Triple::FreeBSD:
6536 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6537 case llvm::Triple::NetBSD:
6538 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6539 case llvm::Triple::OpenBSD:
6540 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6541 case llvm::Triple::Bitrig:
6542 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6543 case llvm::Triple::RTEMS:
6544 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6545 case llvm::Triple::NaCl:
6546 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6547 default:
6548 return new ARMbeTargetInfo(Triple);
6549 }
6550
6551 case llvm::Triple::msp430:
6552 return new MSP430TargetInfo(Triple);
6553
6554 case llvm::Triple::mips:
6555 switch (os) {
6556 case llvm::Triple::Linux:
6557 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
6558 case llvm::Triple::RTEMS:
6559 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
6560 case llvm::Triple::FreeBSD:
6561 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
6562 case llvm::Triple::NetBSD:
6563 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
6564 default:
6565 return new Mips32EBTargetInfo(Triple);
6566 }
6567
6568 case llvm::Triple::mipsel:
6569 switch (os) {
6570 case llvm::Triple::Linux:
6571 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
6572 case llvm::Triple::RTEMS:
6573 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
6574 case llvm::Triple::FreeBSD:
6575 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
6576 case llvm::Triple::NetBSD:
6577 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
6578 case llvm::Triple::NaCl:
6579 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
6580 default:
6581 return new Mips32ELTargetInfo(Triple);
6582 }
6583
6584 case llvm::Triple::mips64:
6585 switch (os) {
6586 case llvm::Triple::Linux:
6587 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
6588 case llvm::Triple::RTEMS:
6589 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
6590 case llvm::Triple::FreeBSD:
6591 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
6592 case llvm::Triple::NetBSD:
6593 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
6594 case llvm::Triple::OpenBSD:
6595 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
6596 default:
6597 return new Mips64EBTargetInfo(Triple);
6598 }
6599
6600 case llvm::Triple::mips64el:
6601 switch (os) {
6602 case llvm::Triple::Linux:
6603 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
6604 case llvm::Triple::RTEMS:
6605 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
6606 case llvm::Triple::FreeBSD:
6607 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
6608 case llvm::Triple::NetBSD:
6609 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
6610 case llvm::Triple::OpenBSD:
6611 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
6612 default:
6613 return new Mips64ELTargetInfo(Triple);
6614 }
6615
6616 case llvm::Triple::le32:
6617 switch (os) {
6618 case llvm::Triple::NaCl:
6619 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
6620 default:
6621 return nullptr;
6622 }
6623
6624 case llvm::Triple::le64:
6625 return new Le64TargetInfo(Triple);
6626
6627 case llvm::Triple::ppc:
6628 if (Triple.isOSDarwin())
6629 return new DarwinPPC32TargetInfo(Triple);
6630 switch (os) {
6631 case llvm::Triple::Linux:
6632 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
6633 case llvm::Triple::FreeBSD:
6634 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
6635 case llvm::Triple::NetBSD:
6636 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
6637 case llvm::Triple::OpenBSD:
6638 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
6639 case llvm::Triple::RTEMS:
6640 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
6641 default:
6642 return new PPC32TargetInfo(Triple);
6643 }
6644
6645 case llvm::Triple::ppc64:
6646 if (Triple.isOSDarwin())
6647 return new DarwinPPC64TargetInfo(Triple);
6648 switch (os) {
6649 case llvm::Triple::Linux:
6650 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6651 case llvm::Triple::Lv2:
6652 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
6653 case llvm::Triple::FreeBSD:
6654 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
6655 case llvm::Triple::NetBSD:
6656 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
6657 default:
6658 return new PPC64TargetInfo(Triple);
6659 }
6660
6661 case llvm::Triple::ppc64le:
6662 switch (os) {
6663 case llvm::Triple::Linux:
6664 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
5646
5647 bool isNaN2008Default() const {
5648 return CPU == "mips32r6" || CPU == "mips64r6";
5649 }
5650
5651 bool isFP64Default() const {
5652 return CPU == "mips32r6" || ABI == "n32" || ABI == "n64" || ABI == "64";
5653 }
5654
5655 StringRef getABI() const override { return ABI; }
5656 bool setCPU(const std::string &Name) override {
5657 bool IsMips32 = getTriple().getArch() == llvm::Triple::mips ||
5658 getTriple().getArch() == llvm::Triple::mipsel;
5659 CPU = Name;
5660 return llvm::StringSwitch<bool>(Name)
5661 .Case("mips1", IsMips32)
5662 .Case("mips2", IsMips32)
5663 .Case("mips3", true)
5664 .Case("mips4", true)
5665 .Case("mips5", true)
5666 .Case("mips32", IsMips32)
5667 .Case("mips32r2", IsMips32)
5668 .Case("mips32r6", IsMips32)
5669 .Case("mips64", true)
5670 .Case("mips64r2", true)
5671 .Case("mips64r6", true)
5672 .Case("octeon", true)
5673 .Default(false);
5674 }
5675 const std::string& getCPU() const { return CPU; }
5676 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
5677 // The backend enables certain ABI's by default according to the
5678 // architecture.
5679 // Disable both possible defaults so that we don't end up with multiple
5680 // ABI's selected and trigger an assertion.
5681 Features["o32"] = false;
5682 Features["n64"] = false;
5683
5684 Features[ABI] = true;
5685 if (CPU == "octeon")
5686 Features["mips64r2"] = Features["cnmips"] = true;
5687 else
5688 Features[CPU] = true;
5689 }
5690
5691 void getTargetDefines(const LangOptions &Opts,
5692 MacroBuilder &Builder) const override {
5693 Builder.defineMacro("__mips__");
5694 Builder.defineMacro("_mips");
5695 if (Opts.GNUMode)
5696 Builder.defineMacro("mips");
5697
5698 Builder.defineMacro("__REGISTER_PREFIX__", "");
5699
5700 switch (FloatABI) {
5701 case HardFloat:
5702 Builder.defineMacro("__mips_hard_float", Twine(1));
5703 break;
5704 case SoftFloat:
5705 Builder.defineMacro("__mips_soft_float", Twine(1));
5706 break;
5707 }
5708
5709 if (IsSingleFloat)
5710 Builder.defineMacro("__mips_single_float", Twine(1));
5711
5712 Builder.defineMacro("__mips_fpr", HasFP64 ? Twine(64) : Twine(32));
5713 Builder.defineMacro("_MIPS_FPSET",
5714 Twine(32 / (HasFP64 || IsSingleFloat ? 1 : 2)));
5715
5716 if (IsMips16)
5717 Builder.defineMacro("__mips16", Twine(1));
5718
5719 if (IsMicromips)
5720 Builder.defineMacro("__mips_micromips", Twine(1));
5721
5722 if (IsNan2008)
5723 Builder.defineMacro("__mips_nan2008", Twine(1));
5724
5725 switch (DspRev) {
5726 default:
5727 break;
5728 case DSP1:
5729 Builder.defineMacro("__mips_dsp_rev", Twine(1));
5730 Builder.defineMacro("__mips_dsp", Twine(1));
5731 break;
5732 case DSP2:
5733 Builder.defineMacro("__mips_dsp_rev", Twine(2));
5734 Builder.defineMacro("__mips_dspr2", Twine(1));
5735 Builder.defineMacro("__mips_dsp", Twine(1));
5736 break;
5737 }
5738
5739 if (HasMSA)
5740 Builder.defineMacro("__mips_msa", Twine(1));
5741
5742 Builder.defineMacro("_MIPS_SZPTR", Twine(getPointerWidth(0)));
5743 Builder.defineMacro("_MIPS_SZINT", Twine(getIntWidth()));
5744 Builder.defineMacro("_MIPS_SZLONG", Twine(getLongWidth()));
5745
5746 Builder.defineMacro("_MIPS_ARCH", "\"" + CPU + "\"");
5747 Builder.defineMacro("_MIPS_ARCH_" + StringRef(CPU).upper());
5748 }
5749
5750 void getTargetBuiltins(const Builtin::Info *&Records,
5751 unsigned &NumRecords) const override {
5752 Records = BuiltinInfo;
5753 NumRecords = clang::Mips::LastTSBuiltin - Builtin::FirstTSBuiltin;
5754 }
5755 bool hasFeature(StringRef Feature) const override {
5756 return llvm::StringSwitch<bool>(Feature)
5757 .Case("mips", true)
5758 .Case("fp64", HasFP64)
5759 .Default(false);
5760 }
5761 BuiltinVaListKind getBuiltinVaListKind() const override {
5762 return TargetInfo::VoidPtrBuiltinVaList;
5763 }
5764 void getGCCRegNames(const char * const *&Names,
5765 unsigned &NumNames) const override {
5766 static const char *const GCCRegNames[] = {
5767 // CPU register names
5768 // Must match second column of GCCRegAliases
5769 "$0", "$1", "$2", "$3", "$4", "$5", "$6", "$7",
5770 "$8", "$9", "$10", "$11", "$12", "$13", "$14", "$15",
5771 "$16", "$17", "$18", "$19", "$20", "$21", "$22", "$23",
5772 "$24", "$25", "$26", "$27", "$28", "$29", "$30", "$31",
5773 // Floating point register names
5774 "$f0", "$f1", "$f2", "$f3", "$f4", "$f5", "$f6", "$f7",
5775 "$f8", "$f9", "$f10", "$f11", "$f12", "$f13", "$f14", "$f15",
5776 "$f16", "$f17", "$f18", "$f19", "$f20", "$f21", "$f22", "$f23",
5777 "$f24", "$f25", "$f26", "$f27", "$f28", "$f29", "$f30", "$f31",
5778 // Hi/lo and condition register names
5779 "hi", "lo", "", "$fcc0","$fcc1","$fcc2","$fcc3","$fcc4",
5780 "$fcc5","$fcc6","$fcc7",
5781 // MSA register names
5782 "$w0", "$w1", "$w2", "$w3", "$w4", "$w5", "$w6", "$w7",
5783 "$w8", "$w9", "$w10", "$w11", "$w12", "$w13", "$w14", "$w15",
5784 "$w16", "$w17", "$w18", "$w19", "$w20", "$w21", "$w22", "$w23",
5785 "$w24", "$w25", "$w26", "$w27", "$w28", "$w29", "$w30", "$w31",
5786 // MSA control register names
5787 "$msair", "$msacsr", "$msaaccess", "$msasave", "$msamodify",
5788 "$msarequest", "$msamap", "$msaunmap"
5789 };
5790 Names = GCCRegNames;
5791 NumNames = llvm::array_lengthof(GCCRegNames);
5792 }
5793 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5794 unsigned &NumAliases) const override = 0;
5795 bool validateAsmConstraint(const char *&Name,
5796 TargetInfo::ConstraintInfo &Info) const override {
5797 switch (*Name) {
5798 default:
5799 return false;
5800 case 'r': // CPU registers.
5801 case 'd': // Equivalent to "r" unless generating MIPS16 code.
5802 case 'y': // Equivalent to "r", backward compatibility only.
5803 case 'f': // floating-point registers.
5804 case 'c': // $25 for indirect jumps
5805 case 'l': // lo register
5806 case 'x': // hilo register pair
5807 Info.setAllowsRegister();
5808 return true;
5809 case 'I': // Signed 16-bit constant
5810 case 'J': // Integer 0
5811 case 'K': // Unsigned 16-bit constant
5812 case 'L': // Signed 32-bit constant, lower 16-bit zeros (for lui)
5813 case 'M': // Constants not loadable via lui, addiu, or ori
5814 case 'N': // Constant -1 to -65535
5815 case 'O': // A signed 15-bit constant
5816 case 'P': // A constant between 1 go 65535
5817 return true;
5818 case 'R': // An address that can be used in a non-macro load or store
5819 Info.setAllowsMemory();
5820 return true;
5821 }
5822 }
5823
5824 const char *getClobbers() const override {
5825 // In GCC, $1 is not widely used in generated code (it's used only in a few
5826 // specific situations), so there is no real need for users to add it to
5827 // the clobbers list if they want to use it in their inline assembly code.
5828 //
5829 // In LLVM, $1 is treated as a normal GPR and is always allocatable during
5830 // code generation, so using it in inline assembly without adding it to the
5831 // clobbers list can cause conflicts between the inline assembly code and
5832 // the surrounding generated code.
5833 //
5834 // Another problem is that LLVM is allowed to choose $1 for inline assembly
5835 // operands, which will conflict with the ".set at" assembler option (which
5836 // we use only for inline assembly, in order to maintain compatibility with
5837 // GCC) and will also conflict with the user's usage of $1.
5838 //
5839 // The easiest way to avoid these conflicts and keep $1 as an allocatable
5840 // register for generated code is to automatically clobber $1 for all inline
5841 // assembly code.
5842 //
5843 // FIXME: We should automatically clobber $1 only for inline assembly code
5844 // which actually uses it. This would allow LLVM to use $1 for inline
5845 // assembly operands if the user's assembly code doesn't use it.
5846 return "~{$1}";
5847 }
5848
5849 bool handleTargetFeatures(std::vector<std::string> &Features,
5850 DiagnosticsEngine &Diags) override {
5851 IsMips16 = false;
5852 IsMicromips = false;
5853 IsNan2008 = isNaN2008Default();
5854 IsSingleFloat = false;
5855 FloatABI = HardFloat;
5856 DspRev = NoDSP;
5857 HasFP64 = isFP64Default();
5858
5859 for (std::vector<std::string>::iterator it = Features.begin(),
5860 ie = Features.end(); it != ie; ++it) {
5861 if (*it == "+single-float")
5862 IsSingleFloat = true;
5863 else if (*it == "+soft-float")
5864 FloatABI = SoftFloat;
5865 else if (*it == "+mips16")
5866 IsMips16 = true;
5867 else if (*it == "+micromips")
5868 IsMicromips = true;
5869 else if (*it == "+dsp")
5870 DspRev = std::max(DspRev, DSP1);
5871 else if (*it == "+dspr2")
5872 DspRev = std::max(DspRev, DSP2);
5873 else if (*it == "+msa")
5874 HasMSA = true;
5875 else if (*it == "+fp64")
5876 HasFP64 = true;
5877 else if (*it == "-fp64")
5878 HasFP64 = false;
5879 else if (*it == "+nan2008")
5880 IsNan2008 = true;
5881 else if (*it == "-nan2008")
5882 IsNan2008 = false;
5883 }
5884
5885 // Remove front-end specific options.
5886 std::vector<std::string>::iterator it =
5887 std::find(Features.begin(), Features.end(), "+soft-float");
5888 if (it != Features.end())
5889 Features.erase(it);
5890
5891 setDescriptionString();
5892
5893 return true;
5894 }
5895
5896 int getEHDataRegisterNumber(unsigned RegNo) const override {
5897 if (RegNo == 0) return 4;
5898 if (RegNo == 1) return 5;
5899 return -1;
5900 }
5901
5902 bool isCLZForZeroUndef() const override { return false; }
5903};
5904
5905const Builtin::Info MipsTargetInfoBase::BuiltinInfo[] = {
5906#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
5907#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
5908 ALL_LANGUAGES },
5909#include "clang/Basic/BuiltinsMips.def"
5910};
5911
5912class Mips32TargetInfoBase : public MipsTargetInfoBase {
5913public:
5914 Mips32TargetInfoBase(const llvm::Triple &Triple)
5915 : MipsTargetInfoBase(Triple, "o32", "mips32r2") {
5916 SizeType = UnsignedInt;
5917 PtrDiffType = SignedInt;
5918 Int64Type = SignedLongLong;
5919 IntMaxType = Int64Type;
5920 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 32;
5921 }
5922 bool setABI(const std::string &Name) override {
5923 if (Name == "o32" || Name == "eabi") {
5924 ABI = Name;
5925 return true;
5926 }
5927 return false;
5928 }
5929 void getTargetDefines(const LangOptions &Opts,
5930 MacroBuilder &Builder) const override {
5931 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
5932
5933 Builder.defineMacro("__mips", "32");
5934 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS32");
5935
5936 const std::string& CPUStr = getCPU();
5937 if (CPUStr == "mips32")
5938 Builder.defineMacro("__mips_isa_rev", "1");
5939 else if (CPUStr == "mips32r2")
5940 Builder.defineMacro("__mips_isa_rev", "2");
5941 else if (CPUStr == "mips32r6")
5942 Builder.defineMacro("__mips_isa_rev", "6");
5943
5944 if (ABI == "o32") {
5945 Builder.defineMacro("__mips_o32");
5946 Builder.defineMacro("_ABIO32", "1");
5947 Builder.defineMacro("_MIPS_SIM", "_ABIO32");
5948 }
5949 else if (ABI == "eabi")
5950 Builder.defineMacro("__mips_eabi");
5951 else
5952 llvm_unreachable("Invalid ABI for Mips32.");
5953 }
5954 void getGCCRegAliases(const GCCRegAlias *&Aliases,
5955 unsigned &NumAliases) const override {
5956 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
5957 { { "at" }, "$1" },
5958 { { "v0" }, "$2" },
5959 { { "v1" }, "$3" },
5960 { { "a0" }, "$4" },
5961 { { "a1" }, "$5" },
5962 { { "a2" }, "$6" },
5963 { { "a3" }, "$7" },
5964 { { "t0" }, "$8" },
5965 { { "t1" }, "$9" },
5966 { { "t2" }, "$10" },
5967 { { "t3" }, "$11" },
5968 { { "t4" }, "$12" },
5969 { { "t5" }, "$13" },
5970 { { "t6" }, "$14" },
5971 { { "t7" }, "$15" },
5972 { { "s0" }, "$16" },
5973 { { "s1" }, "$17" },
5974 { { "s2" }, "$18" },
5975 { { "s3" }, "$19" },
5976 { { "s4" }, "$20" },
5977 { { "s5" }, "$21" },
5978 { { "s6" }, "$22" },
5979 { { "s7" }, "$23" },
5980 { { "t8" }, "$24" },
5981 { { "t9" }, "$25" },
5982 { { "k0" }, "$26" },
5983 { { "k1" }, "$27" },
5984 { { "gp" }, "$28" },
5985 { { "sp","$sp" }, "$29" },
5986 { { "fp","$fp" }, "$30" },
5987 { { "ra" }, "$31" }
5988 };
5989 Aliases = GCCRegAliases;
5990 NumAliases = llvm::array_lengthof(GCCRegAliases);
5991 }
5992};
5993
5994class Mips32EBTargetInfo : public Mips32TargetInfoBase {
5995 void setDescriptionString() override {
5996 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
5997 }
5998
5999public:
6000 Mips32EBTargetInfo(const llvm::Triple &Triple)
6001 : Mips32TargetInfoBase(Triple) {
6002 }
6003 void getTargetDefines(const LangOptions &Opts,
6004 MacroBuilder &Builder) const override {
6005 DefineStd(Builder, "MIPSEB", Opts);
6006 Builder.defineMacro("_MIPSEB");
6007 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
6008 }
6009};
6010
6011class Mips32ELTargetInfo : public Mips32TargetInfoBase {
6012 void setDescriptionString() override {
6013 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32-S64";
6014 }
6015
6016public:
6017 Mips32ELTargetInfo(const llvm::Triple &Triple)
6018 : Mips32TargetInfoBase(Triple) {
6019 BigEndian = false;
6020 }
6021 void getTargetDefines(const LangOptions &Opts,
6022 MacroBuilder &Builder) const override {
6023 DefineStd(Builder, "MIPSEL", Opts);
6024 Builder.defineMacro("_MIPSEL");
6025 Mips32TargetInfoBase::getTargetDefines(Opts, Builder);
6026 }
6027};
6028
6029class Mips64TargetInfoBase : public MipsTargetInfoBase {
6030public:
6031 Mips64TargetInfoBase(const llvm::Triple &Triple)
6032 : MipsTargetInfoBase(Triple, "n64", "mips64r2") {
6033 LongDoubleWidth = LongDoubleAlign = 128;
6034 LongDoubleFormat = &llvm::APFloat::IEEEquad;
6035 if (getTriple().getOS() == llvm::Triple::FreeBSD) {
6036 LongDoubleWidth = LongDoubleAlign = 64;
6037 LongDoubleFormat = &llvm::APFloat::IEEEdouble;
6038 }
6039 setN64ABITypes();
6040 SuitableAlign = 128;
6041 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6042 }
6043
6044 void setN64ABITypes() {
6045 LongWidth = LongAlign = 64;
6046 PointerWidth = PointerAlign = 64;
6047 SizeType = UnsignedLong;
6048 PtrDiffType = SignedLong;
6049 Int64Type = SignedLong;
6050 IntMaxType = Int64Type;
6051 }
6052
6053 void setN32ABITypes() {
6054 LongWidth = LongAlign = 32;
6055 PointerWidth = PointerAlign = 32;
6056 SizeType = UnsignedInt;
6057 PtrDiffType = SignedInt;
6058 Int64Type = SignedLongLong;
6059 IntMaxType = Int64Type;
6060 }
6061
6062 bool setABI(const std::string &Name) override {
6063 if (Name == "n32") {
6064 setN32ABITypes();
6065 ABI = Name;
6066 return true;
6067 }
6068 if (Name == "n64") {
6069 setN64ABITypes();
6070 ABI = Name;
6071 return true;
6072 }
6073 return false;
6074 }
6075
6076 void getTargetDefines(const LangOptions &Opts,
6077 MacroBuilder &Builder) const override {
6078 MipsTargetInfoBase::getTargetDefines(Opts, Builder);
6079
6080 Builder.defineMacro("__mips", "64");
6081 Builder.defineMacro("__mips64");
6082 Builder.defineMacro("__mips64__");
6083 Builder.defineMacro("_MIPS_ISA", "_MIPS_ISA_MIPS64");
6084
6085 const std::string& CPUStr = getCPU();
6086 if (CPUStr == "mips64")
6087 Builder.defineMacro("__mips_isa_rev", "1");
6088 else if (CPUStr == "mips64r2")
6089 Builder.defineMacro("__mips_isa_rev", "2");
6090 else if (CPUStr == "mips64r6")
6091 Builder.defineMacro("__mips_isa_rev", "6");
6092
6093 if (ABI == "n32") {
6094 Builder.defineMacro("__mips_n32");
6095 Builder.defineMacro("_ABIN32", "2");
6096 Builder.defineMacro("_MIPS_SIM", "_ABIN32");
6097 }
6098 else if (ABI == "n64") {
6099 Builder.defineMacro("__mips_n64");
6100 Builder.defineMacro("_ABI64", "3");
6101 Builder.defineMacro("_MIPS_SIM", "_ABI64");
6102 }
6103 else
6104 llvm_unreachable("Invalid ABI for Mips64.");
6105 }
6106 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6107 unsigned &NumAliases) const override {
6108 static const TargetInfo::GCCRegAlias GCCRegAliases[] = {
6109 { { "at" }, "$1" },
6110 { { "v0" }, "$2" },
6111 { { "v1" }, "$3" },
6112 { { "a0" }, "$4" },
6113 { { "a1" }, "$5" },
6114 { { "a2" }, "$6" },
6115 { { "a3" }, "$7" },
6116 { { "a4" }, "$8" },
6117 { { "a5" }, "$9" },
6118 { { "a6" }, "$10" },
6119 { { "a7" }, "$11" },
6120 { { "t0" }, "$12" },
6121 { { "t1" }, "$13" },
6122 { { "t2" }, "$14" },
6123 { { "t3" }, "$15" },
6124 { { "s0" }, "$16" },
6125 { { "s1" }, "$17" },
6126 { { "s2" }, "$18" },
6127 { { "s3" }, "$19" },
6128 { { "s4" }, "$20" },
6129 { { "s5" }, "$21" },
6130 { { "s6" }, "$22" },
6131 { { "s7" }, "$23" },
6132 { { "t8" }, "$24" },
6133 { { "t9" }, "$25" },
6134 { { "k0" }, "$26" },
6135 { { "k1" }, "$27" },
6136 { { "gp" }, "$28" },
6137 { { "sp","$sp" }, "$29" },
6138 { { "fp","$fp" }, "$30" },
6139 { { "ra" }, "$31" }
6140 };
6141 Aliases = GCCRegAliases;
6142 NumAliases = llvm::array_lengthof(GCCRegAliases);
6143 }
6144
6145 bool hasInt128Type() const override { return true; }
6146};
6147
6148class Mips64EBTargetInfo : public Mips64TargetInfoBase {
6149 void setDescriptionString() override {
6150 if (ABI == "n32")
6151 DescriptionString = "E-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
6152 else
6153 DescriptionString = "E-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
6154
6155 }
6156
6157public:
6158 Mips64EBTargetInfo(const llvm::Triple &Triple)
6159 : Mips64TargetInfoBase(Triple) {}
6160 void getTargetDefines(const LangOptions &Opts,
6161 MacroBuilder &Builder) const override {
6162 DefineStd(Builder, "MIPSEB", Opts);
6163 Builder.defineMacro("_MIPSEB");
6164 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
6165 }
6166};
6167
6168class Mips64ELTargetInfo : public Mips64TargetInfoBase {
6169 void setDescriptionString() override {
6170 if (ABI == "n32")
6171 DescriptionString = "e-m:m-p:32:32-i8:8:32-i16:16:32-i64:64-n32:64-S128";
6172 else
6173 DescriptionString = "e-m:m-i8:8:32-i16:16:32-i64:64-n32:64-S128";
6174 }
6175public:
6176 Mips64ELTargetInfo(const llvm::Triple &Triple)
6177 : Mips64TargetInfoBase(Triple) {
6178 // Default ABI is n64.
6179 BigEndian = false;
6180 }
6181 void getTargetDefines(const LangOptions &Opts,
6182 MacroBuilder &Builder) const override {
6183 DefineStd(Builder, "MIPSEL", Opts);
6184 Builder.defineMacro("_MIPSEL");
6185 Mips64TargetInfoBase::getTargetDefines(Opts, Builder);
6186 }
6187};
6188} // end anonymous namespace.
6189
6190namespace {
6191class PNaClTargetInfo : public TargetInfo {
6192public:
6193 PNaClTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6194 BigEndian = false;
6195 this->UserLabelPrefix = "";
6196 this->LongAlign = 32;
6197 this->LongWidth = 32;
6198 this->PointerAlign = 32;
6199 this->PointerWidth = 32;
6200 this->IntMaxType = TargetInfo::SignedLongLong;
6201 this->Int64Type = TargetInfo::SignedLongLong;
6202 this->DoubleAlign = 64;
6203 this->LongDoubleWidth = 64;
6204 this->LongDoubleAlign = 64;
6205 this->SizeType = TargetInfo::UnsignedInt;
6206 this->PtrDiffType = TargetInfo::SignedInt;
6207 this->IntPtrType = TargetInfo::SignedInt;
6208 this->RegParmMax = 0; // Disallow regparm
6209 }
6210
6211 void getDefaultFeatures(llvm::StringMap<bool> &Features) const override {
6212 }
6213 void getArchDefines(const LangOptions &Opts, MacroBuilder &Builder) const {
6214 Builder.defineMacro("__le32__");
6215 Builder.defineMacro("__pnacl__");
6216 }
6217 void getTargetDefines(const LangOptions &Opts,
6218 MacroBuilder &Builder) const override {
6219 getArchDefines(Opts, Builder);
6220 }
6221 bool hasFeature(StringRef Feature) const override {
6222 return Feature == "pnacl";
6223 }
6224 void getTargetBuiltins(const Builtin::Info *&Records,
6225 unsigned &NumRecords) const override {
6226 }
6227 BuiltinVaListKind getBuiltinVaListKind() const override {
6228 return TargetInfo::PNaClABIBuiltinVaList;
6229 }
6230 void getGCCRegNames(const char * const *&Names,
6231 unsigned &NumNames) const override;
6232 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6233 unsigned &NumAliases) const override;
6234 bool validateAsmConstraint(const char *&Name,
6235 TargetInfo::ConstraintInfo &Info) const override {
6236 return false;
6237 }
6238
6239 const char *getClobbers() const override {
6240 return "";
6241 }
6242};
6243
6244void PNaClTargetInfo::getGCCRegNames(const char * const *&Names,
6245 unsigned &NumNames) const {
6246 Names = nullptr;
6247 NumNames = 0;
6248}
6249
6250void PNaClTargetInfo::getGCCRegAliases(const GCCRegAlias *&Aliases,
6251 unsigned &NumAliases) const {
6252 Aliases = nullptr;
6253 NumAliases = 0;
6254}
6255} // end anonymous namespace.
6256
6257namespace {
6258class Le64TargetInfo : public TargetInfo {
6259 static const Builtin::Info BuiltinInfo[];
6260
6261public:
6262 Le64TargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6263 BigEndian = false;
6264 NoAsmVariants = true;
6265 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
6266 MaxAtomicPromoteWidth = MaxAtomicInlineWidth = 64;
6267 DescriptionString =
6268 "e-m:e-v128:32-v16:16-v32:32-v96:32-n8:16:32:64-S128";
6269 }
6270
6271 void getTargetDefines(const LangOptions &Opts,
6272 MacroBuilder &Builder) const override {
6273 DefineStd(Builder, "unix", Opts);
6274 defineCPUMacros(Builder, "le64", /*Tuning=*/false);
6275 Builder.defineMacro("__ELF__");
6276 }
6277 void getTargetBuiltins(const Builtin::Info *&Records,
6278 unsigned &NumRecords) const override {
6279 Records = BuiltinInfo;
6280 NumRecords = clang::Le64::LastTSBuiltin - Builtin::FirstTSBuiltin;
6281 }
6282 BuiltinVaListKind getBuiltinVaListKind() const override {
6283 return TargetInfo::PNaClABIBuiltinVaList;
6284 }
6285 const char *getClobbers() const override { return ""; }
6286 void getGCCRegNames(const char *const *&Names,
6287 unsigned &NumNames) const override {
6288 Names = nullptr;
6289 NumNames = 0;
6290 }
6291 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6292 unsigned &NumAliases) const override {
6293 Aliases = nullptr;
6294 NumAliases = 0;
6295 }
6296 bool validateAsmConstraint(const char *&Name,
6297 TargetInfo::ConstraintInfo &Info) const override {
6298 return false;
6299 }
6300
6301 bool hasProtectedVisibility() const override { return false; }
6302};
6303} // end anonymous namespace.
6304
6305const Builtin::Info Le64TargetInfo::BuiltinInfo[] = {
6306#define BUILTIN(ID, TYPE, ATTRS) \
6307 { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6308#include "clang/Basic/BuiltinsLe64.def"
6309};
6310
6311namespace {
6312 static const unsigned SPIRAddrSpaceMap[] = {
6313 1, // opencl_global
6314 3, // opencl_local
6315 2, // opencl_constant
6316 4, // opencl_generic
6317 0, // cuda_device
6318 0, // cuda_constant
6319 0 // cuda_shared
6320 };
6321 class SPIRTargetInfo : public TargetInfo {
6322 public:
6323 SPIRTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6324 assert(getTriple().getOS() == llvm::Triple::UnknownOS &&
6325 "SPIR target must use unknown OS");
6326 assert(getTriple().getEnvironment() == llvm::Triple::UnknownEnvironment &&
6327 "SPIR target must use unknown environment type");
6328 BigEndian = false;
6329 TLSSupported = false;
6330 LongWidth = LongAlign = 64;
6331 AddrSpaceMap = &SPIRAddrSpaceMap;
6332 UseAddrSpaceMapMangling = true;
6333 // Define available target features
6334 // These must be defined in sorted order!
6335 NoAsmVariants = true;
6336 }
6337 void getTargetDefines(const LangOptions &Opts,
6338 MacroBuilder &Builder) const override {
6339 DefineStd(Builder, "SPIR", Opts);
6340 }
6341 bool hasFeature(StringRef Feature) const override {
6342 return Feature == "spir";
6343 }
6344
6345 void getTargetBuiltins(const Builtin::Info *&Records,
6346 unsigned &NumRecords) const override {}
6347 const char *getClobbers() const override {
6348 return "";
6349 }
6350 void getGCCRegNames(const char * const *&Names,
6351 unsigned &NumNames) const override {}
6352 bool
6353 validateAsmConstraint(const char *&Name,
6354 TargetInfo::ConstraintInfo &info) const override {
6355 return true;
6356 }
6357 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6358 unsigned &NumAliases) const override {}
6359 BuiltinVaListKind getBuiltinVaListKind() const override {
6360 return TargetInfo::VoidPtrBuiltinVaList;
6361 }
6362 };
6363
6364
6365 class SPIR32TargetInfo : public SPIRTargetInfo {
6366 public:
6367 SPIR32TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
6368 PointerWidth = PointerAlign = 32;
6369 SizeType = TargetInfo::UnsignedInt;
6370 PtrDiffType = IntPtrType = TargetInfo::SignedInt;
6371 DescriptionString
6372 = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-"
6373 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
6374 }
6375 void getTargetDefines(const LangOptions &Opts,
6376 MacroBuilder &Builder) const override {
6377 DefineStd(Builder, "SPIR32", Opts);
6378 }
6379 };
6380
6381 class SPIR64TargetInfo : public SPIRTargetInfo {
6382 public:
6383 SPIR64TargetInfo(const llvm::Triple &Triple) : SPIRTargetInfo(Triple) {
6384 PointerWidth = PointerAlign = 64;
6385 SizeType = TargetInfo::UnsignedLong;
6386 PtrDiffType = IntPtrType = TargetInfo::SignedLong;
6387 DescriptionString = "e-i64:64-v16:16-v24:32-v32:32-v48:64-"
6388 "v96:128-v192:256-v256:256-v512:512-v1024:1024";
6389 }
6390 void getTargetDefines(const LangOptions &Opts,
6391 MacroBuilder &Builder) const override {
6392 DefineStd(Builder, "SPIR64", Opts);
6393 }
6394 };
6395}
6396
6397namespace {
6398class XCoreTargetInfo : public TargetInfo {
6399 static const Builtin::Info BuiltinInfo[];
6400public:
6401 XCoreTargetInfo(const llvm::Triple &Triple) : TargetInfo(Triple) {
6402 BigEndian = false;
6403 NoAsmVariants = true;
6404 LongLongAlign = 32;
6405 SuitableAlign = 32;
6406 DoubleAlign = LongDoubleAlign = 32;
6407 SizeType = UnsignedInt;
6408 PtrDiffType = SignedInt;
6409 IntPtrType = SignedInt;
6410 WCharType = UnsignedChar;
6411 WIntType = UnsignedInt;
6412 UseZeroLengthBitfieldAlignment = true;
6413 DescriptionString = "e-m:e-p:32:32-i1:8:32-i8:8:32-i16:16:32-i64:32"
6414 "-f64:32-a:0:32-n32";
6415 }
6416 void getTargetDefines(const LangOptions &Opts,
6417 MacroBuilder &Builder) const override {
6418 Builder.defineMacro("__XS1B__");
6419 }
6420 void getTargetBuiltins(const Builtin::Info *&Records,
6421 unsigned &NumRecords) const override {
6422 Records = BuiltinInfo;
6423 NumRecords = clang::XCore::LastTSBuiltin-Builtin::FirstTSBuiltin;
6424 }
6425 BuiltinVaListKind getBuiltinVaListKind() const override {
6426 return TargetInfo::VoidPtrBuiltinVaList;
6427 }
6428 const char *getClobbers() const override {
6429 return "";
6430 }
6431 void getGCCRegNames(const char * const *&Names,
6432 unsigned &NumNames) const override {
6433 static const char * const GCCRegNames[] = {
6434 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
6435 "r8", "r9", "r10", "r11", "cp", "dp", "sp", "lr"
6436 };
6437 Names = GCCRegNames;
6438 NumNames = llvm::array_lengthof(GCCRegNames);
6439 }
6440 void getGCCRegAliases(const GCCRegAlias *&Aliases,
6441 unsigned &NumAliases) const override {
6442 Aliases = nullptr;
6443 NumAliases = 0;
6444 }
6445 bool validateAsmConstraint(const char *&Name,
6446 TargetInfo::ConstraintInfo &Info) const override {
6447 return false;
6448 }
6449 int getEHDataRegisterNumber(unsigned RegNo) const override {
6450 // R0=ExceptionPointerRegister R1=ExceptionSelectorRegister
6451 return (RegNo < 2)? RegNo : -1;
6452 }
6453};
6454
6455const Builtin::Info XCoreTargetInfo::BuiltinInfo[] = {
6456#define BUILTIN(ID, TYPE, ATTRS) { #ID, TYPE, ATTRS, 0, ALL_LANGUAGES },
6457#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) { #ID, TYPE, ATTRS, HEADER,\
6458 ALL_LANGUAGES },
6459#include "clang/Basic/BuiltinsXCore.def"
6460};
6461} // end anonymous namespace.
6462
6463
6464//===----------------------------------------------------------------------===//
6465// Driver code
6466//===----------------------------------------------------------------------===//
6467
6468static TargetInfo *AllocateTarget(const llvm::Triple &Triple) {
6469 llvm::Triple::OSType os = Triple.getOS();
6470
6471 switch (Triple.getArch()) {
6472 default:
6473 return nullptr;
6474
6475 case llvm::Triple::xcore:
6476 return new XCoreTargetInfo(Triple);
6477
6478 case llvm::Triple::hexagon:
6479 return new HexagonTargetInfo(Triple);
6480
6481 case llvm::Triple::aarch64:
6482 if (Triple.isOSDarwin())
6483 return new DarwinAArch64TargetInfo(Triple);
6484
6485 switch (os) {
6486 case llvm::Triple::FreeBSD:
6487 return new FreeBSDTargetInfo<AArch64leTargetInfo>(Triple);
6488 case llvm::Triple::Linux:
6489 return new LinuxTargetInfo<AArch64leTargetInfo>(Triple);
6490 case llvm::Triple::NetBSD:
6491 return new NetBSDTargetInfo<AArch64leTargetInfo>(Triple);
6492 default:
6493 return new AArch64leTargetInfo(Triple);
6494 }
6495
6496 case llvm::Triple::aarch64_be:
6497 switch (os) {
6498 case llvm::Triple::FreeBSD:
6499 return new FreeBSDTargetInfo<AArch64beTargetInfo>(Triple);
6500 case llvm::Triple::Linux:
6501 return new LinuxTargetInfo<AArch64beTargetInfo>(Triple);
6502 case llvm::Triple::NetBSD:
6503 return new NetBSDTargetInfo<AArch64beTargetInfo>(Triple);
6504 default:
6505 return new AArch64beTargetInfo(Triple);
6506 }
6507
6508 case llvm::Triple::arm:
6509 case llvm::Triple::thumb:
6510 if (Triple.isOSBinFormatMachO())
6511 return new DarwinARMTargetInfo(Triple);
6512
6513 switch (os) {
6514 case llvm::Triple::Linux:
6515 return new LinuxTargetInfo<ARMleTargetInfo>(Triple);
6516 case llvm::Triple::FreeBSD:
6517 return new FreeBSDTargetInfo<ARMleTargetInfo>(Triple);
6518 case llvm::Triple::NetBSD:
6519 return new NetBSDTargetInfo<ARMleTargetInfo>(Triple);
6520 case llvm::Triple::OpenBSD:
6521 return new OpenBSDTargetInfo<ARMleTargetInfo>(Triple);
6522 case llvm::Triple::Bitrig:
6523 return new BitrigTargetInfo<ARMleTargetInfo>(Triple);
6524 case llvm::Triple::RTEMS:
6525 return new RTEMSTargetInfo<ARMleTargetInfo>(Triple);
6526 case llvm::Triple::NaCl:
6527 return new NaClTargetInfo<ARMleTargetInfo>(Triple);
6528 case llvm::Triple::Win32:
6529 switch (Triple.getEnvironment()) {
6530 default:
6531 return new ARMleTargetInfo(Triple);
6532 case llvm::Triple::Itanium:
6533 return new ItaniumWindowsARMleTargetInfo(Triple);
6534 case llvm::Triple::MSVC:
6535 return new MicrosoftARMleTargetInfo(Triple);
6536 }
6537 default:
6538 return new ARMleTargetInfo(Triple);
6539 }
6540
6541 case llvm::Triple::armeb:
6542 case llvm::Triple::thumbeb:
6543 if (Triple.isOSDarwin())
6544 return new DarwinARMTargetInfo(Triple);
6545
6546 switch (os) {
6547 case llvm::Triple::Linux:
6548 return new LinuxTargetInfo<ARMbeTargetInfo>(Triple);
6549 case llvm::Triple::FreeBSD:
6550 return new FreeBSDTargetInfo<ARMbeTargetInfo>(Triple);
6551 case llvm::Triple::NetBSD:
6552 return new NetBSDTargetInfo<ARMbeTargetInfo>(Triple);
6553 case llvm::Triple::OpenBSD:
6554 return new OpenBSDTargetInfo<ARMbeTargetInfo>(Triple);
6555 case llvm::Triple::Bitrig:
6556 return new BitrigTargetInfo<ARMbeTargetInfo>(Triple);
6557 case llvm::Triple::RTEMS:
6558 return new RTEMSTargetInfo<ARMbeTargetInfo>(Triple);
6559 case llvm::Triple::NaCl:
6560 return new NaClTargetInfo<ARMbeTargetInfo>(Triple);
6561 default:
6562 return new ARMbeTargetInfo(Triple);
6563 }
6564
6565 case llvm::Triple::msp430:
6566 return new MSP430TargetInfo(Triple);
6567
6568 case llvm::Triple::mips:
6569 switch (os) {
6570 case llvm::Triple::Linux:
6571 return new LinuxTargetInfo<Mips32EBTargetInfo>(Triple);
6572 case llvm::Triple::RTEMS:
6573 return new RTEMSTargetInfo<Mips32EBTargetInfo>(Triple);
6574 case llvm::Triple::FreeBSD:
6575 return new FreeBSDTargetInfo<Mips32EBTargetInfo>(Triple);
6576 case llvm::Triple::NetBSD:
6577 return new NetBSDTargetInfo<Mips32EBTargetInfo>(Triple);
6578 default:
6579 return new Mips32EBTargetInfo(Triple);
6580 }
6581
6582 case llvm::Triple::mipsel:
6583 switch (os) {
6584 case llvm::Triple::Linux:
6585 return new LinuxTargetInfo<Mips32ELTargetInfo>(Triple);
6586 case llvm::Triple::RTEMS:
6587 return new RTEMSTargetInfo<Mips32ELTargetInfo>(Triple);
6588 case llvm::Triple::FreeBSD:
6589 return new FreeBSDTargetInfo<Mips32ELTargetInfo>(Triple);
6590 case llvm::Triple::NetBSD:
6591 return new NetBSDTargetInfo<Mips32ELTargetInfo>(Triple);
6592 case llvm::Triple::NaCl:
6593 return new NaClTargetInfo<Mips32ELTargetInfo>(Triple);
6594 default:
6595 return new Mips32ELTargetInfo(Triple);
6596 }
6597
6598 case llvm::Triple::mips64:
6599 switch (os) {
6600 case llvm::Triple::Linux:
6601 return new LinuxTargetInfo<Mips64EBTargetInfo>(Triple);
6602 case llvm::Triple::RTEMS:
6603 return new RTEMSTargetInfo<Mips64EBTargetInfo>(Triple);
6604 case llvm::Triple::FreeBSD:
6605 return new FreeBSDTargetInfo<Mips64EBTargetInfo>(Triple);
6606 case llvm::Triple::NetBSD:
6607 return new NetBSDTargetInfo<Mips64EBTargetInfo>(Triple);
6608 case llvm::Triple::OpenBSD:
6609 return new OpenBSDTargetInfo<Mips64EBTargetInfo>(Triple);
6610 default:
6611 return new Mips64EBTargetInfo(Triple);
6612 }
6613
6614 case llvm::Triple::mips64el:
6615 switch (os) {
6616 case llvm::Triple::Linux:
6617 return new LinuxTargetInfo<Mips64ELTargetInfo>(Triple);
6618 case llvm::Triple::RTEMS:
6619 return new RTEMSTargetInfo<Mips64ELTargetInfo>(Triple);
6620 case llvm::Triple::FreeBSD:
6621 return new FreeBSDTargetInfo<Mips64ELTargetInfo>(Triple);
6622 case llvm::Triple::NetBSD:
6623 return new NetBSDTargetInfo<Mips64ELTargetInfo>(Triple);
6624 case llvm::Triple::OpenBSD:
6625 return new OpenBSDTargetInfo<Mips64ELTargetInfo>(Triple);
6626 default:
6627 return new Mips64ELTargetInfo(Triple);
6628 }
6629
6630 case llvm::Triple::le32:
6631 switch (os) {
6632 case llvm::Triple::NaCl:
6633 return new NaClTargetInfo<PNaClTargetInfo>(Triple);
6634 default:
6635 return nullptr;
6636 }
6637
6638 case llvm::Triple::le64:
6639 return new Le64TargetInfo(Triple);
6640
6641 case llvm::Triple::ppc:
6642 if (Triple.isOSDarwin())
6643 return new DarwinPPC32TargetInfo(Triple);
6644 switch (os) {
6645 case llvm::Triple::Linux:
6646 return new LinuxTargetInfo<PPC32TargetInfo>(Triple);
6647 case llvm::Triple::FreeBSD:
6648 return new FreeBSDTargetInfo<PPC32TargetInfo>(Triple);
6649 case llvm::Triple::NetBSD:
6650 return new NetBSDTargetInfo<PPC32TargetInfo>(Triple);
6651 case llvm::Triple::OpenBSD:
6652 return new OpenBSDTargetInfo<PPC32TargetInfo>(Triple);
6653 case llvm::Triple::RTEMS:
6654 return new RTEMSTargetInfo<PPC32TargetInfo>(Triple);
6655 default:
6656 return new PPC32TargetInfo(Triple);
6657 }
6658
6659 case llvm::Triple::ppc64:
6660 if (Triple.isOSDarwin())
6661 return new DarwinPPC64TargetInfo(Triple);
6662 switch (os) {
6663 case llvm::Triple::Linux:
6664 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6665 case llvm::Triple::Lv2:
6666 return new PS3PPUTargetInfo<PPC64TargetInfo>(Triple);
6667 case llvm::Triple::FreeBSD:
6668 return new FreeBSDTargetInfo<PPC64TargetInfo>(Triple);
6669 case llvm::Triple::NetBSD:
6670 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
6671 default:
6672 return new PPC64TargetInfo(Triple);
6673 }
6674
6675 case llvm::Triple::ppc64le:
6676 switch (os) {
6677 case llvm::Triple::Linux:
6678 return new LinuxTargetInfo<PPC64TargetInfo>(Triple);
6679 case llvm::Triple::NetBSD:
6680 return new NetBSDTargetInfo<PPC64TargetInfo>(Triple);
6665 default:
6666 return new PPC64TargetInfo(Triple);
6667 }
6668
6669 case llvm::Triple::nvptx:
6670 return new NVPTX32TargetInfo(Triple);
6671 case llvm::Triple::nvptx64:
6672 return new NVPTX64TargetInfo(Triple);
6673
6674 case llvm::Triple::amdgcn:
6675 case llvm::Triple::r600:
6676 return new R600TargetInfo(Triple);
6677
6678 case llvm::Triple::sparc:
6679 switch (os) {
6680 case llvm::Triple::Linux:
6681 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
6682 case llvm::Triple::Solaris:
6683 return new SolarisSparcV8TargetInfo(Triple);
6684 case llvm::Triple::NetBSD:
6685 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
6686 case llvm::Triple::OpenBSD:
6687 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
6688 case llvm::Triple::RTEMS:
6689 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
6690 default:
6691 return new SparcV8TargetInfo(Triple);
6692 }
6693
6694 case llvm::Triple::sparcv9:
6695 switch (os) {
6696 case llvm::Triple::Linux:
6697 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
6698 case llvm::Triple::Solaris:
6699 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
6700 case llvm::Triple::NetBSD:
6701 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
6702 case llvm::Triple::OpenBSD:
6703 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
6704 case llvm::Triple::FreeBSD:
6705 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
6706 default:
6707 return new SparcV9TargetInfo(Triple);
6708 }
6709
6710 case llvm::Triple::systemz:
6711 switch (os) {
6712 case llvm::Triple::Linux:
6713 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
6714 default:
6715 return new SystemZTargetInfo(Triple);
6716 }
6717
6718 case llvm::Triple::tce:
6719 return new TCETargetInfo(Triple);
6720
6721 case llvm::Triple::x86:
6722 if (Triple.isOSDarwin())
6723 return new DarwinI386TargetInfo(Triple);
6724
6725 switch (os) {
6726 case llvm::Triple::Linux:
6727 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
6728 case llvm::Triple::DragonFly:
6729 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
6730 case llvm::Triple::NetBSD:
6731 return new NetBSDI386TargetInfo(Triple);
6732 case llvm::Triple::OpenBSD:
6733 return new OpenBSDI386TargetInfo(Triple);
6734 case llvm::Triple::Bitrig:
6735 return new BitrigI386TargetInfo(Triple);
6736 case llvm::Triple::FreeBSD:
6737 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
6738 case llvm::Triple::KFreeBSD:
6739 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
6740 case llvm::Triple::Minix:
6741 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
6742 case llvm::Triple::Solaris:
6743 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
6744 case llvm::Triple::Win32: {
6745 switch (Triple.getEnvironment()) {
6746 default:
6747 return new X86_32TargetInfo(Triple);
6748 case llvm::Triple::Cygnus:
6749 return new CygwinX86_32TargetInfo(Triple);
6750 case llvm::Triple::GNU:
6751 return new MinGWX86_32TargetInfo(Triple);
6752 case llvm::Triple::Itanium:
6753 case llvm::Triple::MSVC:
6754 return new MicrosoftX86_32TargetInfo(Triple);
6755 }
6756 }
6757 case llvm::Triple::Haiku:
6758 return new HaikuX86_32TargetInfo(Triple);
6759 case llvm::Triple::RTEMS:
6760 return new RTEMSX86_32TargetInfo(Triple);
6761 case llvm::Triple::NaCl:
6762 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
6763 default:
6764 return new X86_32TargetInfo(Triple);
6765 }
6766
6767 case llvm::Triple::x86_64:
6768 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
6769 return new DarwinX86_64TargetInfo(Triple);
6770
6771 switch (os) {
6772 case llvm::Triple::Linux:
6773 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
6774 case llvm::Triple::DragonFly:
6775 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
6776 case llvm::Triple::NetBSD:
6777 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
6778 case llvm::Triple::OpenBSD:
6779 return new OpenBSDX86_64TargetInfo(Triple);
6780 case llvm::Triple::Bitrig:
6781 return new BitrigX86_64TargetInfo(Triple);
6782 case llvm::Triple::FreeBSD:
6783 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
6784 case llvm::Triple::KFreeBSD:
6785 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
6786 case llvm::Triple::Solaris:
6787 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
6788 case llvm::Triple::Win32: {
6789 switch (Triple.getEnvironment()) {
6790 default:
6791 return new X86_64TargetInfo(Triple);
6792 case llvm::Triple::GNU:
6793 return new MinGWX86_64TargetInfo(Triple);
6794 case llvm::Triple::MSVC:
6795 return new MicrosoftX86_64TargetInfo(Triple);
6796 }
6797 }
6798 case llvm::Triple::NaCl:
6799 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
6800 default:
6801 return new X86_64TargetInfo(Triple);
6802 }
6803
6804 case llvm::Triple::spir: {
6805 if (Triple.getOS() != llvm::Triple::UnknownOS ||
6806 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
6807 return nullptr;
6808 return new SPIR32TargetInfo(Triple);
6809 }
6810 case llvm::Triple::spir64: {
6811 if (Triple.getOS() != llvm::Triple::UnknownOS ||
6812 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
6813 return nullptr;
6814 return new SPIR64TargetInfo(Triple);
6815 }
6816 }
6817}
6818
6819/// CreateTargetInfo - Return the target info object for the specified target
6820/// triple.
6821TargetInfo *
6822TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6823 const std::shared_ptr<TargetOptions> &Opts) {
6824 llvm::Triple Triple(Opts->Triple);
6825
6826 // Construct the target
6827 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
6828 if (!Target) {
6829 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
6830 return nullptr;
6831 }
6832 Target->TargetOpts = Opts;
6833
6834 // Set the target CPU if specified.
6835 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6836 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
6837 return nullptr;
6838 }
6839
6840 // Set the target ABI if specified.
6841 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6842 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
6843 return nullptr;
6844 }
6845
6846 // Set the fp math unit.
6847 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6848 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
6849 return nullptr;
6850 }
6851
6852 // Compute the default target features, we need the target to handle this
6853 // because features may have dependencies on one another.
6854 llvm::StringMap<bool> Features;
6855 Target->getDefaultFeatures(Features);
6856
6857 // Apply the user specified deltas.
6858 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6859 I < N; ++I) {
6860 const char *Name = Opts->FeaturesAsWritten[I].c_str();
6861 // Apply the feature via the target.
6862 bool Enabled = Name[0] == '+';
6863 Target->setFeatureEnabled(Features, Name + 1, Enabled);
6864 }
6865
6866 // Add the features to the compile options.
6867 //
6868 // FIXME: If we are completely confident that we have the right set, we only
6869 // need to pass the minuses.
6870 Opts->Features.clear();
6871 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6872 ie = Features.end(); it != ie; ++it)
6873 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
6874 if (!Target->handleTargetFeatures(Opts->Features, Diags))
6875 return nullptr;
6876
6877 return Target.release();
6878}
6681 default:
6682 return new PPC64TargetInfo(Triple);
6683 }
6684
6685 case llvm::Triple::nvptx:
6686 return new NVPTX32TargetInfo(Triple);
6687 case llvm::Triple::nvptx64:
6688 return new NVPTX64TargetInfo(Triple);
6689
6690 case llvm::Triple::amdgcn:
6691 case llvm::Triple::r600:
6692 return new R600TargetInfo(Triple);
6693
6694 case llvm::Triple::sparc:
6695 switch (os) {
6696 case llvm::Triple::Linux:
6697 return new LinuxTargetInfo<SparcV8TargetInfo>(Triple);
6698 case llvm::Triple::Solaris:
6699 return new SolarisSparcV8TargetInfo(Triple);
6700 case llvm::Triple::NetBSD:
6701 return new NetBSDTargetInfo<SparcV8TargetInfo>(Triple);
6702 case llvm::Triple::OpenBSD:
6703 return new OpenBSDTargetInfo<SparcV8TargetInfo>(Triple);
6704 case llvm::Triple::RTEMS:
6705 return new RTEMSTargetInfo<SparcV8TargetInfo>(Triple);
6706 default:
6707 return new SparcV8TargetInfo(Triple);
6708 }
6709
6710 case llvm::Triple::sparcv9:
6711 switch (os) {
6712 case llvm::Triple::Linux:
6713 return new LinuxTargetInfo<SparcV9TargetInfo>(Triple);
6714 case llvm::Triple::Solaris:
6715 return new SolarisTargetInfo<SparcV9TargetInfo>(Triple);
6716 case llvm::Triple::NetBSD:
6717 return new NetBSDTargetInfo<SparcV9TargetInfo>(Triple);
6718 case llvm::Triple::OpenBSD:
6719 return new OpenBSDTargetInfo<SparcV9TargetInfo>(Triple);
6720 case llvm::Triple::FreeBSD:
6721 return new FreeBSDTargetInfo<SparcV9TargetInfo>(Triple);
6722 default:
6723 return new SparcV9TargetInfo(Triple);
6724 }
6725
6726 case llvm::Triple::systemz:
6727 switch (os) {
6728 case llvm::Triple::Linux:
6729 return new LinuxTargetInfo<SystemZTargetInfo>(Triple);
6730 default:
6731 return new SystemZTargetInfo(Triple);
6732 }
6733
6734 case llvm::Triple::tce:
6735 return new TCETargetInfo(Triple);
6736
6737 case llvm::Triple::x86:
6738 if (Triple.isOSDarwin())
6739 return new DarwinI386TargetInfo(Triple);
6740
6741 switch (os) {
6742 case llvm::Triple::Linux:
6743 return new LinuxTargetInfo<X86_32TargetInfo>(Triple);
6744 case llvm::Triple::DragonFly:
6745 return new DragonFlyBSDTargetInfo<X86_32TargetInfo>(Triple);
6746 case llvm::Triple::NetBSD:
6747 return new NetBSDI386TargetInfo(Triple);
6748 case llvm::Triple::OpenBSD:
6749 return new OpenBSDI386TargetInfo(Triple);
6750 case llvm::Triple::Bitrig:
6751 return new BitrigI386TargetInfo(Triple);
6752 case llvm::Triple::FreeBSD:
6753 return new FreeBSDTargetInfo<X86_32TargetInfo>(Triple);
6754 case llvm::Triple::KFreeBSD:
6755 return new KFreeBSDTargetInfo<X86_32TargetInfo>(Triple);
6756 case llvm::Triple::Minix:
6757 return new MinixTargetInfo<X86_32TargetInfo>(Triple);
6758 case llvm::Triple::Solaris:
6759 return new SolarisTargetInfo<X86_32TargetInfo>(Triple);
6760 case llvm::Triple::Win32: {
6761 switch (Triple.getEnvironment()) {
6762 default:
6763 return new X86_32TargetInfo(Triple);
6764 case llvm::Triple::Cygnus:
6765 return new CygwinX86_32TargetInfo(Triple);
6766 case llvm::Triple::GNU:
6767 return new MinGWX86_32TargetInfo(Triple);
6768 case llvm::Triple::Itanium:
6769 case llvm::Triple::MSVC:
6770 return new MicrosoftX86_32TargetInfo(Triple);
6771 }
6772 }
6773 case llvm::Triple::Haiku:
6774 return new HaikuX86_32TargetInfo(Triple);
6775 case llvm::Triple::RTEMS:
6776 return new RTEMSX86_32TargetInfo(Triple);
6777 case llvm::Triple::NaCl:
6778 return new NaClTargetInfo<X86_32TargetInfo>(Triple);
6779 default:
6780 return new X86_32TargetInfo(Triple);
6781 }
6782
6783 case llvm::Triple::x86_64:
6784 if (Triple.isOSDarwin() || Triple.isOSBinFormatMachO())
6785 return new DarwinX86_64TargetInfo(Triple);
6786
6787 switch (os) {
6788 case llvm::Triple::Linux:
6789 return new LinuxTargetInfo<X86_64TargetInfo>(Triple);
6790 case llvm::Triple::DragonFly:
6791 return new DragonFlyBSDTargetInfo<X86_64TargetInfo>(Triple);
6792 case llvm::Triple::NetBSD:
6793 return new NetBSDTargetInfo<X86_64TargetInfo>(Triple);
6794 case llvm::Triple::OpenBSD:
6795 return new OpenBSDX86_64TargetInfo(Triple);
6796 case llvm::Triple::Bitrig:
6797 return new BitrigX86_64TargetInfo(Triple);
6798 case llvm::Triple::FreeBSD:
6799 return new FreeBSDTargetInfo<X86_64TargetInfo>(Triple);
6800 case llvm::Triple::KFreeBSD:
6801 return new KFreeBSDTargetInfo<X86_64TargetInfo>(Triple);
6802 case llvm::Triple::Solaris:
6803 return new SolarisTargetInfo<X86_64TargetInfo>(Triple);
6804 case llvm::Triple::Win32: {
6805 switch (Triple.getEnvironment()) {
6806 default:
6807 return new X86_64TargetInfo(Triple);
6808 case llvm::Triple::GNU:
6809 return new MinGWX86_64TargetInfo(Triple);
6810 case llvm::Triple::MSVC:
6811 return new MicrosoftX86_64TargetInfo(Triple);
6812 }
6813 }
6814 case llvm::Triple::NaCl:
6815 return new NaClTargetInfo<X86_64TargetInfo>(Triple);
6816 default:
6817 return new X86_64TargetInfo(Triple);
6818 }
6819
6820 case llvm::Triple::spir: {
6821 if (Triple.getOS() != llvm::Triple::UnknownOS ||
6822 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
6823 return nullptr;
6824 return new SPIR32TargetInfo(Triple);
6825 }
6826 case llvm::Triple::spir64: {
6827 if (Triple.getOS() != llvm::Triple::UnknownOS ||
6828 Triple.getEnvironment() != llvm::Triple::UnknownEnvironment)
6829 return nullptr;
6830 return new SPIR64TargetInfo(Triple);
6831 }
6832 }
6833}
6834
6835/// CreateTargetInfo - Return the target info object for the specified target
6836/// triple.
6837TargetInfo *
6838TargetInfo::CreateTargetInfo(DiagnosticsEngine &Diags,
6839 const std::shared_ptr<TargetOptions> &Opts) {
6840 llvm::Triple Triple(Opts->Triple);
6841
6842 // Construct the target
6843 std::unique_ptr<TargetInfo> Target(AllocateTarget(Triple));
6844 if (!Target) {
6845 Diags.Report(diag::err_target_unknown_triple) << Triple.str();
6846 return nullptr;
6847 }
6848 Target->TargetOpts = Opts;
6849
6850 // Set the target CPU if specified.
6851 if (!Opts->CPU.empty() && !Target->setCPU(Opts->CPU)) {
6852 Diags.Report(diag::err_target_unknown_cpu) << Opts->CPU;
6853 return nullptr;
6854 }
6855
6856 // Set the target ABI if specified.
6857 if (!Opts->ABI.empty() && !Target->setABI(Opts->ABI)) {
6858 Diags.Report(diag::err_target_unknown_abi) << Opts->ABI;
6859 return nullptr;
6860 }
6861
6862 // Set the fp math unit.
6863 if (!Opts->FPMath.empty() && !Target->setFPMath(Opts->FPMath)) {
6864 Diags.Report(diag::err_target_unknown_fpmath) << Opts->FPMath;
6865 return nullptr;
6866 }
6867
6868 // Compute the default target features, we need the target to handle this
6869 // because features may have dependencies on one another.
6870 llvm::StringMap<bool> Features;
6871 Target->getDefaultFeatures(Features);
6872
6873 // Apply the user specified deltas.
6874 for (unsigned I = 0, N = Opts->FeaturesAsWritten.size();
6875 I < N; ++I) {
6876 const char *Name = Opts->FeaturesAsWritten[I].c_str();
6877 // Apply the feature via the target.
6878 bool Enabled = Name[0] == '+';
6879 Target->setFeatureEnabled(Features, Name + 1, Enabled);
6880 }
6881
6882 // Add the features to the compile options.
6883 //
6884 // FIXME: If we are completely confident that we have the right set, we only
6885 // need to pass the minuses.
6886 Opts->Features.clear();
6887 for (llvm::StringMap<bool>::const_iterator it = Features.begin(),
6888 ie = Features.end(); it != ie; ++it)
6889 Opts->Features.push_back((it->second ? "+" : "-") + it->first().str());
6890 if (!Target->handleTargetFeatures(Opts->Features, Diags))
6891 return nullptr;
6892
6893 return Target.release();
6894}