clang 22.0.0git
ARM.cpp
Go to the documentation of this file.
1//===--- ARM.cpp - Implement ARM target feature support -------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file implements ARM TargetInfo objects.
10//
11//===----------------------------------------------------------------------===//
12
13#include "ARM.h"
17#include "llvm/ADT/StringRef.h"
18#include "llvm/ADT/StringSwitch.h"
19#include "llvm/TargetParser/ARMTargetParser.h"
20
21using namespace clang;
22using namespace clang::targets;
23
24void ARMTargetInfo::setABIAAPCS() {
25 IsAAPCS = true;
26
29 BFloat16Format = &llvm::APFloat::BFloat();
30
31 const llvm::Triple &T = getTriple();
32
33 bool IsNetBSD = T.isOSNetBSD();
34 bool IsOpenBSD = T.isOSOpenBSD();
35 if (!T.isOSWindows() && !IsNetBSD && !IsOpenBSD)
37
39
41
43
44 // FIXME: Enumerated types are variable width in straight AAPCS.
45}
46
47void ARMTargetInfo::setABIAPCS(bool IsAAPCS16) {
48 IsAAPCS = false;
49
50 if (IsAAPCS16)
52 else
55 BFloat16Format = &llvm::APFloat::BFloat();
56
58
59 // Do not respect the alignment of bit-field types when laying out
60 // structures. This corresponds to PCC_BITFIELD_TYPE_MATTERS in gcc.
62
63 /// gcc forces the alignment to 4 bytes, regardless of the type of the
64 /// zero length bitfield. This corresponds to EMPTY_FIELD_BOUNDARY in
65 /// gcc.
67
69
70 // FIXME: Override "preferred align" for double and long long.
71}
72
73void ARMTargetInfo::setArchInfo() {
74 StringRef ArchName = getTriple().getArchName();
75
76 ArchISA = llvm::ARM::parseArchISA(ArchName);
77 CPU = std::string(llvm::ARM::getDefaultCPU(ArchName));
78 llvm::ARM::ArchKind AK = llvm::ARM::parseArch(ArchName);
79 if (AK != llvm::ARM::ArchKind::INVALID)
80 ArchKind = AK;
81 setArchInfo(ArchKind);
82}
83
84void ARMTargetInfo::setArchInfo(llvm::ARM::ArchKind Kind) {
85 StringRef SubArch;
86
87 // cache TargetParser info
88 ArchKind = Kind;
89 SubArch = llvm::ARM::getSubArch(ArchKind);
90 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
91 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
92
93 // cache CPU related strings
94 CPUAttr = getCPUAttr();
95 CPUProfile = getCPUProfile();
96}
97
98void ARMTargetInfo::setAtomic() {
99 if (ArchProfile == llvm::ARM::ProfileKind::M) {
100 // M-class only ever supports 32-bit atomics. Cortex-M0 doesn't have
101 // any atomics.
103 if (ArchVersion >= 7)
105 } else {
106 // A-class targets have up to 64-bit atomics.
107 //
108 // On Linux, 64-bit atomics are always available through kernel helpers
109 // (which are lock-free). Otherwise, atomics are available on v6 or later.
110 //
111 // (Thumb doesn't matter; for Thumbv6, we just use a library call which
112 // switches out of Thumb mode.)
113 //
114 // This should match setMaxAtomicSizeInBitsSupported() in the backend.
116 if (getTriple().getOS() == llvm::Triple::Linux || ArchVersion >= 6)
118 }
119}
120
121bool ARMTargetInfo::hasMVE() const {
122 return ArchKind == llvm::ARM::ArchKind::ARMV8_1MMainline && MVE != 0;
123}
124
125bool ARMTargetInfo::hasMVEFloat() const {
126 return hasMVE() && (MVE & MVE_FP);
127}
128
129bool ARMTargetInfo::hasCDE() const { return getARMCDECoprocMask() != 0; }
130
131bool ARMTargetInfo::isThumb() const {
132 return ArchISA == llvm::ARM::ISAKind::THUMB;
133}
134
135bool ARMTargetInfo::supportsThumb() const {
136 return CPUAttr.count('T') || ArchVersion >= 6;
137}
138
139bool ARMTargetInfo::supportsThumb2() const {
140 return CPUAttr == "6T2" || (ArchVersion >= 7 && CPUAttr != "8M_BASE");
141}
142
143StringRef ARMTargetInfo::getCPUAttr() const {
144 // For most sub-arches, the build attribute CPU name is enough.
145 // For Cortex variants, it's slightly different.
146 switch (ArchKind) {
147 default:
148 return llvm::ARM::getCPUAttr(ArchKind);
149 case llvm::ARM::ArchKind::ARMV6M:
150 return "6M";
151 case llvm::ARM::ArchKind::ARMV7S:
152 return "7S";
153 case llvm::ARM::ArchKind::ARMV7A:
154 return "7A";
155 case llvm::ARM::ArchKind::ARMV7R:
156 return "7R";
157 case llvm::ARM::ArchKind::ARMV7M:
158 return "7M";
159 case llvm::ARM::ArchKind::ARMV7EM:
160 return "7EM";
161 case llvm::ARM::ArchKind::ARMV7VE:
162 return "7VE";
163 case llvm::ARM::ArchKind::ARMV8A:
164 return "8A";
165 case llvm::ARM::ArchKind::ARMV8_1A:
166 return "8_1A";
167 case llvm::ARM::ArchKind::ARMV8_2A:
168 return "8_2A";
169 case llvm::ARM::ArchKind::ARMV8_3A:
170 return "8_3A";
171 case llvm::ARM::ArchKind::ARMV8_4A:
172 return "8_4A";
173 case llvm::ARM::ArchKind::ARMV8_5A:
174 return "8_5A";
175 case llvm::ARM::ArchKind::ARMV8_6A:
176 return "8_6A";
177 case llvm::ARM::ArchKind::ARMV8_7A:
178 return "8_7A";
179 case llvm::ARM::ArchKind::ARMV8_8A:
180 return "8_8A";
181 case llvm::ARM::ArchKind::ARMV8_9A:
182 return "8_9A";
183 case llvm::ARM::ArchKind::ARMV9A:
184 return "9A";
185 case llvm::ARM::ArchKind::ARMV9_1A:
186 return "9_1A";
187 case llvm::ARM::ArchKind::ARMV9_2A:
188 return "9_2A";
189 case llvm::ARM::ArchKind::ARMV9_3A:
190 return "9_3A";
191 case llvm::ARM::ArchKind::ARMV9_4A:
192 return "9_4A";
193 case llvm::ARM::ArchKind::ARMV9_5A:
194 return "9_5A";
195 case llvm::ARM::ArchKind::ARMV9_6A:
196 return "9_6A";
197 case llvm::ARM::ArchKind::ARMV9_7A:
198 return "9_7A";
199 case llvm::ARM::ArchKind::ARMV8MBaseline:
200 return "8M_BASE";
201 case llvm::ARM::ArchKind::ARMV8MMainline:
202 return "8M_MAIN";
203 case llvm::ARM::ArchKind::ARMV8R:
204 return "8R";
205 case llvm::ARM::ArchKind::ARMV8_1MMainline:
206 return "8_1M_MAIN";
207 }
208}
209
210StringRef ARMTargetInfo::getCPUProfile() const {
211 switch (ArchProfile) {
212 case llvm::ARM::ProfileKind::A:
213 return "A";
214 case llvm::ARM::ProfileKind::R:
215 return "R";
216 case llvm::ARM::ProfileKind::M:
217 return "M";
218 default:
219 return "";
220 }
221}
222
223ARMTargetInfo::ARMTargetInfo(const llvm::Triple &Triple,
224 const TargetOptions &Opts)
225 : TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(true), LDREX(0),
226 HW_FP(0) {
227 bool IsFreeBSD = Triple.isOSFreeBSD();
228 bool IsFuchsia = Triple.isOSFuchsia();
229 bool IsOpenBSD = Triple.isOSOpenBSD();
230 bool IsNetBSD = Triple.isOSNetBSD();
231 bool IsHaiku = Triple.isOSHaiku();
232 bool IsOHOS = Triple.isOHOSFamily();
233
234 // FIXME: the isOSBinFormatMachO is a workaround for identifying a Darwin-like
235 // environment where size_t is `unsigned long` rather than `unsigned int`
236
238 (Triple.isOSDarwin() || Triple.isOSBinFormatMachO() || IsOpenBSD ||
239 IsNetBSD)
240 ? SignedLong
241 : SignedInt;
242
243 SizeType = (Triple.isOSDarwin() || Triple.isOSBinFormatMachO() || IsOpenBSD ||
244 IsNetBSD)
246 : UnsignedInt;
247
248 // ptrdiff_t is inconsistent on Darwin
249 if ((Triple.isOSDarwin() || Triple.isOSBinFormatMachO()) &&
250 !Triple.isWatchABI())
252
253 // Cache arch related info.
254 setArchInfo();
255
256 // {} in inline assembly are neon specifiers, not assembly variant
257 // specifiers.
258 NoAsmVariants = true;
259
260 // FIXME: This duplicates code from the driver that sets the -target-abi
261 // option - this code is used if -target-abi isn't passed and should
262 // be unified in some way.
263 if (Triple.isOSBinFormatMachO()) {
264 // The backend is hardwired to assume AAPCS for M-class processors, ensure
265 // the frontend matches that.
266 if (Triple.getEnvironment() == llvm::Triple::EABI ||
267 Triple.getOS() == llvm::Triple::UnknownOS ||
268 ArchProfile == llvm::ARM::ProfileKind::M) {
269 setABI("aapcs");
270 } else if (Triple.isWatchABI()) {
271 setABI("aapcs16");
272 } else {
273 setABI("apcs-gnu");
274 }
275 } else if (Triple.isOSWindows()) {
276 // FIXME: this is invalid for WindowsCE
277 setABI("aapcs");
278 } else {
279 // Select the default based on the platform.
280 switch (Triple.getEnvironment()) {
281 case llvm::Triple::Android:
282 case llvm::Triple::GNUEABI:
283 case llvm::Triple::GNUEABIT64:
284 case llvm::Triple::GNUEABIHF:
285 case llvm::Triple::GNUEABIHFT64:
286 case llvm::Triple::MuslEABI:
287 case llvm::Triple::MuslEABIHF:
288 case llvm::Triple::OpenHOS:
289 setABI("aapcs-linux");
290 break;
291 case llvm::Triple::EABIHF:
292 case llvm::Triple::EABI:
293 setABI("aapcs");
294 break;
295 case llvm::Triple::GNU:
296 setABI("apcs-gnu");
297 break;
298 default:
299 if (IsNetBSD)
300 setABI("apcs-gnu");
301 else if (IsFreeBSD || IsFuchsia || IsOpenBSD || IsHaiku || IsOHOS)
302 setABI("aapcs-linux");
303 else
304 setABI("aapcs");
305 break;
306 }
307 }
308
309 // ARM targets default to using the ARM C++ ABI.
310 TheCXXABI.set(TargetCXXABI::GenericARM);
311
312 // ARM has atomics up to 8 bytes
313 setAtomic();
314
315 // Maximum alignment for ARM NEON data types should be 64-bits (AAPCS)
316 // as well the default alignment
317 if (IsAAPCS && !Triple.isAndroid())
318 DefaultAlignForAttributeAligned = MaxVectorAlign = 64;
319
320 // Do force alignment of members that follow zero length bitfields. If
321 // the alignment of the zero-length bitfield is greater than the member
322 // that follows it, `bar', `bar' will be aligned as the type of the
323 // zero length bitfield.
324 UseZeroLengthBitfieldAlignment = true;
325
326 if (Triple.getOS() == llvm::Triple::Linux ||
327 Triple.getOS() == llvm::Triple::UnknownOS)
328 this->MCountName = Opts.EABIVersion == llvm::EABI::GNU
329 ? "llvm.arm.gnu.eabi.mcount"
330 : "\01mcount";
331
332 SoftFloatABI = llvm::is_contained(Opts.FeaturesAsWritten, "+soft-float-abi");
333}
334
335StringRef ARMTargetInfo::getABI() const { return ABI; }
336
337bool ARMTargetInfo::setABI(const std::string &Name) {
338 ABI = Name;
339
340 // The defaults (above) are for AAPCS, check if we need to change them.
341 //
342 // FIXME: We need support for -meabi... we could just mangle it into the
343 // name.
344 if (Name == "apcs-gnu" || Name == "aapcs16") {
345 setABIAPCS(Name == "aapcs16");
346 return true;
347 }
348 if (Name == "aapcs" || Name == "aapcs-vfp" || Name == "aapcs-linux") {
349 setABIAAPCS();
350 return true;
351 }
352 return false;
353}
354
356 llvm::ARM::ArchKind CPUArch = llvm::ARM::parseCPUArch(Arch);
357 if (CPUArch == llvm::ARM::ArchKind::INVALID)
358 CPUArch = llvm::ARM::parseArch(getTriple().getArchName());
359
360 if (CPUArch == llvm::ARM::ArchKind::INVALID)
361 return false;
362
363 StringRef ArchFeature = llvm::ARM::getArchName(CPUArch);
364 auto a =
365 llvm::Triple(ArchFeature, getTriple().getVendorName(),
366 getTriple().getOSName(), getTriple().getEnvironmentName());
367
368 StringRef SubArch = llvm::ARM::getSubArch(CPUArch);
369 llvm::ARM::ProfileKind Profile = llvm::ARM::parseArchProfile(SubArch);
370 return a.isArmT32() && (Profile == llvm::ARM::ProfileKind::M);
371}
372
373bool ARMTargetInfo::validateBranchProtection(StringRef Spec, StringRef Arch,
375 const LangOptions &LO,
376 StringRef &Err) const {
377 llvm::ARM::ParsedBranchProtection PBP;
378 if (!llvm::ARM::parseBranchProtection(Spec, PBP, Err))
379 return false;
380
382 return false;
383
384 BPI.SignReturnAddr =
385 llvm::StringSwitch<LangOptions::SignReturnAddressScopeKind>(PBP.Scope)
389
390 // Don't care for the sign key, beyond issuing a warning.
391 if (PBP.Key == "b_key")
392 Err = "b-key";
394
395 BPI.BranchTargetEnforcement = PBP.BranchTargetEnforcement;
396 BPI.BranchProtectionPAuthLR = PBP.BranchProtectionPAuthLR;
397 return true;
398}
399
400// FIXME: This should be based on Arch attributes, not CPU names.
402 llvm::StringMap<bool> &Features, DiagnosticsEngine &Diags, StringRef CPU,
403 const std::vector<std::string> &FeaturesVec) const {
404
405 std::string ArchFeature;
406 std::vector<StringRef> TargetFeatures;
407 llvm::ARM::ArchKind Arch = llvm::ARM::parseArch(getTriple().getArchName());
408
409 // Map the base architecture to an appropriate target feature, so we don't
410 // rely on the target triple.
411 llvm::ARM::ArchKind CPUArch = llvm::ARM::parseCPUArch(CPU);
412 if (CPUArch == llvm::ARM::ArchKind::INVALID)
413 CPUArch = Arch;
414 if (CPUArch != llvm::ARM::ArchKind::INVALID) {
415 ArchFeature = ("+" + llvm::ARM::getArchName(CPUArch)).str();
416 TargetFeatures.push_back(ArchFeature);
417
418 // These features are added to allow arm_neon.h target(..) attributes to
419 // match with both arm and aarch64. We need to add all previous architecture
420 // versions, so that "8.6" also allows "8.1" functions. In case of v9.x the
421 // v8.x counterparts are added too. We only need these for anything > 8.0-A.
422 for (llvm::ARM::ArchKind I = llvm::ARM::convertV9toV8(CPUArch);
423 I != llvm::ARM::ArchKind::INVALID; --I)
424 Features[llvm::ARM::getSubArch(I)] = true;
425 if (CPUArch > llvm::ARM::ArchKind::ARMV8A &&
426 CPUArch <= llvm::ARM::ArchKind::ARMV9_3A)
427 for (llvm::ARM::ArchKind I = CPUArch; I != llvm::ARM::ArchKind::INVALID;
428 --I)
429 Features[llvm::ARM::getSubArch(I)] = true;
430 }
431
432 // get default FPU features
433 llvm::ARM::FPUKind FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
434 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
435
436 // get default Extension features
437 uint64_t Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
438 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
439
440 for (auto Feature : TargetFeatures)
441 if (Feature[0] == '+')
442 Features[Feature.drop_front(1)] = true;
443
444 // Enable or disable thumb-mode explicitly per function to enable mixed
445 // ARM and Thumb code generation.
446 if (isThumb())
447 Features["thumb-mode"] = true;
448 else
449 Features["thumb-mode"] = false;
450
451 // Convert user-provided arm and thumb GNU target attributes to
452 // [-|+]thumb-mode target features respectively.
453 std::vector<std::string> UpdatedFeaturesVec;
454 for (const auto &Feature : FeaturesVec) {
455 // Skip soft-float-abi; it's something we only use to initialize a bit of
456 // class state, and is otherwise unrecognized.
457 if (Feature == "+soft-float-abi")
458 continue;
459
460 StringRef FixedFeature;
461 if (Feature == "+arm")
462 FixedFeature = "-thumb-mode";
463 else if (Feature == "+thumb")
464 FixedFeature = "+thumb-mode";
465 else
466 FixedFeature = Feature;
467 UpdatedFeaturesVec.push_back(FixedFeature.str());
468 }
469
470 return TargetInfo::initFeatureMap(Features, Diags, CPU, UpdatedFeaturesVec);
471}
472
473
474bool ARMTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
475 DiagnosticsEngine &Diags) {
476 FPU = 0;
477 MVE = 0;
478 CRC = 0;
479 Crypto = 0;
480 SHA2 = 0;
481 AES = 0;
482 DSP = 0;
483 HasUnalignedAccess = true;
484 SoftFloat = false;
485 // Note that SoftFloatABI is initialized in our constructor.
486 HWDiv = 0;
487 DotProd = 0;
488 HasMatMul = 0;
489 HasPAC = 0;
490 HasBTI = 0;
491 HasFloat16 = true;
493 HasBFloat16 = false;
494 HasFullBFloat16 = false;
495 FPRegsDisabled = false;
496
497 // This does not diagnose illegal cases like having both
498 // "+vfpv2" and "+vfpv3" or having "+neon" and "-fp64".
499 for (const auto &Feature : Features) {
500 if (Feature == "+soft-float") {
501 SoftFloat = true;
502 } else if (Feature == "+vfp2sp" || Feature == "+vfp2") {
503 FPU |= VFP2FPU;
504 HW_FP |= HW_FP_SP;
505 if (Feature == "+vfp2")
506 HW_FP |= HW_FP_DP;
507 } else if (Feature == "+vfp3sp" || Feature == "+vfp3d16sp" ||
508 Feature == "+vfp3" || Feature == "+vfp3d16") {
509 FPU |= VFP3FPU;
510 HW_FP |= HW_FP_SP;
511 if (Feature == "+vfp3" || Feature == "+vfp3d16")
512 HW_FP |= HW_FP_DP;
513 } else if (Feature == "+vfp4sp" || Feature == "+vfp4d16sp" ||
514 Feature == "+vfp4" || Feature == "+vfp4d16") {
515 FPU |= VFP4FPU;
516 HW_FP |= HW_FP_SP | HW_FP_HP;
517 if (Feature == "+vfp4" || Feature == "+vfp4d16")
518 HW_FP |= HW_FP_DP;
519 } else if (Feature == "+fp-armv8sp" || Feature == "+fp-armv8d16sp" ||
520 Feature == "+fp-armv8" || Feature == "+fp-armv8d16") {
521 FPU |= FPARMV8;
522 HW_FP |= HW_FP_SP | HW_FP_HP;
523 if (Feature == "+fp-armv8" || Feature == "+fp-armv8d16")
524 HW_FP |= HW_FP_DP;
525 } else if (Feature == "+neon") {
526 FPU |= NeonFPU;
527 HW_FP |= HW_FP_SP;
528 } else if (Feature == "+hwdiv") {
529 HWDiv |= HWDivThumb;
530 } else if (Feature == "+hwdiv-arm") {
531 HWDiv |= HWDivARM;
532 } else if (Feature == "+crc") {
533 CRC = 1;
534 } else if (Feature == "+crypto") {
535 Crypto = 1;
536 } else if (Feature == "+sha2") {
537 SHA2 = 1;
538 } else if (Feature == "+aes") {
539 AES = 1;
540 } else if (Feature == "+dsp") {
541 DSP = 1;
542 } else if (Feature == "+fp64") {
543 HW_FP |= HW_FP_DP;
544 } else if (Feature == "+8msecext") {
545 if (CPUProfile != "M" || ArchVersion != 8) {
546 Diags.Report(diag::err_target_unsupported_mcmse) << CPU;
547 return false;
548 }
549 } else if (Feature == "+strict-align") {
550 HasUnalignedAccess = false;
551 } else if (Feature == "+fp16") {
552 HW_FP |= HW_FP_HP;
553 } else if (Feature == "+fullfp16") {
554 HasFastHalfType = true;
555 } else if (Feature == "+dotprod") {
556 DotProd = true;
557 } else if (Feature == "+mve") {
558 MVE |= MVE_INT;
559 } else if (Feature == "+mve.fp") {
560 HasFastHalfType = true;
561 FPU |= FPARMV8;
562 MVE |= MVE_INT | MVE_FP;
563 HW_FP |= HW_FP_SP | HW_FP_HP;
564 } else if (Feature == "+i8mm") {
565 HasMatMul = 1;
566 } else if (Feature.size() == strlen("+cdecp0") && Feature >= "+cdecp0" &&
567 Feature <= "+cdecp7") {
568 unsigned Coproc = Feature.back() - '0';
569 ARMCDECoprocMask |= (1U << Coproc);
570 } else if (Feature == "+bf16") {
571 HasBFloat16 = true;
572 } else if (Feature == "-fpregs") {
573 FPRegsDisabled = true;
574 } else if (Feature == "+pacbti") {
575 HasPAC = 1;
576 HasBTI = 1;
577 } else if (Feature == "+fullbf16") {
578 HasFullBFloat16 = true;
579 } else if (Feature == "+execute-only") {
580 TLSSupported = false;
581 }
582 }
583
584 HalfArgsAndReturns = true;
585
586 switch (ArchVersion) {
587 case 6:
588 if (ArchProfile == llvm::ARM::ProfileKind::M)
589 LDREX = 0;
590 else if (ArchKind == llvm::ARM::ArchKind::ARMV6K ||
591 ArchKind == llvm::ARM::ArchKind::ARMV6KZ)
593 else
594 LDREX = ARM_LDREX_W;
595 break;
596 case 7:
597 case 8:
598 if (ArchProfile == llvm::ARM::ProfileKind::M)
600 else
602 break;
603 case 9:
604 assert(ArchProfile != llvm::ARM::ProfileKind::M &&
605 "No Armv9-M architectures defined");
607 }
608
609 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
610 Diags.Report(diag::err_target_unsupported_fpmath) << "neon";
611 return false;
612 }
613
614 if (FPMath == FP_Neon)
615 Features.push_back("+neonfp");
616 else if (FPMath == FP_VFP)
617 Features.push_back("-neonfp");
618
619 return true;
620}
621
622bool ARMTargetInfo::hasFeature(StringRef Feature) const {
623 return llvm::StringSwitch<bool>(Feature)
624 .Case("arm", true)
625 .Case("aarch32", true)
626 .Case("softfloat", SoftFloat)
627 .Case("thumb", isThumb())
628 .Case("neon", (FPU & NeonFPU) && !SoftFloat)
629 .Case("vfp", FPU && !SoftFloat)
630 .Case("hwdiv", HWDiv & HWDivThumb)
631 .Case("hwdiv-arm", HWDiv & HWDivARM)
632 .Case("mve", hasMVE())
633 .Default(false);
634}
635
637 // The __bf16 type is generally available so long as we have any fp registers.
638 return HasBFloat16 || (FPU && !SoftFloat);
639}
640
641bool ARMTargetInfo::isValidCPUName(StringRef Name) const {
642 return Name == "generic" ||
643 llvm::ARM::parseCPUArch(Name) != llvm::ARM::ArchKind::INVALID;
644}
645
647 llvm::ARM::fillValidCPUArchList(Values);
648}
649
650bool ARMTargetInfo::setCPU(const std::string &Name) {
651 if (Name != "generic")
652 setArchInfo(llvm::ARM::parseCPUArch(Name));
653
654 if (ArchKind == llvm::ARM::ArchKind::INVALID)
655 return false;
656 setAtomic();
657 CPU = Name;
658 return true;
659}
660
661bool ARMTargetInfo::setFPMath(StringRef Name) {
662 if (Name == "neon") {
663 FPMath = FP_Neon;
664 return true;
665 } else if (Name == "vfp" || Name == "vfp2" || Name == "vfp3" ||
666 Name == "vfp4") {
667 FPMath = FP_VFP;
668 return true;
669 }
670 return false;
671}
672
674 MacroBuilder &Builder) const {
675 Builder.defineMacro("__ARM_FEATURE_QRDMX", "1");
676}
677
679 MacroBuilder &Builder) const {
680 // Also include the ARMv8.1-A defines
681 getTargetDefinesARMV81A(Opts, Builder);
682}
683
685 MacroBuilder &Builder) const {
686 // Also include the ARMv8.2-A defines
687 Builder.defineMacro("__ARM_FEATURE_COMPLEX", "1");
688 getTargetDefinesARMV82A(Opts, Builder);
689}
690
692 MacroBuilder &Builder) const {
693 // Target identification.
694 Builder.defineMacro("__arm");
695 Builder.defineMacro("__arm__");
696 // For bare-metal none-eabi.
697 if (getTriple().getOS() == llvm::Triple::UnknownOS &&
698 (getTriple().getEnvironment() == llvm::Triple::EABI ||
699 getTriple().getEnvironment() == llvm::Triple::EABIHF) &&
700 Opts.CPlusPlus) {
701 Builder.defineMacro("_GNU_SOURCE");
702 }
703
704 // Target properties.
705 Builder.defineMacro("__REGISTER_PREFIX__", "");
706
707 // Unfortunately, __ARM_ARCH_7K__ is now more of an ABI descriptor. The CPU
708 // happens to be Cortex-A7 though, so it should still get __ARM_ARCH_7A__.
709 if (getTriple().isWatchABI())
710 Builder.defineMacro("__ARM_ARCH_7K__", "2");
711
712 if (!CPUAttr.empty())
713 Builder.defineMacro("__ARM_ARCH_" + CPUAttr + "__");
714
715 // ACLE 6.4.1 ARM/Thumb instruction set architecture
716 // __ARM_ARCH is defined as an integer value indicating the current ARM ISA
717 Builder.defineMacro("__ARM_ARCH", Twine(ArchVersion));
718
719 if (ArchVersion >= 8) {
720 // ACLE 6.5.7 Crypto Extension
721 // The __ARM_FEATURE_CRYPTO is deprecated in favor of finer grained
722 // feature macros for AES and SHA2
723 if (SHA2 && AES)
724 Builder.defineMacro("__ARM_FEATURE_CRYPTO", "1");
725 if (SHA2)
726 Builder.defineMacro("__ARM_FEATURE_SHA2", "1");
727 if (AES)
728 Builder.defineMacro("__ARM_FEATURE_AES", "1");
729 // ACLE 6.5.8 CRC32 Extension
730 if (CRC)
731 Builder.defineMacro("__ARM_FEATURE_CRC32", "1");
732 // ACLE 6.5.10 Numeric Maximum and Minimum
733 Builder.defineMacro("__ARM_FEATURE_NUMERIC_MAXMIN", "1");
734 // ACLE 6.5.9 Directed Rounding
735 Builder.defineMacro("__ARM_FEATURE_DIRECTED_ROUNDING", "1");
736 }
737
738 // __ARM_ARCH_ISA_ARM is defined to 1 if the core supports the ARM ISA. It
739 // is not defined for the M-profile.
740 // NOTE that the default profile is assumed to be 'A'
741 if (CPUProfile.empty() || ArchProfile != llvm::ARM::ProfileKind::M)
742 Builder.defineMacro("__ARM_ARCH_ISA_ARM", "1");
743
744 // __ARM_ARCH_ISA_THUMB is defined to 1 if the core supports the original
745 // Thumb ISA (including v6-M and v8-M Baseline). It is set to 2 if the
746 // core supports the Thumb-2 ISA as found in the v6T2 architecture and all
747 // v7 and v8 architectures excluding v8-M Baseline.
748 if (supportsThumb2())
749 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "2");
750 else if (supportsThumb())
751 Builder.defineMacro("__ARM_ARCH_ISA_THUMB", "1");
752
753 // __ARM_32BIT_STATE is defined to 1 if code is being generated for a 32-bit
754 // instruction set such as ARM or Thumb.
755 Builder.defineMacro("__ARM_32BIT_STATE", "1");
756
757 // ACLE 6.4.2 Architectural Profile (A, R, M or pre-Cortex)
758
759 // __ARM_ARCH_PROFILE is defined as 'A', 'R', 'M' or 'S', or unset.
760 if (!CPUProfile.empty())
761 Builder.defineMacro("__ARM_ARCH_PROFILE", "'" + CPUProfile + "'");
762
763 // ACLE 6.4.3 Unaligned access supported in hardware
765 Builder.defineMacro("__ARM_FEATURE_UNALIGNED", "1");
766
767 // ACLE 6.4.4 LDREX/STREX
768 if (LDREX)
769 Builder.defineMacro("__ARM_FEATURE_LDREX", "0x" + Twine::utohexstr(LDREX));
770
771 // ACLE 6.4.5 CLZ
772 if (ArchVersion == 5 || (ArchVersion == 6 && CPUProfile != "M") ||
773 ArchVersion > 6)
774 Builder.defineMacro("__ARM_FEATURE_CLZ", "1");
775
776 // ACLE 6.5.1 Hardware Floating Point
777 if (HW_FP)
778 Builder.defineMacro("__ARM_FP", "0x" + Twine::utohexstr(HW_FP));
779
780 // ACLE predefines.
781 Builder.defineMacro("__ARM_ACLE", "200");
782
783 // FP16 support (we currently only support IEEE format).
784 Builder.defineMacro("__ARM_FP16_FORMAT_IEEE", "1");
785 Builder.defineMacro("__ARM_FP16_ARGS", "1");
786
787 // ACLE 6.5.3 Fused multiply-accumulate (FMA)
788 if (ArchVersion >= 7 && (FPU & VFP4FPU))
789 Builder.defineMacro("__ARM_FEATURE_FMA", "1");
790
791 // Subtarget options.
792
793 // FIXME: It's more complicated than this and we don't really support
794 // interworking.
795 // Windows on ARM does not "support" interworking
796 if (5 <= ArchVersion && ArchVersion <= 8 && !getTriple().isOSWindows())
797 Builder.defineMacro("__THUMB_INTERWORK__");
798
799 if (ABI == "aapcs" || ABI == "aapcs-linux" || ABI == "aapcs-vfp") {
800 // Embedded targets on Darwin follow AAPCS, but not EABI.
801 // Windows on ARM follows AAPCS VFP, but does not conform to EABI.
802 if (!getTriple().isOSBinFormatMachO() && !getTriple().isOSWindows())
803 Builder.defineMacro("__ARM_EABI__");
804 Builder.defineMacro("__ARM_PCS", "1");
805 }
806
807 if ((!SoftFloat && !SoftFloatABI) || ABI == "aapcs-vfp" || ABI == "aapcs16")
808 Builder.defineMacro("__ARM_PCS_VFP", "1");
809
810 if (SoftFloat || (SoftFloatABI && !FPU))
811 Builder.defineMacro("__SOFTFP__");
812
813 // ACLE position independent code macros.
814 if (Opts.ROPI)
815 Builder.defineMacro("__ARM_ROPI", "1");
816 if (Opts.RWPI)
817 Builder.defineMacro("__ARM_RWPI", "1");
818
819 // Macros for enabling co-proc intrinsics
820 uint64_t FeatureCoprocBF = 0;
821 switch (ArchKind) {
822 default:
823 break;
824 case llvm::ARM::ArchKind::ARMV4:
825 case llvm::ARM::ArchKind::ARMV4T:
826 // Filter __arm_ldcl and __arm_stcl in acle.h
827 FeatureCoprocBF = isThumb() ? 0 : FEATURE_COPROC_B1;
828 break;
829 case llvm::ARM::ArchKind::ARMV5T:
830 FeatureCoprocBF = isThumb() ? 0 : FEATURE_COPROC_B1 | FEATURE_COPROC_B2;
831 break;
832 case llvm::ARM::ArchKind::ARMV5TE:
833 case llvm::ARM::ArchKind::ARMV5TEJ:
834 if (!isThumb())
835 FeatureCoprocBF =
836 FEATURE_COPROC_B1 | FEATURE_COPROC_B2 | FEATURE_COPROC_B3;
837 break;
838 case llvm::ARM::ArchKind::ARMV6:
839 case llvm::ARM::ArchKind::ARMV6K:
840 case llvm::ARM::ArchKind::ARMV6KZ:
841 case llvm::ARM::ArchKind::ARMV6T2:
842 if (!isThumb() || ArchKind == llvm::ARM::ArchKind::ARMV6T2)
843 FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B2 |
844 FEATURE_COPROC_B3 | FEATURE_COPROC_B4;
845 break;
846 case llvm::ARM::ArchKind::ARMV7A:
847 case llvm::ARM::ArchKind::ARMV7R:
848 case llvm::ARM::ArchKind::ARMV7M:
849 case llvm::ARM::ArchKind::ARMV7S:
850 case llvm::ARM::ArchKind::ARMV7EM:
851 FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B2 |
852 FEATURE_COPROC_B3 | FEATURE_COPROC_B4;
853 break;
854 case llvm::ARM::ArchKind::ARMV8A:
855 case llvm::ARM::ArchKind::ARMV8R:
856 case llvm::ARM::ArchKind::ARMV8_1A:
857 case llvm::ARM::ArchKind::ARMV8_2A:
858 case llvm::ARM::ArchKind::ARMV8_3A:
859 case llvm::ARM::ArchKind::ARMV8_4A:
860 case llvm::ARM::ArchKind::ARMV8_5A:
861 case llvm::ARM::ArchKind::ARMV8_6A:
862 case llvm::ARM::ArchKind::ARMV8_7A:
863 case llvm::ARM::ArchKind::ARMV8_8A:
864 case llvm::ARM::ArchKind::ARMV8_9A:
865 case llvm::ARM::ArchKind::ARMV9A:
866 case llvm::ARM::ArchKind::ARMV9_1A:
867 case llvm::ARM::ArchKind::ARMV9_2A:
868 case llvm::ARM::ArchKind::ARMV9_3A:
869 case llvm::ARM::ArchKind::ARMV9_4A:
870 case llvm::ARM::ArchKind::ARMV9_5A:
871 case llvm::ARM::ArchKind::ARMV9_6A:
872 case llvm::ARM::ArchKind::ARMV9_7A:
873 // Filter __arm_cdp, __arm_ldcl, __arm_stcl in arm_acle.h
874 FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B3;
875 break;
876 case llvm::ARM::ArchKind::ARMV8MMainline:
877 case llvm::ARM::ArchKind::ARMV8_1MMainline:
878 FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B2 |
879 FEATURE_COPROC_B3 | FEATURE_COPROC_B4;
880 break;
881 }
882 Builder.defineMacro("__ARM_FEATURE_COPROC",
883 "0x" + Twine::utohexstr(FeatureCoprocBF));
884
885 if (ArchKind == llvm::ARM::ArchKind::XSCALE)
886 Builder.defineMacro("__XSCALE__");
887
888 if (isThumb()) {
889 Builder.defineMacro("__THUMBEL__");
890 Builder.defineMacro("__thumb__");
891 if (supportsThumb2())
892 Builder.defineMacro("__thumb2__");
893 }
894
895 // ACLE 6.4.9 32-bit SIMD instructions
896 if ((CPUProfile != "M" && ArchVersion >= 6) || (CPUProfile == "M" && DSP))
897 Builder.defineMacro("__ARM_FEATURE_SIMD32", "1");
898
899 // ACLE 6.4.10 Hardware Integer Divide
900 if (((HWDiv & HWDivThumb) && isThumb()) ||
901 ((HWDiv & HWDivARM) && !isThumb())) {
902 Builder.defineMacro("__ARM_FEATURE_IDIV", "1");
903 Builder.defineMacro("__ARM_ARCH_EXT_IDIV__", "1");
904 }
905
906 // Note, this is always on in gcc, even though it doesn't make sense.
907 Builder.defineMacro("__APCS_32__");
908
909 // __VFP_FP__ means that the floating-point format is VFP, not that a hardware
910 // FPU is present. Moreover, the VFP format is the only one supported by
911 // clang. For these reasons, this macro is always defined.
912 Builder.defineMacro("__VFP_FP__");
913
914 if (FPUModeIsVFP((FPUMode)FPU)) {
915 if (FPU & VFP2FPU)
916 Builder.defineMacro("__ARM_VFPV2__");
917 if (FPU & VFP3FPU)
918 Builder.defineMacro("__ARM_VFPV3__");
919 if (FPU & VFP4FPU)
920 Builder.defineMacro("__ARM_VFPV4__");
921 if (FPU & FPARMV8)
922 Builder.defineMacro("__ARM_FPV5__");
923 }
924
925 // This only gets set when Neon instructions are actually available, unlike
926 // the VFP define, hence the soft float and arch check. This is subtly
927 // different from gcc, we follow the intent which was that it should be set
928 // when Neon instructions are actually available.
929 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
930 Builder.defineMacro("__ARM_NEON", "1");
931 Builder.defineMacro("__ARM_NEON__");
932 // current AArch32 NEON implementations do not support double-precision
933 // floating-point even when it is present in VFP.
934 Builder.defineMacro("__ARM_NEON_FP",
935 "0x" + Twine::utohexstr(HW_FP & ~HW_FP_DP));
936 }
937
938 if (hasMVE()) {
939 Builder.defineMacro("__ARM_FEATURE_MVE", hasMVEFloat() ? "3" : "1");
940 }
941
942 if (hasCDE()) {
943 Builder.defineMacro("__ARM_FEATURE_CDE", "1");
944 Builder.defineMacro("__ARM_FEATURE_CDE_COPROC",
945 "0x" + Twine::utohexstr(getARMCDECoprocMask()));
946 }
947
948 Builder.defineMacro("__ARM_SIZEOF_WCHAR_T",
949 Twine(Opts.WCharSize ? Opts.WCharSize : 4));
950
951 Builder.defineMacro("__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ? "1" : "4");
952
953 // CMSE
954 if (ArchVersion == 8 && ArchProfile == llvm::ARM::ProfileKind::M)
955 Builder.defineMacro("__ARM_FEATURE_CMSE", Opts.Cmse ? "3" : "1");
956
957 if (ArchVersion >= 6 && CPUAttr != "6M" && CPUAttr != "8M_BASE") {
958 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
959 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
960 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
961 Builder.defineMacro("__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
962 }
963
964 // ACLE 6.4.7 DSP instructions
965 if (DSP) {
966 Builder.defineMacro("__ARM_FEATURE_DSP", "1");
967 }
968
969 // ACLE 6.4.8 Saturation instructions
970 bool SAT = false;
971 if ((ArchVersion == 6 && CPUProfile != "M") || ArchVersion > 6) {
972 Builder.defineMacro("__ARM_FEATURE_SAT", "1");
973 SAT = true;
974 }
975
976 // ACLE 6.4.6 Q (saturation) flag
977 if (DSP || SAT)
978 Builder.defineMacro("__ARM_FEATURE_QBIT", "1");
979
980 if (Opts.UnsafeFPMath)
981 Builder.defineMacro("__ARM_FP_FAST", "1");
982
983 // Armv8.2-A FP16 vector intrinsic
984 if ((FPU & NeonFPU) && HasFastHalfType)
985 Builder.defineMacro("__ARM_FEATURE_FP16_VECTOR_ARITHMETIC", "1");
986
987 // Armv8.2-A FP16 scalar intrinsics
988 if (HasFastHalfType)
989 Builder.defineMacro("__ARM_FEATURE_FP16_SCALAR_ARITHMETIC", "1");
990
991 // Armv8.2-A dot product intrinsics
992 if (DotProd)
993 Builder.defineMacro("__ARM_FEATURE_DOTPROD", "1");
994
995 if (HasMatMul)
996 Builder.defineMacro("__ARM_FEATURE_MATMUL_INT8", "1");
997
998 if (HasPAC)
999 Builder.defineMacro("__ARM_FEATURE_PAUTH", "1");
1000
1001 if (HasBTI)
1002 Builder.defineMacro("__ARM_FEATURE_BTI", "1");
1003
1004 if (HasBFloat16) {
1005 Builder.defineMacro("__ARM_FEATURE_BF16", "1");
1006 Builder.defineMacro("__ARM_FEATURE_BF16_VECTOR_ARITHMETIC", "1");
1007 Builder.defineMacro("__ARM_BF16_FORMAT_ALTERNATIVE", "1");
1008 }
1009
1010 if (Opts.BranchTargetEnforcement)
1011 Builder.defineMacro("__ARM_FEATURE_BTI_DEFAULT", "1");
1012
1013 if (Opts.hasSignReturnAddress()) {
1014 unsigned Value = 1;
1015 if (Opts.isSignReturnAddressScopeAll())
1016 Value |= 1 << 2;
1017 Builder.defineMacro("__ARM_FEATURE_PAC_DEFAULT", Twine(Value));
1018 }
1019
1020 switch (ArchKind) {
1021 default:
1022 break;
1023 case llvm::ARM::ArchKind::ARMV8_1A:
1024 getTargetDefinesARMV81A(Opts, Builder);
1025 break;
1026 case llvm::ARM::ArchKind::ARMV8_2A:
1027 getTargetDefinesARMV82A(Opts, Builder);
1028 break;
1029 case llvm::ARM::ArchKind::ARMV8_3A:
1030 case llvm::ARM::ArchKind::ARMV8_4A:
1031 case llvm::ARM::ArchKind::ARMV8_5A:
1032 case llvm::ARM::ArchKind::ARMV8_6A:
1033 case llvm::ARM::ArchKind::ARMV8_7A:
1034 case llvm::ARM::ArchKind::ARMV8_8A:
1035 case llvm::ARM::ArchKind::ARMV8_9A:
1036 case llvm::ARM::ArchKind::ARMV9A:
1037 case llvm::ARM::ArchKind::ARMV9_1A:
1038 case llvm::ARM::ArchKind::ARMV9_2A:
1039 case llvm::ARM::ArchKind::ARMV9_3A:
1040 case llvm::ARM::ArchKind::ARMV9_4A:
1041 case llvm::ARM::ArchKind::ARMV9_5A:
1042 case llvm::ARM::ArchKind::ARMV9_6A:
1043 case llvm::ARM::ArchKind::ARMV9_7A:
1044 getTargetDefinesARMV83A(Opts, Builder);
1045 break;
1046 }
1047}
1048
1050static constexpr int NumNeonBuiltins =
1052static constexpr int NumFp16Builtins =
1054static constexpr int NumMVEBuiltins =
1056static constexpr int NumCDEBuiltins =
1059static_assert(NumBuiltins ==
1062
1063namespace clang {
1064namespace NEON {
1065#define GET_NEON_BUILTIN_STR_TABLE
1066#include "clang/Basic/arm_neon.inc"
1067#undef GET_NEON_BUILTIN_STR_TABLE
1068
1069static constexpr std::array<Builtin::Info, NumNeonBuiltins> BuiltinInfos = {
1070#define GET_NEON_BUILTIN_INFOS
1071#include "clang/Basic/arm_neon.inc"
1072#undef GET_NEON_BUILTIN_INFOS
1073};
1074
1075namespace FP16 {
1076#define GET_NEON_BUILTIN_STR_TABLE
1077#include "clang/Basic/arm_fp16.inc"
1078#undef GET_NEON_BUILTIN_STR_TABLE
1079
1080static constexpr std::array<Builtin::Info, NumFp16Builtins> BuiltinInfos = {
1081#define GET_NEON_BUILTIN_INFOS
1082#include "clang/Basic/arm_fp16.inc"
1083#undef GET_NEON_BUILTIN_INFOS
1084};
1085} // namespace FP16
1086} // namespace NEON
1087} // namespace clang
1088
1089namespace {
1090namespace MVE {
1091#define GET_MVE_BUILTIN_STR_TABLE
1092#include "clang/Basic/arm_mve_builtins.inc"
1093#undef GET_MVE_BUILTIN_STR_TABLE
1094
1095static constexpr std::array<Builtin::Info, NumMVEBuiltins> BuiltinInfos = {
1096#define GET_MVE_BUILTIN_INFOS
1097#include "clang/Basic/arm_mve_builtins.inc"
1098#undef GET_MVE_BUILTIN_INFOS
1099};
1100} // namespace MVE
1101
1102namespace CDE {
1103#define GET_CDE_BUILTIN_STR_TABLE
1104#include "clang/Basic/arm_cde_builtins.inc"
1105#undef GET_CDE_BUILTIN_STR_TABLE
1106
1107static constexpr std::array<Builtin::Info, NumCDEBuiltins> BuiltinInfos = {
1108#define GET_CDE_BUILTIN_INFOS
1109#include "clang/Basic/arm_cde_builtins.inc"
1110#undef GET_CDE_BUILTIN_INFOS
1111};
1112} // namespace CDE
1113} // namespace
1114
1115static constexpr llvm::StringTable BuiltinStrings =
1117#define BUILTIN CLANG_BUILTIN_STR_TABLE
1118#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
1119#define TARGET_HEADER_BUILTIN CLANG_TARGET_HEADER_BUILTIN_STR_TABLE
1120#include "clang/Basic/BuiltinsARM.def"
1121 ; // namespace clang
1122
1124#define BUILTIN CLANG_BUILTIN_ENTRY
1125#define LANGBUILTIN CLANG_LANGBUILTIN_ENTRY
1126#define LIBBUILTIN CLANG_LIBBUILTIN_ENTRY
1127#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_ENTRY
1128#define TARGET_HEADER_BUILTIN CLANG_TARGET_HEADER_BUILTIN_ENTRY
1129#include "clang/Basic/BuiltinsARM.def"
1130});
1131
1132llvm::SmallVector<Builtin::InfosShard>
1134 return {
1135 {&NEON::BuiltinStrings, NEON::BuiltinInfos, "__builtin_neon_"},
1136 {&NEON::FP16::BuiltinStrings, NEON::FP16::BuiltinInfos,
1137 "__builtin_neon_"},
1138 {&MVE::BuiltinStrings, MVE::BuiltinInfos, "__builtin_arm_mve_"},
1139 {&CDE::BuiltinStrings, CDE::BuiltinInfos, "__builtin_arm_cde_"},
1141 };
1142}
1143
1144bool ARMTargetInfo::isCLZForZeroUndef() const { return false; }
1151
1152const char *const ARMTargetInfo::GCCRegNames[] = {
1153 // Integer registers
1154 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11",
1155 "r12", "sp", "lr", "pc",
1156
1157 // Float registers
1158 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "s9", "s10", "s11",
1159 "s12", "s13", "s14", "s15", "s16", "s17", "s18", "s19", "s20", "s21", "s22",
1160 "s23", "s24", "s25", "s26", "s27", "s28", "s29", "s30", "s31",
1161
1162 // Double registers
1163 "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10", "d11",
1164 "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21", "d22",
1165 "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31",
1166
1167 // Quad registers
1168 "q0", "q1", "q2", "q3", "q4", "q5", "q6", "q7", "q8", "q9", "q10", "q11",
1169 "q12", "q13", "q14", "q15"};
1170
1174
1175const TargetInfo::GCCRegAlias ARMTargetInfo::GCCRegAliases[] = {
1176 {{"a1"}, "r0"}, {{"a2"}, "r1"}, {{"a3"}, "r2"}, {{"a4"}, "r3"},
1177 {{"v1"}, "r4"}, {{"v2"}, "r5"}, {{"v3"}, "r6"}, {{"v4"}, "r7"},
1178 {{"v5"}, "r8"}, {{"v6", "rfp"}, "r9"}, {{"sl"}, "r10"}, {{"fp"}, "r11"},
1179 {{"ip"}, "r12"}, {{"r13"}, "sp"}, {{"r14"}, "lr"}, {{"r15"}, "pc"},
1180 // The S, D and Q registers overlap, but aren't really aliases; we
1181 // don't want to substitute one of these for a different-sized one.
1182};
1183
1187
1189 const char *&Name, TargetInfo::ConstraintInfo &Info) const {
1190 switch (*Name) {
1191 default:
1192 break;
1193 case 'l': // r0-r7 if thumb, r0-r15 if ARM
1194 Info.setAllowsRegister();
1195 return true;
1196 case 'h': // r8-r15, thumb only
1197 if (isThumb()) {
1198 Info.setAllowsRegister();
1199 return true;
1200 }
1201 break;
1202 case 's': // An integer constant, but allowing only relocatable values.
1203 return true;
1204 case 't': // s0-s31, d0-d31, or q0-q15
1205 case 'w': // s0-s15, d0-d7, or q0-q3
1206 case 'x': // s0-s31, d0-d15, or q0-q7
1207 if (FPRegsDisabled)
1208 return false;
1209 Info.setAllowsRegister();
1210 return true;
1211 case 'j': // An immediate integer between 0 and 65535 (valid for MOVW)
1212 // only available in ARMv6T2 and above
1213 if (CPUAttr == "6T2" || ArchVersion >= 7) {
1214 Info.setRequiresImmediate(0, 65535);
1215 return true;
1216 }
1217 break;
1218 case 'I':
1219 if (isThumb()) {
1220 if (!supportsThumb2())
1221 Info.setRequiresImmediate(0, 255);
1222 else
1223 // FIXME: should check if immediate value would be valid for a Thumb2
1224 // data-processing instruction
1225 Info.setRequiresImmediate();
1226 } else
1227 // FIXME: should check if immediate value would be valid for an ARM
1228 // data-processing instruction
1229 Info.setRequiresImmediate();
1230 return true;
1231 case 'J':
1232 if (isThumb() && !supportsThumb2())
1233 Info.setRequiresImmediate(-255, -1);
1234 else
1235 Info.setRequiresImmediate(-4095, 4095);
1236 return true;
1237 case 'K':
1238 if (isThumb()) {
1239 if (!supportsThumb2())
1240 // FIXME: should check if immediate value can be obtained from shifting
1241 // a value between 0 and 255 left by any amount
1242 Info.setRequiresImmediate();
1243 else
1244 // FIXME: should check if immediate value would be valid for a Thumb2
1245 // data-processing instruction when inverted
1246 Info.setRequiresImmediate();
1247 } else
1248 // FIXME: should check if immediate value would be valid for an ARM
1249 // data-processing instruction when inverted
1250 Info.setRequiresImmediate();
1251 return true;
1252 case 'L':
1253 if (isThumb()) {
1254 if (!supportsThumb2())
1255 Info.setRequiresImmediate(-7, 7);
1256 else
1257 // FIXME: should check if immediate value would be valid for a Thumb2
1258 // data-processing instruction when negated
1259 Info.setRequiresImmediate();
1260 } else
1261 // FIXME: should check if immediate value would be valid for an ARM
1262 // data-processing instruction when negated
1263 Info.setRequiresImmediate();
1264 return true;
1265 case 'M':
1266 if (isThumb() && !supportsThumb2())
1267 // FIXME: should check if immediate value is a multiple of 4 between 0 and
1268 // 1020
1269 Info.setRequiresImmediate();
1270 else
1271 // FIXME: should check if immediate value is a power of two or a integer
1272 // between 0 and 32
1273 Info.setRequiresImmediate();
1274 return true;
1275 case 'N':
1276 // Thumb1 only
1277 if (isThumb() && !supportsThumb2()) {
1278 Info.setRequiresImmediate(0, 31);
1279 return true;
1280 }
1281 break;
1282 case 'O':
1283 // Thumb1 only
1284 if (isThumb() && !supportsThumb2()) {
1285 // FIXME: should check if immediate value is a multiple of 4 between -508
1286 // and 508
1287 Info.setRequiresImmediate();
1288 return true;
1289 }
1290 break;
1291 case 'Q': // A memory address that is a single base register.
1292 Info.setAllowsMemory();
1293 return true;
1294 case 'T':
1295 switch (Name[1]) {
1296 default:
1297 break;
1298 case 'e': // Even general-purpose register
1299 case 'o': // Odd general-purpose register
1300 Info.setAllowsRegister();
1301 Name++;
1302 return true;
1303 }
1304 break;
1305 case 'U': // a memory reference...
1306 switch (Name[1]) {
1307 case 'q': // ...ARMV4 ldrsb
1308 case 'v': // ...VFP load/store (reg+constant offset)
1309 case 'y': // ...iWMMXt load/store
1310 case 't': // address valid for load/store opaque types wider
1311 // than 128-bits
1312 case 'n': // valid address for Neon doubleword vector load/store
1313 case 'm': // valid address for Neon element and structure load/store
1314 case 's': // valid address for non-offset loads/stores of quad-word
1315 // values in four ARM registers
1316 Info.setAllowsMemory();
1317 Name++;
1318 return true;
1319 }
1320 break;
1321 }
1322 return false;
1323}
1324
1325std::string ARMTargetInfo::convertConstraint(const char *&Constraint) const {
1326 std::string R;
1327 switch (*Constraint) {
1328 case 'U': // Two-character constraint; add "^" hint for later parsing.
1329 case 'T':
1330 R = std::string("^") + std::string(Constraint, 2);
1331 Constraint++;
1332 break;
1333 case 'p': // 'p' should be translated to 'r' by default.
1334 R = std::string("r");
1335 break;
1336 default:
1337 return std::string(1, *Constraint);
1338 }
1339 return R;
1340}
1341
1343 StringRef Constraint, char Modifier, unsigned Size,
1344 std::string &SuggestedModifier) const {
1345 bool isOutput = (Constraint[0] == '=');
1346 bool isInOut = (Constraint[0] == '+');
1347
1348 // Strip off constraint modifiers.
1349 Constraint = Constraint.ltrim("=+&");
1350
1351 switch (Constraint[0]) {
1352 default:
1353 break;
1354 case 'r': {
1355 switch (Modifier) {
1356 default:
1357 return (isInOut || isOutput || Size <= 64);
1358 case 'q':
1359 // A register of size 32 cannot fit a vector type.
1360 return false;
1361 }
1362 }
1363 }
1364
1365 return true;
1366}
1367std::string_view ARMTargetInfo::getClobbers() const {
1368 // FIXME: Is this really right?
1369 return "";
1370}
1371
1374 switch (CC) {
1375 case CC_AAPCS:
1376 case CC_AAPCS_VFP:
1377 case CC_Swift:
1378 case CC_SwiftAsync:
1379 case CC_DeviceKernel:
1380 return CCCR_OK;
1381 default:
1382 return CCCR_Warning;
1383 }
1384}
1385
1387 if (RegNo == 0)
1388 return 0;
1389 if (RegNo == 1)
1390 return 1;
1391 return -1;
1392}
1393
1394bool ARMTargetInfo::hasSjLjLowering() const { return true; }
1395
1396ARMleTargetInfo::ARMleTargetInfo(const llvm::Triple &Triple,
1397 const TargetOptions &Opts)
1398 : ARMTargetInfo(Triple, Opts) {}
1399
1401 MacroBuilder &Builder) const {
1402 Builder.defineMacro("__ARMEL__");
1403 ARMTargetInfo::getTargetDefines(Opts, Builder);
1404}
1405
1406ARMbeTargetInfo::ARMbeTargetInfo(const llvm::Triple &Triple,
1407 const TargetOptions &Opts)
1408 : ARMTargetInfo(Triple, Opts) {}
1409
1411 MacroBuilder &Builder) const {
1412 Builder.defineMacro("__ARMEB__");
1413 Builder.defineMacro("__ARM_BIG_ENDIAN");
1414 ARMTargetInfo::getTargetDefines(Opts, Builder);
1415}
1416
1418 const TargetOptions &Opts)
1419 : WindowsTargetInfo<ARMleTargetInfo>(Triple, Opts), Triple(Triple) {
1420}
1421
1423 MacroBuilder &Builder) const {
1424 // FIXME: this is invalid for WindowsCE
1425 Builder.defineMacro("_M_ARM_NT", "1");
1426 Builder.defineMacro("_M_ARMT", "_M_ARM");
1427 Builder.defineMacro("_M_THUMB", "_M_ARM");
1428
1429 assert((Triple.getArch() == llvm::Triple::arm ||
1430 Triple.getArch() == llvm::Triple::thumb) &&
1431 "invalid architecture for Windows ARM target info");
1432 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
1433 Builder.defineMacro("_M_ARM", Triple.getArchName().substr(Offset));
1434
1435 // TODO map the complete set of values
1436 // 31: VFPv3 40: VFPv4
1437 Builder.defineMacro("_M_ARM_FP", "31");
1438}
1439
1444
1447 switch (CC) {
1448 case CC_X86StdCall:
1449 case CC_X86ThisCall:
1450 case CC_X86FastCall:
1451 case CC_X86VectorCall:
1452 return CCCR_Ignore;
1453 case CC_C:
1454 case CC_DeviceKernel:
1455 case CC_PreserveMost:
1456 case CC_PreserveAll:
1457 case CC_Swift:
1458 case CC_SwiftAsync:
1459 return CCCR_OK;
1460 default:
1461 return CCCR_Warning;
1462 }
1463}
1464
1465// Windows ARM + Itanium C++ ABI Target
1467 const llvm::Triple &Triple, const TargetOptions &Opts)
1468 : WindowsARMTargetInfo(Triple, Opts) {
1469 TheCXXABI.set(TargetCXXABI::GenericARM);
1470}
1471
1473 const LangOptions &Opts, MacroBuilder &Builder) const {
1475
1476 if (Opts.MSVCCompat)
1478}
1479
1480// Windows ARM, MS (C++) ABI
1482 const TargetOptions &Opts)
1483 : WindowsARMTargetInfo(Triple, Opts) {
1484 TheCXXABI.set(TargetCXXABI::Microsoft);
1485}
1486
1492
1494 const TargetOptions &Opts)
1495 : WindowsARMTargetInfo(Triple, Opts) {
1496 TheCXXABI.set(TargetCXXABI::GenericARM);
1497}
1498
1500 MacroBuilder &Builder) const {
1502 Builder.defineMacro("_ARM_");
1503}
1504
1506 const TargetOptions &Opts)
1507 : ARMleTargetInfo(Triple, Opts) {
1509 TLSSupported = false;
1512}
1513
1515 MacroBuilder &Builder) const {
1516 ARMleTargetInfo::getTargetDefines(Opts, Builder);
1517 Builder.defineMacro("_ARM_");
1518 Builder.defineMacro("__CYGWIN__");
1519 Builder.defineMacro("__CYGWIN32__");
1520 DefineStd(Builder, "unix", Opts);
1521 if (Opts.CPlusPlus)
1522 Builder.defineMacro("_GNU_SOURCE");
1523}
1524
1526 const TargetOptions &Opts)
1527 : AppleMachOTargetInfo<ARMleTargetInfo>(Triple, Opts) {}
1528
1530 const llvm::Triple &Triple,
1531 MacroBuilder &Builder) const {
1532 getAppleMachODefines(Builder, Opts, Triple);
1533}
1534
1536 const TargetOptions &Opts)
1537 : DarwinTargetInfo<ARMleTargetInfo>(Triple, Opts) {
1538 HasAlignMac68kSupport = true;
1539 if (Triple.isWatchABI()) {
1540 // Darwin on iOS uses a variant of the ARM C++ ABI.
1541 TheCXXABI.set(TargetCXXABI::WatchOS);
1542
1543 // BOOL should be a real boolean on the new ABI
1544 UseSignedCharForObjCBool = false;
1545 } else
1546 TheCXXABI.set(TargetCXXABI::iOS);
1547}
1548
1550 const llvm::Triple &Triple,
1551 MacroBuilder &Builder) const {
1552 getDarwinDefines(Builder, Opts, Triple, PlatformName, PlatformMinVersion);
1553}
Defines the Diagnostic-related interfaces.
static constexpr int NumFp16Builtins
Definition AArch64.cpp:30
static constexpr int NumNeonBuiltins
Definition AArch64.cpp:28
static constexpr llvm::StringTable BuiltinStrings
Definition AMDGPU.cpp:91
static constexpr int NumARMBuiltins
Definition ARM.cpp:1058
static constexpr int NumMVEBuiltins
Definition ARM.cpp:1054
static constexpr int NumCDEBuiltins
Definition ARM.cpp:1056
static constexpr Builtin::Info BuiltinInfos[]
Definition Builtins.cpp:38
static constexpr unsigned NumBuiltins
Definition Builtins.cpp:32
Defines enum values for all the target-independent builtin functions.
#define CLANG_BUILTIN_STR_TABLE_START
Definition Builtins.h:165
Enumerates target-specific builtins in their own namespaces within namespace clang.
Concrete class used by the front-end to report problems and issues.
Definition Diagnostic.h:232
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
@ NonLeaf
Sign the return address of functions that spill LR.
@ All
Sign the return address of all functions,.
@ AKey
Return address signing uses APIA key.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
bool hasSignReturnAddress() const
Check if return address signing is enabled.
bool isSignReturnAddressScopeAll() const
Check if leaf functions are also signed.
LangOptions::SignReturnAddressScopeKind SignReturnAddr
LangOptions::SignReturnAddressKeyKind SignKey
TargetInfo(const llvm::Triple &T)
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
BuiltinVaListKind
The different kinds of __builtin_va_list types defined by the target implementation.
Definition TargetInfo.h:333
@ AAPCSABIBuiltinVaList
__builtin_va_list as defined by ARM AAPCS ABI http://infocenter.arm.com
Definition TargetInfo.h:356
@ CharPtrBuiltinVaList
typedef char* __builtin_va_list;
Definition TargetInfo.h:335
@ VoidPtrBuiltinVaList
typedef void* __builtin_va_list;
Definition TargetInfo.h:338
@ ARM_LDREX_W
half (16-bit)
@ ARM_LDREX_H
byte (8-bit)
@ ARM_LDREX_D
word (32-bit)
VersionTuple PlatformMinVersion
Definition TargetInfo.h:262
virtual void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const =0
===-— Other target property query methods -----------------------—===//
unsigned HasUnalignedAccess
Definition TargetInfo.h:284
unsigned char MaxAtomicPromoteWidth
Definition TargetInfo.h:252
uint32_t getARMCDECoprocMask() const
For ARM targets returns a mask defining which coprocessors are configured as Custom Datapath.
StringRef PlatformName
Definition TargetInfo.h:261
void resetDataLayout()
Set the data layout based on current triple and ABI.
unsigned HasAlignMac68kSupport
Definition TargetInfo.h:265
virtual bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeatureVec) const
Initialize the map with the default set of target features for the CPU this should include all legal ...
unsigned char MaxAtomicInlineWidth
Definition TargetInfo.h:252
TargetCXXABI TheCXXABI
Definition TargetInfo.h:257
unsigned ARMCDECoprocMask
Definition TargetInfo.h:286
Options for controlling the target.
std::string_view getClobbers() const override
Returns a string of target-specific clobbers, in LLVM format.
Definition ARM.cpp:1367
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
Definition ARM.cpp:691
llvm::SmallVector< Builtin::InfosShard > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
Definition ARM.cpp:1133
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Determines whether a given calling convention is valid for the target.
Definition ARM.cpp:1373
void getTargetDefinesARMV83A(const LangOptions &Opts, MacroBuilder &Builder) const
Definition ARM.cpp:684
bool isValidCPUName(StringRef Name) const override
Determine whether this TargetInfo supports the given CPU name.
Definition ARM.cpp:641
BuiltinVaListKind getBuiltinVaListKind() const override
Returns the kind of __builtin_va_list type that should be used with this target.
Definition ARM.cpp:1145
bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeaturesVec) const override
Initialize the map with the default set of target features for the CPU this should include all legal ...
Definition ARM.cpp:401
bool handleTargetFeatures(std::vector< std::string > &Features, DiagnosticsEngine &Diags) override
Perform initialization based on the user configured set of features (e.g., +sse4).
Definition ARM.cpp:474
bool setABI(const std::string &Name) override
Use the specified ABI.
Definition ARM.cpp:337
StringRef getABI() const override
Get the ABI currently in use.
Definition ARM.cpp:335
bool setCPU(const std::string &Name) override
Target the specified CPU.
Definition ARM.cpp:650
bool hasFeature(StringRef Feature) const override
Determine whether the given target has the given feature.
Definition ARM.cpp:622
bool validateBranchProtection(StringRef Spec, StringRef Arch, BranchProtectionInfo &BPI, const LangOptions &LO, StringRef &Err) const override
Determine if this TargetInfo supports the given branch protection specification.
Definition ARM.cpp:373
void getTargetDefinesARMV81A(const LangOptions &Opts, MacroBuilder &Builder) const
Definition ARM.cpp:673
bool validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size, std::string &SuggestedModifier) const override
Definition ARM.cpp:1342
ArrayRef< const char * > getGCCRegNames() const override
Definition ARM.cpp:1171
bool setFPMath(StringRef Name) override
Use the specified unit for FP math.
Definition ARM.cpp:661
std::string convertConstraint(const char *&Constraint) const override
Definition ARM.cpp:1325
bool validateAsmConstraint(const char *&Name, TargetInfo::ConstraintInfo &Info) const override
Definition ARM.cpp:1188
void getTargetDefinesARMV82A(const LangOptions &Opts, MacroBuilder &Builder) const
Definition ARM.cpp:678
ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition ARM.cpp:223
bool hasSjLjLowering() const override
Controls if __builtin_longjmp / __builtin_setjmp can be lowered to llvm.eh.sjlj.longjmp / llvm....
Definition ARM.cpp:1394
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
Definition ARM.cpp:646
int getEHDataRegisterNumber(unsigned RegNo) const override
Return the register number that __builtin_eh_return_regno would return with the specified argument.
Definition ARM.cpp:1386
bool hasBFloat16Type() const override
Determine whether the _BFloat16 type is supported on this target.
Definition ARM.cpp:636
bool isCLZForZeroUndef() const override
The __builtin_clz* and __builtin_ctz* built-in functions are specified to have undefined results for ...
Definition ARM.cpp:1144
ArrayRef< TargetInfo::GCCRegAlias > getGCCRegAliases() const override
Definition ARM.cpp:1184
bool isBranchProtectionSupportedArch(StringRef Arch) const override
Determine if the Architecture in this TargetInfo supports branch protection.
Definition ARM.cpp:355
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
Definition ARM.cpp:1410
ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition ARM.cpp:1406
ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition ARM.cpp:1396
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
Definition ARM.cpp:1400
AppleMachOARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition ARM.cpp:1525
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition ARM.cpp:1529
AppleMachOTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:54
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
Definition ARM.cpp:1514
CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition ARM.cpp:1505
DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition ARM.cpp:1535
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
Definition ARM.cpp:1549
DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:78
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
Definition ARM.cpp:1472
ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition ARM.cpp:1466
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
Definition ARM.cpp:1487
MicrosoftARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition ARM.cpp:1481
MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition ARM.cpp:1493
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
Definition ARM.cpp:1499
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Determines whether a given calling convention is valid for the target.
Definition ARM.cpp:1446
BuiltinVaListKind getBuiltinVaListKind() const override
Returns the kind of __builtin_va_list type that should be used with this target.
Definition ARM.cpp:1441
void getVisualStudioDefines(const LangOptions &Opts, MacroBuilder &Builder) const
Definition ARM.cpp:1422
WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition ARM.cpp:1417
WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
Definition OSTargets.h:882
Definition ARM.cpp:1102
Definition ARM.cpp:1090
static constexpr std::array< Info, N > MakeInfos(std::array< Info, N > Infos)
A constexpr function to construct an infos array from X-macros.
Definition Builtins.h:114
static constexpr std::array< Builtin::Info, NumFp16Builtins > BuiltinInfos
Definition AArch64.cpp:62
static constexpr std::array< Builtin::Info, NumNeonBuiltins > BuiltinInfos
Definition AArch64.cpp:51
void getAppleMachODefines(MacroBuilder &Builder, const LangOptions &Opts, const llvm::Triple &Triple)
Definition OSTargets.cpp:23
LLVM_LIBRARY_VISIBILITY void DefineStd(clang::MacroBuilder &Builder, llvm::StringRef MacroName, const clang::LangOptions &Opts)
Define a macro name and standard variants.
void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts, const llvm::Triple &Triple, StringRef &PlatformName, VersionTuple &PlatformMinVersion)
Definition OSTargets.cpp:57
The JSON file list parser is used to communicate input to InstallAPI.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
const FunctionProtoType * T
CallingConv
CallingConv - Specifies the calling convention that a function uses.
Definition Specifiers.h:278
@ CC_Swift
Definition Specifiers.h:293
@ CC_PreserveMost
Definition Specifiers.h:295
@ CC_X86ThisCall
Definition Specifiers.h:282
@ CC_DeviceKernel
Definition Specifiers.h:292
@ CC_AAPCS
Definition Specifiers.h:288
@ CC_SwiftAsync
Definition Specifiers.h:294
@ CC_X86VectorCall
Definition Specifiers.h:283
@ CC_X86StdCall
Definition Specifiers.h:280
@ CC_PreserveAll
Definition Specifiers.h:296
@ CC_X86FastCall
Definition Specifiers.h:281
@ CC_AAPCS_VFP
Definition Specifiers.h:289
#define true
Definition stdbool.h:25
void setRequiresImmediate(int Min, int Max)
unsigned ZeroLengthBitfieldBoundary
If non-zero, specifies a fixed alignment value for bitfields that follow zero length bitfield,...
Definition TargetInfo.h:200
unsigned UseBitFieldTypeAlignment
Control whether the alignment of bit-field types is respected when laying out structures.
Definition TargetInfo.h:178
const llvm::fltSemantics * BFloat16Format
Definition TargetInfo.h:142