17#include "llvm/ADT/StringRef.h"
18#include "llvm/ADT/StringSwitch.h"
19#include "llvm/TargetParser/ARMTargetParser.h"
24void ARMTargetInfo::setABIAAPCS() {
33 bool IsNetBSD =
T.isOSNetBSD();
34 bool IsOpenBSD =
T.isOSOpenBSD();
35 if (!
T.isOSWindows() && !IsNetBSD && !IsOpenBSD)
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",
49 }
else if (
T.isOSWindows()) {
50 assert(!
BigEndian &&
"Windows on ARM does not support big endian");
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");
69void ARMTargetInfo::setABIAPCS(
bool IsAAPCS16) {
92 if (
T.isOSBinFormatMachO() && IsAAPCS16) {
93 assert(!
BigEndian &&
"AAPCS16 does not support big-endian");
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",
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");
110void ARMTargetInfo::setArchInfo() {
111 StringRef ArchName =
getTriple().getArchName();
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)
118 setArchInfo(ArchKind);
121void ARMTargetInfo::setArchInfo(llvm::ARM::ArchKind Kind) {
126 SubArch = llvm::ARM::getSubArch(ArchKind);
127 ArchProfile = llvm::ARM::parseArchProfile(SubArch);
128 ArchVersion = llvm::ARM::parseArchVersion(SubArch);
131 CPUAttr = getCPUAttr();
132 CPUProfile = getCPUProfile();
135void ARMTargetInfo::setAtomic() {
136 if (ArchProfile == llvm::ARM::ProfileKind::M) {
140 if (ArchVersion >= 7)
153 if (
getTriple().getOS() == llvm::Triple::Linux || ArchVersion >= 6)
158bool ARMTargetInfo::hasMVE()
const {
159 return ArchKind == llvm::ARM::ArchKind::ARMV8_1MMainline && MVE != 0;
162bool ARMTargetInfo::hasMVEFloat()
const {
163 return hasMVE() && (MVE & MVE_FP);
168bool ARMTargetInfo::isThumb()
const {
169 return ArchISA == llvm::ARM::ISAKind::THUMB;
172bool ARMTargetInfo::supportsThumb()
const {
173 return CPUAttr.count(
'T') || ArchVersion >= 6;
176bool ARMTargetInfo::supportsThumb2()
const {
177 return CPUAttr ==
"6T2" || (ArchVersion >= 7 && CPUAttr !=
"8M_BASE");
180StringRef ARMTargetInfo::getCPUAttr()
const {
185 return llvm::ARM::getCPUAttr(ArchKind);
186 case llvm::ARM::ArchKind::ARMV6M:
188 case llvm::ARM::ArchKind::ARMV7S:
190 case llvm::ARM::ArchKind::ARMV7A:
192 case llvm::ARM::ArchKind::ARMV7R:
194 case llvm::ARM::ArchKind::ARMV7M:
196 case llvm::ARM::ArchKind::ARMV7EM:
198 case llvm::ARM::ArchKind::ARMV7VE:
200 case llvm::ARM::ArchKind::ARMV8A:
202 case llvm::ARM::ArchKind::ARMV8_1A:
204 case llvm::ARM::ArchKind::ARMV8_2A:
206 case llvm::ARM::ArchKind::ARMV8_3A:
208 case llvm::ARM::ArchKind::ARMV8_4A:
210 case llvm::ARM::ArchKind::ARMV8_5A:
212 case llvm::ARM::ArchKind::ARMV8_6A:
214 case llvm::ARM::ArchKind::ARMV8_7A:
216 case llvm::ARM::ArchKind::ARMV8_8A:
218 case llvm::ARM::ArchKind::ARMV8_9A:
220 case llvm::ARM::ArchKind::ARMV9A:
222 case llvm::ARM::ArchKind::ARMV9_1A:
224 case llvm::ARM::ArchKind::ARMV9_2A:
226 case llvm::ARM::ArchKind::ARMV9_3A:
228 case llvm::ARM::ArchKind::ARMV9_4A:
230 case llvm::ARM::ArchKind::ARMV9_5A:
232 case llvm::ARM::ArchKind::ARMV9_6A:
234 case llvm::ARM::ArchKind::ARMV9_7A:
236 case llvm::ARM::ArchKind::ARMV8MBaseline:
238 case llvm::ARM::ArchKind::ARMV8MMainline:
240 case llvm::ARM::ArchKind::ARMV8R:
242 case llvm::ARM::ArchKind::ARMV8_1MMainline:
247StringRef ARMTargetInfo::getCPUProfile()
const {
248 switch (ArchProfile) {
249 case llvm::ARM::ProfileKind::A:
251 case llvm::ARM::ProfileKind::R:
253 case llvm::ARM::ProfileKind::M:
262 :
TargetInfo(Triple), FPMath(FP_Default), IsAAPCS(
true), LDREX(0),
264 bool IsFreeBSD = Triple.isOSFreeBSD();
265 bool IsFuchsia = Triple.isOSFuchsia();
266 bool IsOpenBSD = Triple.isOSOpenBSD();
267 bool IsNetBSD = Triple.isOSNetBSD();
268 bool IsHaiku = Triple.isOSHaiku();
269 bool IsOHOS = Triple.isOHOSFamily();
275 (Triple.isOSDarwin() || Triple.isOSBinFormatMachO() || IsOpenBSD ||
280 SizeType = (Triple.isOSDarwin() || Triple.isOSBinFormatMachO() || IsOpenBSD ||
286 if ((Triple.isOSDarwin() || Triple.isOSBinFormatMachO()) &&
287 !Triple.isWatchABI())
300 if (Triple.isOSBinFormatMachO()) {
303 if (Triple.getEnvironment() == llvm::Triple::EABI ||
304 Triple.getOS() == llvm::Triple::UnknownOS ||
305 ArchProfile == llvm::ARM::ProfileKind::M) {
307 }
else if (Triple.isWatchABI()) {
312 }
else if (Triple.isOSWindows()) {
317 switch (Triple.getEnvironment()) {
318 case llvm::Triple::Android:
319 case llvm::Triple::GNUEABI:
320 case llvm::Triple::GNUEABIT64:
321 case llvm::Triple::GNUEABIHF:
322 case llvm::Triple::GNUEABIHFT64:
323 case llvm::Triple::MuslEABI:
324 case llvm::Triple::MuslEABIHF:
325 case llvm::Triple::OpenHOS:
326 setABI(
"aapcs-linux");
328 case llvm::Triple::EABIHF:
329 case llvm::Triple::EABI:
332 case llvm::Triple::GNU:
338 else if (IsFreeBSD || IsFuchsia || IsOpenBSD || IsHaiku || IsOHOS)
339 setABI(
"aapcs-linux");
347 TheCXXABI.set(TargetCXXABI::GenericARM);
354 if (IsAAPCS && !Triple.isAndroid())
355 DefaultAlignForAttributeAligned = MaxVectorAlign = 64;
361 UseZeroLengthBitfieldAlignment =
true;
363 if (Triple.getOS() == llvm::Triple::Linux ||
364 Triple.getOS() == llvm::Triple::UnknownOS)
365 this->MCountName = Opts.EABIVersion == llvm::EABI::GNU
366 ?
"llvm.arm.gnu.eabi.mcount"
369 SoftFloatABI = llvm::is_contained(Opts.FeaturesAsWritten,
"+soft-float-abi");
381 if (Name ==
"apcs-gnu" || Name ==
"aapcs16") {
382 setABIAPCS(Name ==
"aapcs16");
385 if (Name ==
"aapcs" || Name ==
"aapcs-vfp" || Name ==
"aapcs-linux") {
393 llvm::ARM::ArchKind CPUArch = llvm::ARM::parseCPUArch(
Arch);
394 if (CPUArch == llvm::ARM::ArchKind::INVALID)
395 CPUArch = llvm::ARM::parseArch(
getTriple().getArchName());
397 if (CPUArch == llvm::ARM::ArchKind::INVALID)
400 StringRef ArchFeature = llvm::ARM::getArchName(CPUArch);
402 llvm::Triple(ArchFeature,
getTriple().getVendorName(),
405 StringRef SubArch = llvm::ARM::getSubArch(CPUArch);
406 llvm::ARM::ProfileKind Profile = llvm::ARM::parseArchProfile(SubArch);
407 return a.isArmT32() && (Profile == llvm::ARM::ProfileKind::M);
413 StringRef &Err)
const {
414 llvm::ARM::ParsedBranchProtection PBP;
415 if (!llvm::ARM::parseBranchProtection(Spec, PBP, Err))
422 llvm::StringSwitch<LangOptions::SignReturnAddressScopeKind>(PBP.Scope)
428 if (PBP.Key ==
"b_key")
440 const std::vector<std::string> &FeaturesVec)
const {
442 std::string ArchFeature;
443 std::vector<StringRef> TargetFeatures;
444 llvm::ARM::ArchKind
Arch = llvm::ARM::parseArch(
getTriple().getArchName());
448 llvm::ARM::ArchKind CPUArch = llvm::ARM::parseCPUArch(CPU);
449 if (CPUArch == llvm::ARM::ArchKind::INVALID)
451 if (CPUArch != llvm::ARM::ArchKind::INVALID) {
452 ArchFeature = (
"+" + llvm::ARM::getArchName(CPUArch)).str();
453 TargetFeatures.push_back(ArchFeature);
459 for (llvm::ARM::ArchKind I = llvm::ARM::convertV9toV8(CPUArch);
460 I != llvm::ARM::ArchKind::INVALID; --I)
461 Features[llvm::ARM::getSubArch(I)] =
true;
462 if (CPUArch > llvm::ARM::ArchKind::ARMV8A &&
463 CPUArch <= llvm::ARM::ArchKind::ARMV9_3A)
464 for (llvm::ARM::ArchKind I = CPUArch; I != llvm::ARM::ArchKind::INVALID;
466 Features[llvm::ARM::getSubArch(I)] =
true;
470 llvm::ARM::FPUKind FPUKind = llvm::ARM::getDefaultFPU(CPU,
Arch);
471 llvm::ARM::getFPUFeatures(FPUKind, TargetFeatures);
474 uint64_t Extensions = llvm::ARM::getDefaultExtensions(CPU,
Arch);
475 llvm::ARM::getExtensionFeatures(Extensions, TargetFeatures);
477 for (
auto Feature : TargetFeatures)
479 Features[
Feature.drop_front(1)] =
true;
484 Features[
"thumb-mode"] =
true;
486 Features[
"thumb-mode"] =
false;
490 std::vector<std::string> UpdatedFeaturesVec;
491 for (
const auto &
Feature : FeaturesVec) {
494 if (
Feature ==
"+soft-float-abi")
497 StringRef FixedFeature;
499 FixedFeature =
"-thumb-mode";
501 FixedFeature =
"+thumb-mode";
504 UpdatedFeaturesVec.push_back(FixedFeature.str());
532 FPRegsDisabled =
false;
536 for (
const auto &
Feature : Features) {
537 if (
Feature ==
"+soft-float") {
553 HW_FP |= HW_FP_SP | HW_FP_HP;
556 }
else if (
Feature ==
"+fp-armv8sp" ||
Feature ==
"+fp-armv8d16sp" ||
559 HW_FP |= HW_FP_SP | HW_FP_HP;
562 }
else if (
Feature ==
"+neon") {
565 }
else if (
Feature ==
"+hwdiv") {
567 }
else if (
Feature ==
"+hwdiv-arm") {
569 }
else if (
Feature ==
"+crc") {
571 }
else if (
Feature ==
"+crypto") {
573 }
else if (
Feature ==
"+sha2") {
575 }
else if (
Feature ==
"+aes") {
577 }
else if (
Feature ==
"+dsp") {
579 }
else if (
Feature ==
"+fp64") {
581 }
else if (
Feature ==
"+8msecext") {
582 if (CPUProfile !=
"M" || ArchVersion != 8) {
583 Diags.
Report(diag::err_target_unsupported_mcmse) << CPU;
586 }
else if (
Feature ==
"+strict-align") {
588 }
else if (
Feature ==
"+fp16") {
590 }
else if (
Feature ==
"+fullfp16") {
592 }
else if (
Feature ==
"+dotprod") {
594 }
else if (
Feature ==
"+mve") {
596 }
else if (
Feature ==
"+mve.fp") {
599 MVE |= MVE_INT | MVE_FP;
600 HW_FP |= HW_FP_SP | HW_FP_HP;
601 }
else if (
Feature ==
"+i8mm") {
603 }
else if (
Feature.size() == strlen(
"+cdecp0") &&
Feature >=
"+cdecp0" &&
605 unsigned Coproc =
Feature.back() -
'0';
607 }
else if (
Feature ==
"+bf16") {
609 }
else if (
Feature ==
"-fpregs") {
610 FPRegsDisabled =
true;
611 }
else if (
Feature ==
"+pacbti") {
614 }
else if (
Feature ==
"+fullbf16") {
616 }
else if (
Feature ==
"+execute-only") {
623 switch (ArchVersion) {
625 if (ArchProfile == llvm::ARM::ProfileKind::M)
627 else if (ArchKind == llvm::ARM::ArchKind::ARMV6K ||
628 ArchKind == llvm::ARM::ArchKind::ARMV6KZ)
635 if (ArchProfile == llvm::ARM::ProfileKind::M)
641 assert(ArchProfile != llvm::ARM::ProfileKind::M &&
642 "No Armv9-M architectures defined");
646 if (!(FPU & NeonFPU) && FPMath == FP_Neon) {
647 Diags.
Report(diag::err_target_unsupported_fpmath) <<
"neon";
651 if (FPMath == FP_Neon)
652 Features.push_back(
"+neonfp");
653 else if (FPMath == FP_VFP)
654 Features.push_back(
"-neonfp");
660 return llvm::StringSwitch<bool>(
Feature)
662 .Case(
"aarch32",
true)
663 .Case(
"softfloat", SoftFloat)
664 .Case(
"thumb", isThumb())
665 .Case(
"neon", (FPU & NeonFPU) && !SoftFloat)
666 .Case(
"vfp", FPU && !SoftFloat)
667 .Case(
"hwdiv", HWDiv & HWDivThumb)
668 .Case(
"hwdiv-arm", HWDiv & HWDivARM)
669 .Case(
"mve", hasMVE())
679 return Name ==
"generic" ||
680 llvm::ARM::parseCPUArch(Name) != llvm::ARM::ArchKind::INVALID;
684 llvm::ARM::fillValidCPUArchList(Values);
688 if (Name !=
"generic")
689 setArchInfo(llvm::ARM::parseCPUArch(Name));
691 if (ArchKind == llvm::ARM::ArchKind::INVALID)
699 if (Name ==
"neon") {
702 }
else if (Name ==
"vfp" || Name ==
"vfp2" || Name ==
"vfp3" ||
712 Builder.defineMacro(
"__ARM_FEATURE_QRDMX",
"1");
724 Builder.defineMacro(
"__ARM_FEATURE_COMPLEX",
"1");
731 Builder.defineMacro(
"__arm");
732 Builder.defineMacro(
"__arm__");
734 if (
getTriple().getOS() == llvm::Triple::UnknownOS &&
735 (
getTriple().getEnvironment() == llvm::Triple::EABI ||
736 getTriple().getEnvironment() == llvm::Triple::EABIHF) &&
738 Builder.defineMacro(
"_GNU_SOURCE");
742 Builder.defineMacro(
"__REGISTER_PREFIX__",
"");
747 Builder.defineMacro(
"__ARM_ARCH_7K__",
"2");
749 if (!CPUAttr.empty())
750 Builder.defineMacro(
"__ARM_ARCH_" + CPUAttr +
"__");
754 Builder.defineMacro(
"__ARM_ARCH", Twine(ArchVersion));
756 if (ArchVersion >= 8) {
761 Builder.defineMacro(
"__ARM_FEATURE_CRYPTO",
"1");
763 Builder.defineMacro(
"__ARM_FEATURE_SHA2",
"1");
765 Builder.defineMacro(
"__ARM_FEATURE_AES",
"1");
768 Builder.defineMacro(
"__ARM_FEATURE_CRC32",
"1");
770 Builder.defineMacro(
"__ARM_FEATURE_NUMERIC_MAXMIN",
"1");
772 Builder.defineMacro(
"__ARM_FEATURE_DIRECTED_ROUNDING",
"1");
778 if (CPUProfile.empty() || ArchProfile != llvm::ARM::ProfileKind::M)
779 Builder.defineMacro(
"__ARM_ARCH_ISA_ARM",
"1");
785 if (supportsThumb2())
786 Builder.defineMacro(
"__ARM_ARCH_ISA_THUMB",
"2");
787 else if (supportsThumb())
788 Builder.defineMacro(
"__ARM_ARCH_ISA_THUMB",
"1");
792 Builder.defineMacro(
"__ARM_32BIT_STATE",
"1");
797 if (!CPUProfile.empty())
798 Builder.defineMacro(
"__ARM_ARCH_PROFILE",
"'" + CPUProfile +
"'");
802 Builder.defineMacro(
"__ARM_FEATURE_UNALIGNED",
"1");
806 Builder.defineMacro(
"__ARM_FEATURE_LDREX",
"0x" + Twine::utohexstr(LDREX));
809 if (ArchVersion == 5 || (ArchVersion == 6 && CPUProfile !=
"M") ||
811 Builder.defineMacro(
"__ARM_FEATURE_CLZ",
"1");
815 Builder.defineMacro(
"__ARM_FP",
"0x" + Twine::utohexstr(HW_FP));
818 Builder.defineMacro(
"__ARM_ACLE",
"200");
821 Builder.defineMacro(
"__ARM_FP16_FORMAT_IEEE",
"1");
822 Builder.defineMacro(
"__ARM_FP16_ARGS",
"1");
825 if (ArchVersion >= 7 && (FPU & VFP4FPU))
826 Builder.defineMacro(
"__ARM_FEATURE_FMA",
"1");
833 if (5 <= ArchVersion && ArchVersion <= 8 && !
getTriple().isOSWindows())
834 Builder.defineMacro(
"__THUMB_INTERWORK__");
836 if (ABI ==
"aapcs" || ABI ==
"aapcs-linux" || ABI ==
"aapcs-vfp") {
840 Builder.defineMacro(
"__ARM_EABI__");
841 Builder.defineMacro(
"__ARM_PCS",
"1");
844 if ((!SoftFloat && !SoftFloatABI) || ABI ==
"aapcs-vfp" || ABI ==
"aapcs16")
845 Builder.defineMacro(
"__ARM_PCS_VFP",
"1");
847 if (SoftFloat || (SoftFloatABI && !FPU))
848 Builder.defineMacro(
"__SOFTFP__");
852 Builder.defineMacro(
"__ARM_ROPI",
"1");
854 Builder.defineMacro(
"__ARM_RWPI",
"1");
857 uint64_t FeatureCoprocBF = 0;
861 case llvm::ARM::ArchKind::ARMV4:
862 case llvm::ARM::ArchKind::ARMV4T:
864 FeatureCoprocBF = isThumb() ? 0 : FEATURE_COPROC_B1;
866 case llvm::ARM::ArchKind::ARMV5T:
867 FeatureCoprocBF = isThumb() ? 0 : FEATURE_COPROC_B1 | FEATURE_COPROC_B2;
869 case llvm::ARM::ArchKind::ARMV5TE:
870 case llvm::ARM::ArchKind::ARMV5TEJ:
873 FEATURE_COPROC_B1 | FEATURE_COPROC_B2 | FEATURE_COPROC_B3;
875 case llvm::ARM::ArchKind::ARMV6:
876 case llvm::ARM::ArchKind::ARMV6K:
877 case llvm::ARM::ArchKind::ARMV6KZ:
878 case llvm::ARM::ArchKind::ARMV6T2:
879 if (!isThumb() || ArchKind == llvm::ARM::ArchKind::ARMV6T2)
880 FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B2 |
881 FEATURE_COPROC_B3 | FEATURE_COPROC_B4;
883 case llvm::ARM::ArchKind::ARMV7A:
884 case llvm::ARM::ArchKind::ARMV7R:
885 case llvm::ARM::ArchKind::ARMV7M:
886 case llvm::ARM::ArchKind::ARMV7S:
887 case llvm::ARM::ArchKind::ARMV7EM:
888 FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B2 |
889 FEATURE_COPROC_B3 | FEATURE_COPROC_B4;
891 case llvm::ARM::ArchKind::ARMV8A:
892 case llvm::ARM::ArchKind::ARMV8R:
893 case llvm::ARM::ArchKind::ARMV8_1A:
894 case llvm::ARM::ArchKind::ARMV8_2A:
895 case llvm::ARM::ArchKind::ARMV8_3A:
896 case llvm::ARM::ArchKind::ARMV8_4A:
897 case llvm::ARM::ArchKind::ARMV8_5A:
898 case llvm::ARM::ArchKind::ARMV8_6A:
899 case llvm::ARM::ArchKind::ARMV8_7A:
900 case llvm::ARM::ArchKind::ARMV8_8A:
901 case llvm::ARM::ArchKind::ARMV8_9A:
902 case llvm::ARM::ArchKind::ARMV9A:
903 case llvm::ARM::ArchKind::ARMV9_1A:
904 case llvm::ARM::ArchKind::ARMV9_2A:
905 case llvm::ARM::ArchKind::ARMV9_3A:
906 case llvm::ARM::ArchKind::ARMV9_4A:
907 case llvm::ARM::ArchKind::ARMV9_5A:
908 case llvm::ARM::ArchKind::ARMV9_6A:
909 case llvm::ARM::ArchKind::ARMV9_7A:
911 FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B3;
913 case llvm::ARM::ArchKind::ARMV8MMainline:
914 case llvm::ARM::ArchKind::ARMV8_1MMainline:
915 FeatureCoprocBF = FEATURE_COPROC_B1 | FEATURE_COPROC_B2 |
916 FEATURE_COPROC_B3 | FEATURE_COPROC_B4;
919 Builder.defineMacro(
"__ARM_FEATURE_COPROC",
920 "0x" + Twine::utohexstr(FeatureCoprocBF));
922 if (ArchKind == llvm::ARM::ArchKind::XSCALE)
923 Builder.defineMacro(
"__XSCALE__");
926 Builder.defineMacro(
"__THUMBEL__");
927 Builder.defineMacro(
"__thumb__");
928 if (supportsThumb2())
929 Builder.defineMacro(
"__thumb2__");
933 if ((CPUProfile !=
"M" && ArchVersion >= 6) || (CPUProfile ==
"M" && DSP))
934 Builder.defineMacro(
"__ARM_FEATURE_SIMD32",
"1");
937 if (((HWDiv & HWDivThumb) && isThumb()) ||
938 ((HWDiv & HWDivARM) && !isThumb())) {
939 Builder.defineMacro(
"__ARM_FEATURE_IDIV",
"1");
940 Builder.defineMacro(
"__ARM_ARCH_EXT_IDIV__",
"1");
944 Builder.defineMacro(
"__APCS_32__");
949 Builder.defineMacro(
"__VFP_FP__");
951 if (FPUModeIsVFP((FPUMode)FPU)) {
953 Builder.defineMacro(
"__ARM_VFPV2__");
955 Builder.defineMacro(
"__ARM_VFPV3__");
957 Builder.defineMacro(
"__ARM_VFPV4__");
959 Builder.defineMacro(
"__ARM_FPV5__");
966 if ((FPU & NeonFPU) && !SoftFloat && ArchVersion >= 7) {
967 Builder.defineMacro(
"__ARM_NEON",
"1");
968 Builder.defineMacro(
"__ARM_NEON__");
971 Builder.defineMacro(
"__ARM_NEON_FP",
972 "0x" + Twine::utohexstr(HW_FP & ~HW_FP_DP));
976 Builder.defineMacro(
"__ARM_FEATURE_MVE", hasMVEFloat() ?
"3" :
"1");
980 Builder.defineMacro(
"__ARM_FEATURE_CDE",
"1");
981 Builder.defineMacro(
"__ARM_FEATURE_CDE_COPROC",
985 Builder.defineMacro(
"__ARM_SIZEOF_WCHAR_T",
986 Twine(Opts.WCharSize ? Opts.WCharSize : 4));
988 Builder.defineMacro(
"__ARM_SIZEOF_MINIMAL_ENUM", Opts.ShortEnums ?
"1" :
"4");
991 if (ArchVersion == 8 && ArchProfile == llvm::ARM::ProfileKind::M)
992 Builder.defineMacro(
"__ARM_FEATURE_CMSE", Opts.Cmse ?
"3" :
"1");
994 if (ArchVersion >= 6 && CPUAttr !=
"6M" && CPUAttr !=
"8M_BASE") {
995 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1");
996 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2");
997 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4");
998 Builder.defineMacro(
"__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8");
1003 Builder.defineMacro(
"__ARM_FEATURE_DSP",
"1");
1008 if ((ArchVersion == 6 && CPUProfile !=
"M") || ArchVersion > 6) {
1009 Builder.defineMacro(
"__ARM_FEATURE_SAT",
"1");
1015 Builder.defineMacro(
"__ARM_FEATURE_QBIT",
"1");
1017 if (Opts.UnsafeFPMath)
1018 Builder.defineMacro(
"__ARM_FP_FAST",
"1");
1022 Builder.defineMacro(
"__ARM_FEATURE_FP16_VECTOR_ARITHMETIC",
"1");
1026 Builder.defineMacro(
"__ARM_FEATURE_FP16_SCALAR_ARITHMETIC",
"1");
1030 Builder.defineMacro(
"__ARM_FEATURE_DOTPROD",
"1");
1033 Builder.defineMacro(
"__ARM_FEATURE_MATMUL_INT8",
"1");
1036 Builder.defineMacro(
"__ARM_FEATURE_PAUTH",
"1");
1039 Builder.defineMacro(
"__ARM_FEATURE_BTI",
"1");
1042 Builder.defineMacro(
"__ARM_FEATURE_BF16",
"1");
1043 Builder.defineMacro(
"__ARM_FEATURE_BF16_VECTOR_ARITHMETIC",
"1");
1044 Builder.defineMacro(
"__ARM_BF16_FORMAT_ALTERNATIVE",
"1");
1047 if (Opts.BranchTargetEnforcement)
1048 Builder.defineMacro(
"__ARM_FEATURE_BTI_DEFAULT",
"1");
1054 Builder.defineMacro(
"__ARM_FEATURE_PAC_DEFAULT", Twine(
Value));
1060 case llvm::ARM::ArchKind::ARMV8_1A:
1063 case llvm::ARM::ArchKind::ARMV8_2A:
1066 case llvm::ARM::ArchKind::ARMV8_3A:
1067 case llvm::ARM::ArchKind::ARMV8_4A:
1068 case llvm::ARM::ArchKind::ARMV8_5A:
1069 case llvm::ARM::ArchKind::ARMV8_6A:
1070 case llvm::ARM::ArchKind::ARMV8_7A:
1071 case llvm::ARM::ArchKind::ARMV8_8A:
1072 case llvm::ARM::ArchKind::ARMV8_9A:
1073 case llvm::ARM::ArchKind::ARMV9A:
1074 case llvm::ARM::ArchKind::ARMV9_1A:
1075 case llvm::ARM::ArchKind::ARMV9_2A:
1076 case llvm::ARM::ArchKind::ARMV9_3A:
1077 case llvm::ARM::ArchKind::ARMV9_4A:
1078 case llvm::ARM::ArchKind::ARMV9_5A:
1079 case llvm::ARM::ArchKind::ARMV9_6A:
1080 case llvm::ARM::ArchKind::ARMV9_7A:
1102#define GET_NEON_BUILTIN_STR_TABLE
1103#include "clang/Basic/arm_neon.inc"
1104#undef GET_NEON_BUILTIN_STR_TABLE
1106static constexpr std::array<Builtin::Info, NumNeonBuiltins>
BuiltinInfos = {
1107#define GET_NEON_BUILTIN_INFOS
1108#include "clang/Basic/arm_neon.inc"
1109#undef GET_NEON_BUILTIN_INFOS
1113#define GET_NEON_BUILTIN_STR_TABLE
1114#include "clang/Basic/arm_fp16.inc"
1115#undef GET_NEON_BUILTIN_STR_TABLE
1117static constexpr std::array<Builtin::Info, NumFp16Builtins>
BuiltinInfos = {
1118#define GET_NEON_BUILTIN_INFOS
1119#include "clang/Basic/arm_fp16.inc"
1120#undef GET_NEON_BUILTIN_INFOS
1128#define GET_MVE_BUILTIN_STR_TABLE
1129#include "clang/Basic/arm_mve_builtins.inc"
1130#undef GET_MVE_BUILTIN_STR_TABLE
1132static constexpr std::array<Builtin::Info, NumMVEBuiltins>
BuiltinInfos = {
1133#define GET_MVE_BUILTIN_INFOS
1134#include "clang/Basic/arm_mve_builtins.inc"
1135#undef GET_MVE_BUILTIN_INFOS
1140#define GET_CDE_BUILTIN_STR_TABLE
1141#include "clang/Basic/arm_cde_builtins.inc"
1142#undef GET_CDE_BUILTIN_STR_TABLE
1144static constexpr std::array<Builtin::Info, NumCDEBuiltins>
BuiltinInfos = {
1145#define GET_CDE_BUILTIN_INFOS
1146#include "clang/Basic/arm_cde_builtins.inc"
1147#undef GET_CDE_BUILTIN_INFOS
1154#define BUILTIN CLANG_BUILTIN_STR_TABLE
1155#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_STR_TABLE
1156#define TARGET_HEADER_BUILTIN CLANG_TARGET_HEADER_BUILTIN_STR_TABLE
1157#include "clang/Basic/BuiltinsARM.def"
1161#define BUILTIN CLANG_BUILTIN_ENTRY
1162#define LANGBUILTIN CLANG_LANGBUILTIN_ENTRY
1163#define LIBBUILTIN CLANG_LIBBUILTIN_ENTRY
1164#define TARGET_BUILTIN CLANG_TARGET_BUILTIN_ENTRY
1165#define TARGET_HEADER_BUILTIN CLANG_TARGET_HEADER_BUILTIN_ENTRY
1166#include "clang/Basic/BuiltinsARM.def"
1169llvm::SmallVector<Builtin::InfosShard>
1175 {&MVE::BuiltinStrings, MVE::BuiltinInfos,
"__builtin_arm_mve_"},
1176 {&CDE::BuiltinStrings, CDE::BuiltinInfos,
"__builtin_arm_cde_"},
1189const char *
const ARMTargetInfo::GCCRegNames[] = {
1191 "r0",
"r1",
"r2",
"r3",
"r4",
"r5",
"r6",
"r7",
"r8",
"r9",
"r10",
"r11",
1192 "r12",
"sp",
"lr",
"pc",
1195 "s0",
"s1",
"s2",
"s3",
"s4",
"s5",
"s6",
"s7",
"s8",
"s9",
"s10",
"s11",
1196 "s12",
"s13",
"s14",
"s15",
"s16",
"s17",
"s18",
"s19",
"s20",
"s21",
"s22",
1197 "s23",
"s24",
"s25",
"s26",
"s27",
"s28",
"s29",
"s30",
"s31",
1200 "d0",
"d1",
"d2",
"d3",
"d4",
"d5",
"d6",
"d7",
"d8",
"d9",
"d10",
"d11",
1201 "d12",
"d13",
"d14",
"d15",
"d16",
"d17",
"d18",
"d19",
"d20",
"d21",
"d22",
1202 "d23",
"d24",
"d25",
"d26",
"d27",
"d28",
"d29",
"d30",
"d31",
1205 "q0",
"q1",
"q2",
"q3",
"q4",
"q5",
"q6",
"q7",
"q8",
"q9",
"q10",
"q11",
1206 "q12",
"q13",
"q14",
"q15"};
1213 {{
"a1"},
"r0"}, {{
"a2"},
"r1"}, {{
"a3"},
"r2"}, {{
"a4"},
"r3"},
1214 {{
"v1"},
"r4"}, {{
"v2"},
"r5"}, {{
"v3"},
"r6"}, {{
"v4"},
"r7"},
1215 {{
"v5"},
"r8"}, {{
"v6",
"rfp"},
"r9"}, {{
"sl"},
"r10"}, {{
"fp"},
"r11"},
1216 {{
"ip"},
"r12"}, {{
"r13"},
"sp"}, {{
"r14"},
"lr"}, {{
"r15"},
"pc"},
1250 if (CPUAttr ==
"6T2" || ArchVersion >= 7) {
1257 if (!supportsThumb2())
1269 if (isThumb() && !supportsThumb2())
1276 if (!supportsThumb2())
1291 if (!supportsThumb2())
1303 if (isThumb() && !supportsThumb2())
1314 if (isThumb() && !supportsThumb2()) {
1321 if (isThumb() && !supportsThumb2()) {
1364 switch (*Constraint) {
1367 R = std::string(
"^") + std::string(Constraint, 2);
1371 R = std::string(
"r");
1374 return std::string(1, *Constraint);
1380 StringRef Constraint,
char Modifier,
unsigned Size,
1381 std::string &SuggestedModifier)
const {
1382 bool isOutput = (Constraint[0] ==
'=');
1383 bool isInOut = (Constraint[0] ==
'+');
1386 Constraint = Constraint.ltrim(
"=+&");
1388 switch (Constraint[0]) {
1394 return (isInOut || isOutput || Size <= 64);
1439 Builder.defineMacro(
"__ARMEL__");
1449 Builder.defineMacro(
"__ARMEB__");
1450 Builder.defineMacro(
"__ARM_BIG_ENDIAN");
1462 Builder.defineMacro(
"_M_ARM_NT",
"1");
1463 Builder.defineMacro(
"_M_ARMT",
"_M_ARM");
1464 Builder.defineMacro(
"_M_THUMB",
"_M_ARM");
1466 assert((Triple.getArch() == llvm::Triple::arm ||
1467 Triple.getArch() == llvm::Triple::thumb) &&
1468 "invalid architecture for Windows ARM target info");
1469 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
1470 Builder.defineMacro(
"_M_ARM", Triple.getArchName().substr(Offset));
1474 Builder.defineMacro(
"_M_ARM_FP",
"31");
1506 TheCXXABI.set(TargetCXXABI::GenericARM);
1513 if (Opts.MSVCCompat)
1533 TheCXXABI.set(TargetCXXABI::GenericARM);
1539 Builder.defineMacro(
"_ARM_");
1548 resetDataLayout(
"e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64");
1554 Builder.defineMacro(
"_ARM_");
1555 Builder.defineMacro(
"__CYGWIN__");
1556 Builder.defineMacro(
"__CYGWIN32__");
1559 Builder.defineMacro(
"_GNU_SOURCE");
1567 const llvm::Triple &Triple,
1576 if (Triple.isWatchABI()) {
1578 TheCXXABI.set(TargetCXXABI::WatchOS);
1581 UseSignedCharForObjCBool = false;
1587 const llvm::Triple &Triple,
Defines the Diagnostic-related interfaces.
static constexpr int NumFp16Builtins
static constexpr int NumNeonBuiltins
static constexpr llvm::StringTable BuiltinStrings
static constexpr int NumARMBuiltins
static constexpr int NumMVEBuiltins
static constexpr int NumCDEBuiltins
static constexpr Builtin::Info BuiltinInfos[]
static constexpr unsigned NumBuiltins
Defines enum values for all the target-independent builtin functions.
#define CLANG_BUILTIN_STR_TABLE_START
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
TargetInfo(const llvm::Triple &T)
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;
@ ARM_LDREX_W
half (16-bit)
@ ARM_LDREX_H
byte (8-bit)
@ ARM_LDREX_D
word (32-bit)
VersionTuple PlatformMinVersion
virtual void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const =0
===-— Other target property query methods -----------------------—===//
unsigned HasUnalignedAccess
unsigned char MaxAtomicPromoteWidth
uint32_t getARMCDECoprocMask() const
For ARM targets returns a mask defining which coprocessors are configured as Custom Datapath.
unsigned HasAlignMac68kSupport
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.
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 -----------------------—===//
llvm::SmallVector< Builtin::InfosShard > getTargetBuiltins() const override
Return information about target-specific builtins for the current primary target, and info about whic...
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Determines whether a given calling convention is valid for the target.
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.
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.
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 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
AppleMachOTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
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
DarwinTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
ItaniumWindowsARMleTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override
===-— Other target property query methods -----------------------—===//
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
===-— Other target property query methods -----------------------—===//
CallingConvCheckResult checkCallingConvention(CallingConv CC) const override
Determines whether a given calling convention is valid for the target.
BuiltinVaListKind getBuiltinVaListKind() const override
Returns the kind of __builtin_va_list type that should be used with this target.
void getVisualStudioDefines(const LangOptions &Opts, MacroBuilder &Builder) const
WindowsARMTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
WindowsTargetInfo(const llvm::Triple &Triple, const TargetOptions &Opts)
static constexpr std::array< Info, N > MakeInfos(std::array< Info, N > Infos)
A constexpr function to construct an infos array from X-macros.
static constexpr std::array< Builtin::Info, NumFp16Builtins > BuiltinInfos
static constexpr std::array< Builtin::Info, NumNeonBuiltins > BuiltinInfos
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.
if(T->getSizeExpr()) TRY_TO(TraverseStmt(const_cast< Expr * >(T -> getSizeExpr())))
const FunctionProtoType * T
CallingConv
CallingConv - Specifies the calling convention that a function uses.
void setRequiresImmediate(int Min, int Max)
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