blob: 5eccf6a2cda05d654e94372ad37b04ade6745594 [file] [log] [blame]
Erich Keaneebba5922017-07-21 22:37:03 +00001//===--- AArch64.cpp - Implement AArch64 target feature support -----------===//
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 AArch64 TargetInfo objects.
11//
12//===----------------------------------------------------------------------===//
13
14#include "AArch64.h"
15#include "clang/Basic/TargetBuiltins.h"
16#include "clang/Basic/TargetInfo.h"
17#include "llvm/ADT/ArrayRef.h"
Saleem Abdulrasool729379a2017-10-06 23:09:55 +000018#include "llvm/ADT/StringExtras.h"
Erich Keaneebba5922017-07-21 22:37:03 +000019
20using namespace clang;
21using namespace clang::targets;
22
Tim Northoverad4c5db2017-07-24 17:06:23 +000023const Builtin::Info AArch64TargetInfo::BuiltinInfo[] = {
24#define BUILTIN(ID, TYPE, ATTRS) \
25 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
26#include "clang/Basic/BuiltinsNEON.def"
27
28#define BUILTIN(ID, TYPE, ATTRS) \
29 {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
Martin Storsjod8a44ed2017-10-12 07:05:37 +000030#define LANGBUILTIN(ID, TYPE, ATTRS, LANG) \
31 {#ID, TYPE, ATTRS, nullptr, LANG, nullptr},
Tim Northoverad4c5db2017-07-24 17:06:23 +000032#include "clang/Basic/BuiltinsAArch64.def"
33};
34
35AArch64TargetInfo::AArch64TargetInfo(const llvm::Triple &Triple,
36 const TargetOptions &Opts)
37 : TargetInfo(Triple), ABI("aapcs") {
38 if (getTriple().getOS() == llvm::Triple::NetBSD ||
39 getTriple().getOS() == llvm::Triple::OpenBSD) {
Tim Northoverad4c5db2017-07-24 17:06:23 +000040 // NetBSD apparently prefers consistency across ARM targets to
41 // consistency across 64-bit targets.
42 Int64Type = SignedLongLong;
43 IntMaxType = SignedLongLong;
44 } else {
Saleem Abdulrasool729379a2017-10-06 23:09:55 +000045 if (!getTriple().isOSDarwin())
46 WCharType = UnsignedInt;
47
Tim Northoverad4c5db2017-07-24 17:06:23 +000048 Int64Type = SignedLong;
49 IntMaxType = SignedLong;
50 }
51
Saleem Abdulrasool729379a2017-10-06 23:09:55 +000052
Tim Northoverad4c5db2017-07-24 17:06:23 +000053 LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
54 MaxVectorAlign = 128;
55 MaxAtomicInlineWidth = 128;
56 MaxAtomicPromoteWidth = 128;
57
58 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 128;
59 LongDoubleFormat = &llvm::APFloat::IEEEquad();
60
61 // Make __builtin_ms_va_list available.
62 HasBuiltinMSVaList = true;
63
64 // {} in inline assembly are neon specifiers, not assembly variant
65 // specifiers.
66 NoAsmVariants = true;
67
68 // AAPCS gives rules for bitfields. 7.1.7 says: "The container type
69 // contributes to the alignment of the containing aggregate in the same way
70 // a plain (non bit-field) member of that type would, without exception for
71 // zero-sized or anonymous bit-fields."
72 assert(UseBitFieldTypeAlignment && "bitfields affect type alignment");
73 UseZeroLengthBitfieldAlignment = true;
74
75 // AArch64 targets default to using the ARM C++ ABI.
76 TheCXXABI.set(TargetCXXABI::GenericAArch64);
77
78 if (Triple.getOS() == llvm::Triple::Linux)
79 this->MCountName = "\01_mcount";
80 else if (Triple.getOS() == llvm::Triple::UnknownOS)
81 this->MCountName =
82 Opts.EABIVersion == llvm::EABI::GNU ? "\01_mcount" : "mcount";
83}
84
85StringRef AArch64TargetInfo::getABI() const { return ABI; }
86
87bool AArch64TargetInfo::setABI(const std::string &Name) {
88 if (Name != "aapcs" && Name != "darwinpcs")
89 return false;
90
91 ABI = Name;
92 return true;
93}
94
95bool AArch64TargetInfo::isValidCPUName(StringRef Name) const {
96 return Name == "generic" ||
Florian Hahnef5bbd62017-07-27 16:28:39 +000097 llvm::AArch64::parseCPUArch(Name) != llvm::AArch64::ArchKind::INVALID;
Tim Northoverad4c5db2017-07-24 17:06:23 +000098}
99
100bool AArch64TargetInfo::setCPU(const std::string &Name) {
101 return isValidCPUName(Name);
102}
103
104void AArch64TargetInfo::getTargetDefinesARMV81A(const LangOptions &Opts,
105 MacroBuilder &Builder) const {
106 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
107}
108
109void AArch64TargetInfo::getTargetDefinesARMV82A(const LangOptions &Opts,
110 MacroBuilder &Builder) const {
111 // Also include the ARMv8.1 defines
112 getTargetDefinesARMV81A(Opts, Builder);
113}
114
115void AArch64TargetInfo::getTargetDefines(const LangOptions &Opts,
116 MacroBuilder &Builder) const {
117 // Target identification.
118 Builder.defineMacro("__aarch64__");
119 // For bare-metal none-eabi.
120 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
121 (getTriple().getEnvironment() == llvm::Triple::EABI ||
122 getTriple().getEnvironment() == llvm::Triple::EABIHF))
123 Builder.defineMacro("__ELF__");
124
125 // Target properties.
Martin Storsjo588a3e52017-07-31 20:40:53 +0000126 if (!getTriple().isOSWindows()) {
127 Builder.defineMacro("_LP64");
128 Builder.defineMacro("__LP64__");
129 }
Tim Northoverad4c5db2017-07-24 17:06:23 +0000130
131 // ACLE predefines. Many can only have one possible value on v8 AArch64.
132 Builder.defineMacro("__ARM_ACLE", "200");
133 Builder.defineMacro("__ARM_ARCH", "8");
134 Builder.defineMacro("__ARM_ARCH_PROFILE", "'A'");
135
136 Builder.defineMacro("__ARM_64BIT_STATE", "1");
137 Builder.defineMacro("__ARM_PCS_AAPCS64", "1");
138 Builder.defineMacro("__ARM_ARCH_ISA_A64", "1");
139
140 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
141 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
142 Builder.defineMacro("__ARM_FEATURE_LDREX", "0xF");
143 Builder.defineMacro("__ARM_FEATURE_IDIV", "1"); // As specified in ACLE
144 Builder.defineMacro("__ARM_FEATURE_DIV"); // For backwards compatibility
145 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
146 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
147
148 Builder.defineMacro("__ARM_ALIGN_MAX_STACK_PWR", "4");
149
150 // 0xe implies support for half, single and double precision operations.
151 Builder.defineMacro("__ARM_FP", "0xE");
152
153 // PCS specifies this for SysV variants, which is all we support. Other ABIs
154 // may choose __ARM_FP16_FORMAT_ALTERNATIVE.
155 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
156 Builder.defineMacro("__ARM_FP16_ARGS", "1");
157
158 if (Opts.UnsafeFPMath)
159 Builder.defineMacro("__ARM_FP_FAST", "1");
160
Saleem Abdulrasool729379a2017-10-06 23:09:55 +0000161 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
Benjamin Kramer3a13ed62017-12-28 16:58:54 +0000162 Twine(Opts.WCharSize ? Opts.WCharSize : 4));
Tim Northoverad4c5db2017-07-24 17:06:23 +0000163
164 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ? "1" : "4");
165
166 if (FPU & NeonMode) {
167 Builder.defineMacro("__ARM_NEON", "1");
168 // 64-bit NEON supports half, single and double precision operations.
169 Builder.defineMacro("__ARM_NEON_FP", "0xE");
170 }
171
172 if (FPU & SveMode)
173 Builder.defineMacro("__ARM_FEATURE_SVE", "1");
174
175 if (CRC)
176 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
177
178 if (Crypto)
179 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
180
181 if (Unaligned)
182 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
183
Abderrazek Zaafranif58a1322017-12-21 19:20:01 +0000184 if ((FPU & NeonMode) && HasFullFP16)
185 Builder.defineMacro("__ARM_FEATURE_FP16_VECTOR_ARITHMETIC", "1");
Abderrazek Zaafranice8746d2018-01-19 23:11:18 +0000186 if (HasFullFP16)
187 Builder.defineMacro("__ARM_FEATURE_FP16_SCALAR_ARITHMETIC", "1");
Abderrazek Zaafranif58a1322017-12-21 19:20:01 +0000188
Tim Northoverad4c5db2017-07-24 17:06:23 +0000189 switch (ArchKind) {
190 default:
191 break;
Florian Hahnef5bbd62017-07-27 16:28:39 +0000192 case llvm::AArch64::ArchKind::ARMV8_1A:
Tim Northoverad4c5db2017-07-24 17:06:23 +0000193 getTargetDefinesARMV81A(Opts, Builder);
194 break;
Florian Hahnef5bbd62017-07-27 16:28:39 +0000195 case llvm::AArch64::ArchKind::ARMV8_2A:
Tim Northoverad4c5db2017-07-24 17:06:23 +0000196 getTargetDefinesARMV82A(Opts, Builder);
197 break;
198 }
199
200 // All of the __sync_(bool|val)_compare_and_swap_(1|2|4|8) builtins work.
201 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
202 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
203 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
204 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
205}
206
207ArrayRef<Builtin::Info> AArch64TargetInfo::getTargetBuiltins() const {
208 return llvm::makeArrayRef(BuiltinInfo, clang::AArch64::LastTSBuiltin -
209 Builtin::FirstTSBuiltin);
210}
211
212bool AArch64TargetInfo::hasFeature(StringRef Feature) const {
213 return Feature == "aarch64" || Feature == "arm64" || Feature == "arm" ||
214 (Feature == "neon" && (FPU & NeonMode)) ||
215 (Feature == "sve" && (FPU & SveMode));
216}
217
218bool AArch64TargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
219 DiagnosticsEngine &Diags) {
220 FPU = FPUMode;
221 CRC = 0;
222 Crypto = 0;
223 Unaligned = 1;
224 HasFullFP16 = 0;
Florian Hahnef5bbd62017-07-27 16:28:39 +0000225 ArchKind = llvm::AArch64::ArchKind::ARMV8A;
Tim Northoverad4c5db2017-07-24 17:06:23 +0000226
227 for (const auto &Feature : Features) {
228 if (Feature == "+neon")
229 FPU |= NeonMode;
230 if (Feature == "+sve")
231 FPU |= SveMode;
232 if (Feature == "+crc")
233 CRC = 1;
234 if (Feature == "+crypto")
235 Crypto = 1;
236 if (Feature == "+strict-align")
237 Unaligned = 0;
238 if (Feature == "+v8.1a")
Florian Hahnef5bbd62017-07-27 16:28:39 +0000239 ArchKind = llvm::AArch64::ArchKind::ARMV8_1A;
Tim Northoverad4c5db2017-07-24 17:06:23 +0000240 if (Feature == "+v8.2a")
Florian Hahnef5bbd62017-07-27 16:28:39 +0000241 ArchKind = llvm::AArch64::ArchKind::ARMV8_2A;
Tim Northoverad4c5db2017-07-24 17:06:23 +0000242 if (Feature == "+fullfp16")
243 HasFullFP16 = 1;
244 }
245
246 setDataLayout();
247
248 return true;
249}
250
251TargetInfo::CallingConvCheckResult
252AArch64TargetInfo::checkCallingConvention(CallingConv CC) const {
253 switch (CC) {
254 case CC_C:
255 case CC_Swift:
256 case CC_PreserveMost:
257 case CC_PreserveAll:
258 case CC_OpenCLKernel:
259 case CC_Win64:
260 return CCCR_OK;
261 default:
262 return CCCR_Warning;
263 }
264}
265
266bool AArch64TargetInfo::isCLZForZeroUndef() const { return false; }
267
268TargetInfo::BuiltinVaListKind AArch64TargetInfo::getBuiltinVaListKind() const {
269 return TargetInfo::AArch64ABIBuiltinVaList;
270}
271
Erich Keaneebba5922017-07-21 22:37:03 +0000272const char *const AArch64TargetInfo::GCCRegNames[] = {
273 // 32-bit Integer registers
274 "w0", "w1", "w2", "w3", "w4", "w5", "w6", "w7", "w8", "w9", "w10", "w11",
275 "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21", "w22",
276 "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "wsp",
277
278 // 64-bit Integer registers
279 "x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11",
280 "x12", "x13", "x14", "x15", "x16", "x17", "x18", "x19", "x20", "x21", "x22",
281 "x23", "x24", "x25", "x26", "x27", "x28", "fp", "lr", "sp",
282
283 // 32-bit floating point regsisters
284 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11",
285 "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21", "s22",
286 "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
287
288 // 64-bit floating point regsisters
289 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10", "d11",
290 "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21", "d22",
291 "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
292
293 // Vector registers
294 "v0", "v1", "v2", "v3", "v4", "v5", "v6", "v7", "v8", "v9", "v10", "v11",
295 "v12", "v13", "v14", "v15", "v16", "v17", "v18", "v19", "v20", "v21", "v22",
296 "v23", "v24", "v25", "v26", "v27", "v28", "v29", "v30", "v31"
297};
298
299ArrayRef<const char *> AArch64TargetInfo::getGCCRegNames() const {
300 return llvm::makeArrayRef(GCCRegNames);
301}
302
303const TargetInfo::GCCRegAlias AArch64TargetInfo::GCCRegAliases[] = {
304 {{"w31"}, "wsp"}, {{"x29"}, "fp"}, {{"x30"}, "lr"}, {{"x31"}, "sp"},
305 // The S/D/Q and W/X registers overlap, but aren't really aliases; we
306 // don't want to substitute one of these for a different-sized one.
307};
308
309ArrayRef<TargetInfo::GCCRegAlias> AArch64TargetInfo::getGCCRegAliases() const {
310 return llvm::makeArrayRef(GCCRegAliases);
311}
312
Tim Northoverad4c5db2017-07-24 17:06:23 +0000313bool AArch64TargetInfo::validateAsmConstraint(
314 const char *&Name, TargetInfo::ConstraintInfo &Info) const {
315 switch (*Name) {
316 default:
317 return false;
318 case 'w': // Floating point and SIMD registers (V0-V31)
319 Info.setAllowsRegister();
320 return true;
321 case 'I': // Constant that can be used with an ADD instruction
322 case 'J': // Constant that can be used with a SUB instruction
323 case 'K': // Constant that can be used with a 32-bit logical instruction
324 case 'L': // Constant that can be used with a 64-bit logical instruction
325 case 'M': // Constant that can be used as a 32-bit MOV immediate
326 case 'N': // Constant that can be used as a 64-bit MOV immediate
327 case 'Y': // Floating point constant zero
328 case 'Z': // Integer constant zero
329 return true;
330 case 'Q': // A memory reference with base register and no offset
331 Info.setAllowsMemory();
332 return true;
333 case 'S': // A symbolic address
334 Info.setAllowsRegister();
335 return true;
336 case 'U':
337 // Ump: A memory address suitable for ldp/stp in SI, DI, SF and DF modes.
338 // Utf: A memory address suitable for ldp/stp in TF mode.
339 // Usa: An absolute symbolic address.
340 // Ush: The high part (bits 32:12) of a pc-relative symbolic address.
341 llvm_unreachable("FIXME: Unimplemented support for U* constraints.");
342 case 'z': // Zero register, wzr or xzr
343 Info.setAllowsRegister();
344 return true;
345 case 'x': // Floating point and SIMD registers (V0-V15)
346 Info.setAllowsRegister();
347 return true;
348 }
349 return false;
350}
Erich Keaneebba5922017-07-21 22:37:03 +0000351
Tim Northoverad4c5db2017-07-24 17:06:23 +0000352bool AArch64TargetInfo::validateConstraintModifier(
353 StringRef Constraint, char Modifier, unsigned Size,
354 std::string &SuggestedModifier) const {
355 // Strip off constraint modifiers.
356 while (Constraint[0] == '=' || Constraint[0] == '+' || Constraint[0] == '&')
357 Constraint = Constraint.substr(1);
358
359 switch (Constraint[0]) {
360 default:
361 return true;
362 case 'z':
363 case 'r': {
364 switch (Modifier) {
365 case 'x':
366 case 'w':
367 // For now assume that the person knows what they're
368 // doing with the modifier.
369 return true;
370 default:
371 // By default an 'r' constraint will be in the 'x'
372 // registers.
373 if (Size == 64)
374 return true;
375
376 SuggestedModifier = "w";
377 return false;
378 }
379 }
380 }
381}
382
383const char *AArch64TargetInfo::getClobbers() const { return ""; }
384
385int AArch64TargetInfo::getEHDataRegisterNumber(unsigned RegNo) const {
386 if (RegNo == 0)
387 return 0;
388 if (RegNo == 1)
389 return 1;
390 return -1;
391}
392
393AArch64leTargetInfo::AArch64leTargetInfo(const llvm::Triple &Triple,
394 const TargetOptions &Opts)
395 : AArch64TargetInfo(Triple, Opts) {}
396
397void AArch64leTargetInfo::setDataLayout() {
398 if (getTriple().isOSBinFormatMachO())
399 resetDataLayout("e-m:o-i64:64-i128:128-n32:64-S128");
400 else
401 resetDataLayout("e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
402}
403
404void AArch64leTargetInfo::getTargetDefines(const LangOptions &Opts,
405 MacroBuilder &Builder) const {
406 Builder.defineMacro("__AARCH64EL__");
407 AArch64TargetInfo::getTargetDefines(Opts, Builder);
408}
409
410AArch64beTargetInfo::AArch64beTargetInfo(const llvm::Triple &Triple,
411 const TargetOptions &Opts)
412 : AArch64TargetInfo(Triple, Opts) {}
413
414void AArch64beTargetInfo::getTargetDefines(const LangOptions &Opts,
415 MacroBuilder &Builder) const {
416 Builder.defineMacro("__AARCH64EB__");
417 Builder.defineMacro("__AARCH_BIG_ENDIAN");
418 Builder.defineMacro("__ARM_BIG_ENDIAN");
419 AArch64TargetInfo::getTargetDefines(Opts, Builder);
420}
421
422void AArch64beTargetInfo::setDataLayout() {
423 assert(!getTriple().isOSBinFormatMachO());
424 resetDataLayout("E-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128");
425}
426
Martin Storsjo31cac7a2017-08-13 19:42:17 +0000427WindowsARM64TargetInfo::WindowsARM64TargetInfo(const llvm::Triple &Triple,
428 const TargetOptions &Opts)
Tim Northoverad4c5db2017-07-24 17:06:23 +0000429 : WindowsTargetInfo<AArch64leTargetInfo>(Triple, Opts), Triple(Triple) {
430
431 // This is an LLP64 platform.
432 // int:4, long:4, long long:8, long double:8.
Tim Northoverad4c5db2017-07-24 17:06:23 +0000433 IntWidth = IntAlign = 32;
434 LongWidth = LongAlign = 32;
435 DoubleAlign = LongLongAlign = 64;
436 LongDoubleWidth = LongDoubleAlign = 64;
437 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
438 IntMaxType = SignedLongLong;
439 Int64Type = SignedLongLong;
440 SizeType = UnsignedLongLong;
441 PtrDiffType = SignedLongLong;
442 IntPtrType = SignedLongLong;
Tim Northoverad4c5db2017-07-24 17:06:23 +0000443}
444
Martin Storsjo31cac7a2017-08-13 19:42:17 +0000445void WindowsARM64TargetInfo::setDataLayout() {
Tim Northoverad4c5db2017-07-24 17:06:23 +0000446 resetDataLayout("e-m:w-p:64:64-i32:32-i64:64-i128:128-n32:64-S128");
447}
448
Martin Storsjo31cac7a2017-08-13 19:42:17 +0000449TargetInfo::BuiltinVaListKind
450WindowsARM64TargetInfo::getBuiltinVaListKind() const {
451 return TargetInfo::CharPtrBuiltinVaList;
452}
453
454TargetInfo::CallingConvCheckResult
455WindowsARM64TargetInfo::checkCallingConvention(CallingConv CC) const {
456 switch (CC) {
457 case CC_X86StdCall:
458 case CC_X86ThisCall:
459 case CC_X86FastCall:
460 case CC_X86VectorCall:
461 return CCCR_Ignore;
462 case CC_C:
463 case CC_OpenCLKernel:
Saleem Abdulrasool4d321332017-09-26 19:26:01 +0000464 case CC_PreserveMost:
465 case CC_PreserveAll:
Martin Storsjo31cac7a2017-08-13 19:42:17 +0000466 case CC_Win64:
467 return CCCR_OK;
468 default:
469 return CCCR_Warning;
470 }
471}
472
473MicrosoftARM64TargetInfo::MicrosoftARM64TargetInfo(const llvm::Triple &Triple,
474 const TargetOptions &Opts)
475 : WindowsARM64TargetInfo(Triple, Opts) {
476 TheCXXABI.set(TargetCXXABI::Microsoft);
477}
478
Tim Northoverad4c5db2017-07-24 17:06:23 +0000479void MicrosoftARM64TargetInfo::getVisualStudioDefines(
480 const LangOptions &Opts, MacroBuilder &Builder) const {
481 WindowsTargetInfo<AArch64leTargetInfo>::getVisualStudioDefines(Opts, Builder);
Tim Northoverad4c5db2017-07-24 17:06:23 +0000482 Builder.defineMacro("_M_ARM64", "1");
483}
484
485void MicrosoftARM64TargetInfo::getTargetDefines(const LangOptions &Opts,
486 MacroBuilder &Builder) const {
487 WindowsTargetInfo::getTargetDefines(Opts, Builder);
488 getVisualStudioDefines(Opts, Builder);
489}
490
Martin Storsjo31cac7a2017-08-13 19:42:17 +0000491MinGWARM64TargetInfo::MinGWARM64TargetInfo(const llvm::Triple &Triple,
492 const TargetOptions &Opts)
493 : WindowsARM64TargetInfo(Triple, Opts) {
494 TheCXXABI.set(TargetCXXABI::GenericAArch64);
Tim Northoverad4c5db2017-07-24 17:06:23 +0000495}
496
497DarwinAArch64TargetInfo::DarwinAArch64TargetInfo(const llvm::Triple &Triple,
498 const TargetOptions &Opts)
499 : DarwinTargetInfo<AArch64leTargetInfo>(Triple, Opts) {
500 Int64Type = SignedLongLong;
Tim Northoverad4c5db2017-07-24 17:06:23 +0000501 UseSignedCharForObjCBool = false;
502
503 LongDoubleWidth = LongDoubleAlign = SuitableAlign = 64;
504 LongDoubleFormat = &llvm::APFloat::IEEEdouble();
505
506 TheCXXABI.set(TargetCXXABI::iOS64);
507}
508
509void DarwinAArch64TargetInfo::getOSDefines(const LangOptions &Opts,
510 const llvm::Triple &Triple,
511 MacroBuilder &Builder) const {
512 Builder.defineMacro("__AARCH64_SIMD__");
513 Builder.defineMacro("__ARM64_ARCH_8__");
514 Builder.defineMacro("__ARM_NEON__");
515 Builder.defineMacro("__LITTLE_ENDIAN__");
516 Builder.defineMacro("__REGISTER_PREFIX__", "");
517 Builder.defineMacro("__arm64", "1");
518 Builder.defineMacro("__arm64__", "1");
519
520 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
521}
522
523TargetInfo::BuiltinVaListKind
524DarwinAArch64TargetInfo::getBuiltinVaListKind() const {
525 return TargetInfo::CharPtrBuiltinVaList;
526}
527
528// 64-bit RenderScript is aarch64
529RenderScript64TargetInfo::RenderScript64TargetInfo(const llvm::Triple &Triple,
530 const TargetOptions &Opts)
531 : AArch64leTargetInfo(llvm::Triple("aarch64", Triple.getVendorName(),
532 Triple.getOSName(),
533 Triple.getEnvironmentName()),
534 Opts) {
535 IsRenderScriptTarget = true;
536}
537
538void RenderScript64TargetInfo::getTargetDefines(const LangOptions &Opts,
539 MacroBuilder &Builder) const {
540 Builder.defineMacro("__RENDERSCRIPT__");
541 AArch64leTargetInfo::getTargetDefines(Opts, Builder);
542}