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