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