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