17#include "llvm/ADT/StringExtras.h"
18#include "llvm/ADT/StringRef.h"
19#include "llvm/ADT/StringSwitch.h"
20#include "llvm/TargetParser/ARMTargetParser.h"
25void ARMTargetInfo::setABIAAPCS() {
34 bool IsNetBSD =
T.isOSNetBSD();
35 bool IsOpenBSD =
T.isOSOpenBSD();
36 if (!
T.isOSWindows() && !IsNetBSD && !IsOpenBSD)
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",
50 }
else if (
T.isOSWindows()) {
51 assert(!
BigEndian &&
"Windows on ARM does not support big endian");
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");
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");
73void ARMTargetInfo::setABIAPCS(
bool IsAAPCS16) {
96 if (
T.isOSBinFormatMachO() && IsAAPCS16) {
97 assert(!
BigEndian &&
"AAPCS16 does not support big-endian");
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",
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");
114void ARMTargetInfo::setArchInfo() {
115 StringRef ArchName =
getTriple().getArchName();
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)
122 setArchInfo(ArchKind);
125void ARMTargetInfo::setArchInfo(llvm::ARM::ArchKind Kind) {
130 SubArch = llvm::ARM::getSubArch(ArchKind);
131 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
132 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
135 CPUAttr = getCPUAttr();
136 CPUProfile = getCPUProfile();
139void ARMTargetInfo::setAtomic() {
142 bool ShouldUseInlineAtomic =
143 (ArchISA == llvm::ARM::ISAKind::ARM && ArchVersion >= 6) ||
144 (ArchISA == llvm::ARM::ISAKind::THUMB && ArchVersion >= 7);
146 if (ArchProfile == llvm::ARM::ProfileKind::M) {
148 if (ShouldUseInlineAtomic)
152 if (ShouldUseInlineAtomic)
157bool ARMTargetInfo::hasMVE()
const {
158 return ArchKind == llvm::ARM::ArchKind::ARMV8_1MMainline && MVE != 0;
161bool ARMTargetInfo::hasMVEFloat()
const {
162 return hasMVE() && (MVE & MVE_FP);
167bool ARMTargetInfo::isThumb()
const {
168 return ArchISA == llvm::ARM::ISAKind::THUMB;
171bool ARMTargetInfo::supportsThumb()
const {
172 return CPUAttr.count(
'T') || ArchVersion >= 6;
175bool ARMTargetInfo::supportsThumb2()
const {
176 return CPUAttr ==
"6T2" || (ArchVersion >= 7 && CPUAttr !=
"8M_BASE");
179StringRef ARMTargetInfo::getCPUAttr()
const {
184 return llvm::ARM::getCPUAttr(ArchKind);
185 case llvm::ARM::ArchKind::ARMV6M:
187 case llvm::ARM::ArchKind::ARMV7S:
189 case llvm::ARM::ArchKind::ARMV7A:
191 case llvm::ARM::ArchKind::ARMV7R:
193 case llvm::ARM::ArchKind::ARMV7M:
195 case llvm::ARM::ArchKind::ARMV7EM:
197 case llvm::ARM::ArchKind::ARMV7VE:
199 case llvm::ARM::ArchKind::ARMV8A:
201 case llvm::ARM::ArchKind::ARMV8_1A:
203 case llvm::ARM::ArchKind::ARMV8_2A:
205 case llvm::ARM::ArchKind::ARMV8_3A:
207 case llvm::ARM::ArchKind::ARMV8_4A:
209 case llvm::ARM::ArchKind::ARMV8_5A:
211 case llvm::ARM::ArchKind::ARMV8_6A:
213 case llvm::ARM::ArchKind::ARMV8_7A:
215 case llvm::ARM::ArchKind::ARMV8_8A:
217 case llvm::ARM::ArchKind::ARMV8_9A:
219 case llvm::ARM::ArchKind::ARMV9A:
221 case llvm::ARM::ArchKind::ARMV9_1A:
223 case llvm::ARM::ArchKind::ARMV9_2A:
225 case llvm::ARM::ArchKind::ARMV9_3A:
227 case llvm::ARM::ArchKind::ARMV9_4A:
229 case llvm::ARM::ArchKind::ARMV9_5A:
231 case llvm::ARM::ArchKind::ARMV9_6A:
233 case llvm::ARM::ArchKind::ARMV8MBaseline:
235 case llvm::ARM::ArchKind::ARMV8MMainline:
237 case llvm::ARM::ArchKind::ARMV8R:
239 case llvm::ARM::ArchKind::ARMV8_1MMainline:
244StringRef ARMTargetInfo::getCPUProfile()
const {
245 switch (ArchProfile) {
246 case llvm::ARM::ProfileKind::A:
248 case llvm::ARM::ProfileKind::R:
250 case llvm::ARM::ProfileKind::M:
259 :
TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(
true), LDREX(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();
271 (Triple.isOSDarwin() || Triple.isOSBinFormatMachO() || IsOpenBSD ||
276 SizeType = (Triple.isOSDarwin() || Triple.isOSBinFormatMachO() || IsOpenBSD ||
282 if ((Triple.isOSDarwin() || Triple.isOSBinFormatMachO()) &&
283 !Triple.isWatchABI())
296 if (Triple.isOSBinFormatMachO()) {
299 if (Triple.getEnvironment() == llvm::Triple::EABI ||
300 Triple.getOS() == llvm::Triple::UnknownOS ||
301 ArchProfile == llvm::ARM::ProfileKind::M) {
303 }
else if (Triple.isWatchABI()) {
308 }
else if (Triple.isOSWindows()) {
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:
324 case llvm::Triple::EABIHF:
325 case llvm::Triple::EABI:
328 case llvm::Triple::GNU:
334 else if (IsFreeBSD || IsOpenBSD || IsHaiku || IsOHOS)
350 if (IsAAPCS && !Triple.isAndroid())
359 if (Triple.getOS() == llvm::Triple::Linux ||
360 Triple.getOS() == llvm::Triple::UnknownOS)
362 ?
"llvm.arm.gnu.eabi.mcount"
377 if (Name ==
"apcs-gnu" || Name ==
"aapcs16") {
378 setABIAPCS(Name ==
"aapcs16");
381 if (Name ==
"aapcs" || Name ==
"aapcs-vfp" || Name ==
"aapcs-linux") {
389 llvm::ARM::ArchKind CPUArch = llvm::ARM::parseCPUArch(Arch);
390 if (CPUArch == llvm::ARM::ArchKind::INVALID)
391 CPUArch = llvm::ARM::parseArch(
getTriple().getArchName());
393 if (CPUArch == llvm::ARM::ArchKind::INVALID)
396 StringRef ArchFeature = llvm::ARM::getArchName(CPUArch);
398 llvm::Triple(ArchFeature,
getTriple().getVendorName(),
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);
408 StringRef &Err)
const {
409 llvm::ARM::ParsedBranchProtection PBP;
410 if (!llvm::ARM::parseBranchProtection(Spec, PBP, Err))
417 llvm::StringSwitch<LangOptions::SignReturnAddressScopeKind>(PBP.Scope)
423 if (PBP.Key ==
"b_key")
435 const std::vector<std::string> &FeaturesVec)
const {
437 std::string ArchFeature;
438 std::vector<StringRef> TargetFeatures;
439 llvm::ARM::ArchKind Arch = llvm::ARM::parseArch(
getTriple().getArchName());
443 llvm::ARM::ArchKind CPUArch = llvm::ARM::parseCPUArch(CPU);
444 if (CPUArch == llvm::ARM::ArchKind::INVALID)
446 if (CPUArch != llvm::ARM::ArchKind::INVALID) {
447 ArchFeature = (
"+" + llvm::ARM::getArchName(CPUArch)).str();
448 TargetFeatures.push_back(ArchFeature);
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;
461 Features[llvm::ARM::getSubArch(I)] =
true;
465 llvm::ARM::FPUKind FPUKind = llvm::ARM::getDefaultFPU(CPU, Arch);
466 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
469 uint64_t Extensions = llvm::ARM::getDefaultExtensions(CPU, Arch);
470 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
472 for (
auto Feature : TargetFeatures)
473 if (Feature[0] ==
'+')
474 Features[Feature.drop_front(1)] =
true;
479 Features[
"thumb-mode"] =
true;
481 Features[
"thumb-mode"] =
false;
485 std::vector<std::string> UpdatedFeaturesVec;
486 for (
const auto &Feature : FeaturesVec) {
489 if (Feature ==
"+soft-float-abi")
492 StringRef FixedFeature;
493 if (Feature ==
"+arm")
494 FixedFeature =
"-thumb-mode";
495 else if (Feature ==
"+thumb")
496 FixedFeature =
"+thumb-mode";
498 FixedFeature = Feature;
499 UpdatedFeaturesVec.push_back(FixedFeature.str());
527 FPRegsDisabled =
false;
531 for (
const auto &Feature : Features) {
532 if (Feature ==
"+soft-float") {
534 }
else if (Feature ==
"+vfp2sp" || Feature ==
"+vfp2") {
537 if (Feature ==
"+vfp2")
539 }
else if (Feature ==
"+vfp3sp" || Feature ==
"+vfp3d16sp" ||
540 Feature ==
"+vfp3" || Feature ==
"+vfp3d16") {
543 if (Feature ==
"+vfp3" || Feature ==
"+vfp3d16")
545 }
else if (Feature ==
"+vfp4sp" || Feature ==
"+vfp4d16sp" ||
546 Feature ==
"+vfp4" || Feature ==
"+vfp4d16") {
548 HW_FP |= HW_FP_SP | HW_FP_HP;
549 if (Feature ==
"+vfp4" || Feature ==
"+vfp4d16")
551 }
else if (Feature ==
"+fp-armv8sp" || Feature ==
"+fp-armv8d16sp" ||
552 Feature ==
"+fp-armv8" || Feature ==
"+fp-armv8d16") {
554 HW_FP |= HW_FP_SP | HW_FP_HP;
555 if (Feature ==
"+fp-armv8" || Feature ==
"+fp-armv8d16")
557 }
else if (Feature ==
"+neon") {
560 }
else if (Feature ==
"+hwdiv") {
562 }
else if (Feature ==
"+hwdiv-arm") {
564 }
else if (Feature ==
"+crc") {
566 }
else if (Feature ==
"+crypto") {
568 }
else if (Feature ==
"+sha2") {
570 }
else if (Feature ==
"+aes") {
572 }
else if (Feature ==
"+dsp") {
574 }
else if (Feature ==
"+fp64") {
576 }
else if (Feature ==
"+8msecext") {
577 if (CPUProfile !=
"M" || ArchVersion != 8) {
578 Diags.
Report(diag::err_target_unsupported_mcmse) << CPU;
581 }
else if (Feature ==
"+strict-align") {
583 }
else if (Feature ==
"+fp16") {
585 }
else if (Feature ==
"+fullfp16") {
587 }
else if (Feature ==
"+dotprod") {
589 }
else if (Feature ==
"+mve") {
591 }
else if (Feature ==
"+mve.fp") {
594 MVE |= MVE_INT | MVE_FP;
595 HW_FP |= HW_FP_SP | HW_FP_HP;
596 }
else if (Feature ==
"+i8mm") {
598 }
else if (Feature.size() == strlen(
"+cdecp0") && Feature >=
"+cdecp0" &&
599 Feature <=
"+cdecp7") {
600 unsigned Coproc = Feature.back() -
'0';
602 }
else if (Feature ==
"+bf16") {
604 }
else if (Feature ==
"-fpregs") {
605 FPRegsDisabled =
true;
606 }
else if (Feature ==
"+pacbti") {
609 }
else if (Feature ==
"+fullbf16") {
616 switch (ArchVersion) {
618 if (ArchProfile == llvm::ARM::ProfileKind::M)
620 else if (ArchKind == llvm::ARM::ArchKind::ARMV6K ||
621 ArchKind == llvm::ARM::ArchKind::ARMV6KZ)
622 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B;
627 if (ArchProfile == llvm::ARM::ProfileKind::M)
628 LDREX = LDREX_W | LDREX_H | LDREX_B;
630 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B;
634 LDREX = LDREX_D | LDREX_W | LDREX_H | LDREX_B;
637 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
638 Diags.
Report(diag::err_target_unsupported_fpmath) <<
"neon";
642 if (FPMath == FP_Neon)
643 Features.push_back(
"+neonfp");
644 else if (FPMath == FP_VFP)
645 Features.push_back(
"-neonfp");
651 return llvm::StringSwitch<bool>(Feature)
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())
670 return Name ==
"generic" ||
671 llvm::ARM::parseCPUArch(Name) != llvm::ARM::ArchKind::INVALID;
675 llvm::ARM::fillValidCPUArchList(Values);
679 if (Name !=
"generic")
680 setArchInfo(llvm::ARM::parseCPUArch(Name));
682 if (ArchKind == llvm::ARM::ArchKind::INVALID)
690 if (Name ==
"neon") {
693 }
else if (Name ==
"vfp" || Name ==
"vfp2" || Name ==
"vfp3" ||
703 Builder.defineMacro(
"__ARM_FEATURE_QRDMX",
"1");
715 Builder.defineMacro(
"__ARM_FEATURE_COMPLEX",
"1");
722 Builder.defineMacro(
"__arm");
723 Builder.defineMacro(
"__arm__");
725 if (
getTriple().getOS() == llvm::Triple::UnknownOS &&
726 (
getTriple().getEnvironment() == llvm::Triple::EABI ||
727 getTriple().getEnvironment() == llvm::Triple::EABIHF) &&
729 Builder.defineMacro(
"_GNU_SOURCE");
733 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
738 Builder.defineMacro(
"__ARM_ARCH_7K__",
"2");
740 if (!CPUAttr.empty())
741 Builder.defineMacro(
"__ARM_ARCH_" + CPUAttr +
"__");
745 Builder.defineMacro(
"__ARM_ARCH", Twine(ArchVersion));
747 if (ArchVersion >= 8) {
752 Builder.defineMacro(
"__ARM_FEATURE_CRYPTO",
"1");
754 Builder.defineMacro(
"__ARM_FEATURE_SHA2",
"1");
756 Builder.defineMacro(
"__ARM_FEATURE_AES",
"1");
759 Builder.defineMacro(
"__ARM_FEATURE_CRC32",
"1");
761 Builder.defineMacro(
"__ARM_FEATURE_NUMERIC_MAXMIN",
"1");
763 Builder.defineMacro(
"__ARM_FEATURE_DIRECTED_ROUNDING",
"1");
769 if (CPUProfile.empty() || ArchProfile != llvm::ARM::ProfileKind::M)
770 Builder.defineMacro(
"__ARM_ARCH_ISA_ARM",
"1");
776 if (supportsThumb2())
777 Builder.defineMacro(
"__ARM_ARCH_ISA_THUMB",
"2");
778 else if (supportsThumb())
779 Builder.defineMacro(
"__ARM_ARCH_ISA_THUMB",
"1");
783 Builder.defineMacro(
"__ARM_32BIT_STATE",
"1");
788 if (!CPUProfile.empty())
789 Builder.defineMacro(
"__ARM_ARCH_PROFILE",
"'" + CPUProfile +
"'");
793 Builder.defineMacro(
"__ARM_FEATURE_UNALIGNED",
"1");
797 Builder.defineMacro(
"__ARM_FEATURE_LDREX",
"0x" + Twine::utohexstr(LDREX));
800 if (ArchVersion == 5 || (ArchVersion == 6 && CPUProfile !=
"M") ||
802 Builder.defineMacro(
"__ARM_FEATURE_CLZ",
"1");
806 Builder.defineMacro(
"__ARM_FP",
"0x" + Twine::utohexstr(HW_FP));
809 Builder.defineMacro(
"__ARM_ACLE",
"200");
812 Builder.defineMacro(
"__ARM_FP16_FORMAT_IEEE",
"1");
813 Builder.defineMacro(
"__ARM_FP16_ARGS",
"1");
816 if (ArchVersion >= 7 && (FPU & VFP4FPU))
817 Builder.defineMacro(
"__ARM_FEATURE_FMA",
"1");
824 if (5 <= ArchVersion && ArchVersion <= 8 && !
getTriple().isOSWindows())
825 Builder.defineMacro(
"__THUMB_INTERWORK__");
827 if (ABI ==
"aapcs" || ABI ==
"aapcs-linux" || ABI ==
"aapcs-vfp") {
831 Builder.defineMacro(
"__ARM_EABI__");
832 Builder.defineMacro(
"__ARM_PCS",
"1");
835 if ((!SoftFloat && !SoftFloatABI) || ABI ==
"aapcs-vfp" || ABI ==
"aapcs16")
836 Builder.defineMacro(
"__ARM_PCS_VFP",
"1");
838 if (SoftFloat || (SoftFloatABI && !FPU))
839 Builder.defineMacro(
"__SOFTFP__");
843 Builder.defineMacro(
"__ARM_ROPI",
"1");
845 Builder.defineMacro(
"__ARM_RWPI",
"1");
848 uint64_t FeatureCoprocBF = 0;
852 case llvm::ARM::ArchKind::ARMV4:
853 case llvm::ARM::ArchKind::ARMV4T:
855 FeatureCoprocBF = isThumb() ? 0 : FEATURE_COPROC_B1;
857 case llvm::ARM::ArchKind::ARMV5T:
858 FeatureCoprocBF = isThumb() ? 0 : FEATURE_COPROC_B1 | FEATURE_COPROC_B2;
860 case llvm::ARM::ArchKind::ARMV5TE:
861 case llvm::ARM::ArchKind::ARMV5TEJ:
864 FEATURE_COPROC_B1 | FEATURE_COPROC_B2 | FEATURE_COPROC_B3;
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;
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;
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:
901 FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B3;
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;
909 Builder.defineMacro(
"__ARM_FEATURE_COPROC",
910 "0x" + Twine::utohexstr(FeatureCoprocBF));
912 if (ArchKind == llvm::ARM::ArchKind::XSCALE)
913 Builder.defineMacro(
"__XSCALE__");
916 Builder.defineMacro(
"__THUMBEL__");
917 Builder.defineMacro(
"__thumb__");
918 if (supportsThumb2())
919 Builder.defineMacro(
"__thumb2__");
923 if ((CPUProfile !=
"M" && ArchVersion >= 6) || (CPUProfile ==
"M" && DSP))
924 Builder.defineMacro(
"__ARM_FEATURE_SIMD32",
"1");
927 if (((HWDiv & HWDivThumb) && isThumb()) ||
928 ((HWDiv & HWDivARM) && !isThumb())) {
929 Builder.defineMacro(
"__ARM_FEATURE_IDIV",
"1");
930 Builder.defineMacro(
"__ARM_ARCH_EXT_IDIV__",
"1");
934 Builder.defineMacro(
"__APCS_32__");
939 Builder.defineMacro(
"__VFP_FP__");
941 if (FPUModeIsVFP((FPUMode)FPU)) {
943 Builder.defineMacro(
"__ARM_VFPV2__");
945 Builder.defineMacro(
"__ARM_VFPV3__");
947 Builder.defineMacro(
"__ARM_VFPV4__");
949 Builder.defineMacro(
"__ARM_FPV5__");
956 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
957 Builder.defineMacro(
"__ARM_NEON",
"1");
958 Builder.defineMacro(
"__ARM_NEON__");
961 Builder.defineMacro(
"__ARM_NEON_FP",
962 "0x" + Twine::utohexstr(HW_FP & ~HW_FP_DP));
966 Builder.defineMacro(
"__ARM_FEATURE_MVE", hasMVEFloat() ?
"3" :
"1");
970 Builder.defineMacro(
"__ARM_FEATURE_CDE",
"1");
971 Builder.defineMacro(
"__ARM_FEATURE_CDE_COPROC",
975 Builder.defineMacro(
"__ARM_SIZEOF_WCHAR_T",
976 Twine(Opts.WCharSize ? Opts.WCharSize : 4));
978 Builder.defineMacro(
"__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ?
"1" :
"4");
981 if (ArchVersion == 8 && ArchProfile == llvm::ARM::ProfileKind::M)
982 Builder.defineMacro(
"__ARM_FEATURE_CMSE", Opts.Cmse ?
"3" :
"1");
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");
993 Builder.defineMacro(
"__ARM_FEATURE_DSP",
"1");
998 if ((ArchVersion == 6 && CPUProfile !=
"M") || ArchVersion > 6) {
999 Builder.defineMacro(
"__ARM_FEATURE_SAT",
"1");
1005 Builder.defineMacro(
"__ARM_FEATURE_QBIT",
"1");
1007 if (Opts.UnsafeFPMath)
1008 Builder.defineMacro(
"__ARM_FP_FAST",
"1");
1012 Builder.defineMacro(
"__ARM_FEATURE_FP16_VECTOR_ARITHMETIC",
"1");
1016 Builder.defineMacro(
"__ARM_FEATURE_FP16_SCALAR_ARITHMETIC",
"1");
1020 Builder.defineMacro(
"__ARM_FEATURE_DOTPROD",
"1");
1023 Builder.defineMacro(
"__ARM_FEATURE_MATMUL_INT8",
"1");
1026 Builder.defineMacro(
"__ARM_FEATURE_PAUTH",
"1");
1029 Builder.defineMacro(
"__ARM_FEATURE_BTI",
"1");
1032 Builder.defineMacro(
"__ARM_FEATURE_BF16",
"1");
1033 Builder.defineMacro(
"__ARM_FEATURE_BF16_VECTOR_ARITHMETIC",
"1");
1034 Builder.defineMacro(
"__ARM_BF16_FORMAT_ALTERNATIVE",
"1");
1037 if (Opts.BranchTargetEnforcement)
1038 Builder.defineMacro(
"__ARM_FEATURE_BTI_DEFAULT",
"1");
1044 Builder.defineMacro(
"__ARM_FEATURE_PAC_DEFAULT", Twine(
Value));
1050 case llvm::ARM::ArchKind::ARMV8_1A:
1053 case llvm::ARM::ArchKind::ARMV8_2A:
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:
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"
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"
1110const char *
const ARMTargetInfo::GCCRegNames[] = {
1112 "r0",
"r1",
"r2",
"r3",
"r4",
"r5",
"r6",
"r7",
"r8",
"r9",
"r10",
"r11",
1113 "r12",
"sp",
"lr",
"pc",
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",
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",
1126 "q0",
"q1",
"q2",
"q3",
"q4",
"q5",
"q6",
"q7",
"q8",
"q9",
"q10",
"q11",
1127 "q12",
"q13",
"q14",
"q15"};
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"},
1171 if (CPUAttr ==
"6T2" || ArchVersion >= 7) {
1178 if (!supportsThumb2())
1190 if (isThumb() && !supportsThumb2())
1197 if (!supportsThumb2())
1212 if (!supportsThumb2())
1224 if (isThumb() && !supportsThumb2())
1235 if (isThumb() && !supportsThumb2()) {
1242 if (isThumb() && !supportsThumb2()) {
1285 switch (*Constraint) {
1288 R = std::string(
"^") + std::string(Constraint, 2);
1292 R = std::string(
"r");
1295 return std::string(1, *Constraint);
1301 StringRef Constraint,
char Modifier,
unsigned Size,
1302 std::string &SuggestedModifier)
const {
1303 bool isOutput = (Constraint[0] ==
'=');
1304 bool isInOut = (Constraint[0] ==
'+');
1307 Constraint = Constraint.ltrim(
"=+&");
1309 switch (Constraint[0]) {
1315 return (isInOut || isOutput || Size <= 64);
1360 Builder.defineMacro(
"__ARMEL__");
1370 Builder.defineMacro(
"__ARMEB__");
1371 Builder.defineMacro(
"__ARM_BIG_ENDIAN");
1383 Builder.defineMacro(
"_M_ARM_NT",
"1");
1384 Builder.defineMacro(
"_M_ARMT",
"_M_ARM");
1385 Builder.defineMacro(
"_M_THUMB",
"_M_ARM");
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));
1395 Builder.defineMacro(
"_M_ARM_FP",
"31");
1419 return CCCR_Warning;
1427 TheCXXABI.set(TargetCXXABI::GenericARM);
1434 if (Opts.MSVCCompat)
1442 TheCXXABI.set(TargetCXXABI::Microsoft);
1454 TheCXXABI.set(TargetCXXABI::GenericARM);
1460 Builder.defineMacro(
"_ARM_");
1469 resetDataLayout(
"e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64");
1475 Builder.defineMacro(
"_ARM_");
1476 Builder.defineMacro(
"__CYGWIN__");
1477 Builder.defineMacro(
"__CYGWIN32__");
1480 Builder.defineMacro(
"_GNU_SOURCE");
1488 const llvm::Triple &Triple,
1496 HasAlignMac68kSupport =
true;
1497 if (Triple.isWatchABI()) {
1499 TheCXXABI.set(TargetCXXABI::WatchOS);
1502 UseSignedCharForObjCBool =
false;
1504 TheCXXABI.set(TargetCXXABI::iOS);
1508 const llvm::Triple &Triple,
Defines the Diagnostic-related interfaces.
static constexpr Builtin::Info BuiltinInfo[]
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.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
@ None
No signing for any function.
@ NonLeaf
Sign the return address of functions that spill LR.
@ All
Sign the return address of all functions,.
@ AKey
Return address signing uses APIA key.
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
bool hasSignReturnAddress() const
Check if return address signing is enabled.
bool isSignReturnAddressScopeAll() const
Check if leaf functions are also signed.
LangOptions::SignReturnAddressScopeKind SignReturnAddr
LangOptions::SignReturnAddressKeyKind SignKey
bool BranchProtectionPAuthLR
bool BranchTargetEnforcement
Exposes information about the current target.
const llvm::Triple & getTriple() const
Returns the target triple of the primary target.
void resetDataLayout(StringRef DL, const char *UserLabelPrefix="")
BuiltinVaListKind
The different kinds of __builtin_va_list types defined by the target implementation.
@ AAPCSABIBuiltinVaList
__builtin_va_list as defined by ARM AAPCS ABI http://infocenter.arm.com
@ CharPtrBuiltinVaList
typedef char* __builtin_va_list;
@ VoidPtrBuiltinVaList
typedef void* __builtin_va_list;
unsigned HasUnalignedAccess
unsigned char MaxAtomicPromoteWidth
uint32_t getARMCDECoprocMask() const
For ARM targets returns a mask defining which coprocessors are configured as Custom Datapath.
virtual bool initFeatureMap(llvm::StringMap< bool > &Features, DiagnosticsEngine &Diags, StringRef CPU, const std::vector< std::string > &FeatureVec) const
Initialize the map with the default set of target features for the CPU this should include all legal ...
unsigned char MaxAtomicInlineWidth
unsigned ARMCDECoprocMask
Options for controlling the target.
llvm::EABI EABIVersion
The EABI version to use.
std::vector< std::string > FeaturesAsWritten
The list of target specific features to enable or disable, as written on the command line.
std::string_view getClobbers() const override
Returns a string of target-specific clobbers, in LLVM format.
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Determines whether a given calling convention is valid for the target.
ArrayRef< Builtin::Info > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
void getTargetDefinesARMV83A(const LangOptions &Opts, MacroBuilder &Builder) const
bool isValidCPUName(StringRef Name) const override
Determine whether this TargetInfo supports the given CPU name.
BuiltinVaListKind getBuiltinVaListKind() const override
Returns the kind of __builtin_va_list type that should be used with this target.
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 ...
bool handleTargetFeatures(std::vector< std::string > &Features, DiagnosticsEngine &Diags) override
Perform initialization based on the user configured set of features (e.g., +sse4).
bool setABI(const std::string &Name) override
Use the specified ABI.
StringRef getABI() const override
Get the ABI currently in use.
bool setCPU(const std::string &Name) override
Target the specified CPU.
bool hasFeature(StringRef Feature) const override
Determine whether the given target has the given feature.
void getTargetDefinesARMV81A(const LangOptions &Opts, MacroBuilder &Builder) const
bool validateConstraintModifier(StringRef Constraint, char Modifier, unsigned Size, std::string &SuggestedModifier) const override
ArrayRef< const char * > getGCCRegNames() const override
bool validateBranchProtection(StringRef Spec, StringRef Arch, BranchProtectionInfo &BPI, StringRef &Err) const override
Determine if this TargetInfo supports the given branch protection specification.
bool setFPMath(StringRef Name) override
Use the specified unit for FP math.
std::string convertConstraint(const char *&Constraint) const override
bool validateAsmConstraint(const char *&Name, TargetInfo::ConstraintInfo &Info) const override
void getTargetDefinesARMV82A(const LangOptions &Opts, MacroBuilder &Builder) const
ARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
bool hasSjLjLowering() const override
Controls if __builtin_longjmp / __builtin_setjmp can be lowered to llvm.eh.sjlj.longjmp / llvm....
void fillValidCPUList(SmallVectorImpl< StringRef > &Values) const override
Fill a SmallVectorImpl with the valid values to setCPU.
int getEHDataRegisterNumber(unsigned RegNo) const override
Return the register number that __builtin_eh_return_regno would return with the specified argument.
bool hasBFloat16Type() const override
Determine whether the _BFloat16 type is supported on this target.
bool isCLZForZeroUndef() const override
The __builtin_clz* and __builtin_ctz* built-in functions are specified to have undefined results for ...
ArrayRef< TargetInfo::GCCRegAlias > getGCCRegAliases() const override
bool isBranchProtectionSupportedArch(StringRef Arch) const override
Determine if the Architecture in this TargetInfo supports branch protection.
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
ARMbeTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
ARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
AppleMachOARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
CygwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
DarwinARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getOSDefines(const LangOptions &Opts, const llvm::Triple &Triple, MacroBuilder &Builder) const override
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
MicrosoftARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
MinGWARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
BuiltinVaListKind getBuiltinVaListKind() const override
void getVisualStudioDefines(const LangOptions &Opts, MacroBuilder &Builder) const
WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getAppleMachODefines(MacroBuilder &Builder, const LangOptions &Opts, const llvm::Triple &Triple)
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)
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.
void setRequiresImmediate(int Min, int Max)
unsigned UseZeroLengthBitfieldAlignment
Whether zero length bitfields (e.g., int : 0;) force alignment of the next bitfield.
unsigned short SuitableAlign
unsigned ZeroLengthBitfieldBoundary
If non-zero, specifies a fixed alignment value for bitfields that follow zero length bitfield,...
unsigned char LongLongAlign
unsigned UseBitFieldTypeAlignment
Control whether the alignment of bit-field types is respected when laying out structures.
unsigned char BFloat16Width
unsigned char LongDoubleAlign
unsigned char BFloat16Align
unsigned char DoubleAlign
const llvm::fltSemantics * BFloat16Format
unsigned char DefaultAlignForAttributeAligned