Index: clang/lib/Basic/Targets/AArch64.h =================================================================== --- clang/lib/Basic/Targets/AArch64.h +++ clang/lib/Basic/Targets/AArch64.h @@ -113,6 +113,8 @@ getVScaleRange(const LangOptions &LangOpts) const override; bool hasFeature(StringRef Feature) const override; + void setFeatureEnabled(llvm::StringMap &Features, StringRef Name, + bool Enabled) const override; bool handleTargetFeatures(std::vector &Features, DiagnosticsEngine &Diags) override; Index: clang/lib/Basic/Targets/AArch64.cpp =================================================================== --- clang/lib/Basic/Targets/AArch64.cpp +++ clang/lib/Basic/Targets/AArch64.cpp @@ -524,6 +524,25 @@ .Default(false); } +void AArch64TargetInfo::setFeatureEnabled(llvm::StringMap &Features, + StringRef Name, bool Enabled) const { + Features[Name] = Enabled; + + llvm::AArch64::ArchKind AK = llvm::AArch64::getCPUArchKind(Name); + if ("9" == getArchVersionString(AK)) { + unsigned AK_v85 = static_cast(llvm::AArch64::ArchKind::ARMV8_5A); + AK_v85 += static_cast(AK) - + static_cast(llvm::AArch64::ArchKind::ARMV9A); + for (llvm::AArch64::ArchKind i = + static_cast(AK_v85); + i != llvm::AArch64::ArchKind::INVALID; --i) + Features[llvm::AArch64::getSubArch(i)] = Enabled; + } + for (llvm::AArch64::ArchKind i = --llvm::AArch64::getCPUArchKind(Name); + i != llvm::AArch64::ArchKind::INVALID; --i) + Features[llvm::AArch64::getSubArch(i)] = Enabled; +} + bool AArch64TargetInfo::handleTargetFeatures(std::vector &Features, DiagnosticsEngine &Diags) { FPU = FPUMode; @@ -612,31 +631,31 @@ HasSM4 = true; if (Feature == "+strict-align") HasUnaligned = false; - if (Feature == "+v8a") + if (Feature == "+v8a" && ArchKind < llvm::AArch64::ArchKind::ARMV8A) ArchKind = llvm::AArch64::ArchKind::ARMV8A; - if (Feature == "+v8.1a") + if (Feature == "+v8.1a" && ArchKind < llvm::AArch64::ArchKind::ARMV8_1A) ArchKind = llvm::AArch64::ArchKind::ARMV8_1A; - if (Feature == "+v8.2a") + if (Feature == "+v8.2a" && ArchKind < llvm::AArch64::ArchKind::ARMV8_2A) ArchKind = llvm::AArch64::ArchKind::ARMV8_2A; - if (Feature == "+v8.3a") + if (Feature == "+v8.3a" && ArchKind < llvm::AArch64::ArchKind::ARMV8_3A) ArchKind = llvm::AArch64::ArchKind::ARMV8_3A; - if (Feature == "+v8.4a") + if (Feature == "+v8.4a" && ArchKind < llvm::AArch64::ArchKind::ARMV8_4A) ArchKind = llvm::AArch64::ArchKind::ARMV8_4A; - if (Feature == "+v8.5a") + if (Feature == "+v8.5a" && ArchKind < llvm::AArch64::ArchKind::ARMV8_5A) ArchKind = llvm::AArch64::ArchKind::ARMV8_5A; - if (Feature == "+v8.6a") + if (Feature == "+v8.6a" && ArchKind < llvm::AArch64::ArchKind::ARMV8_6A) ArchKind = llvm::AArch64::ArchKind::ARMV8_6A; - if (Feature == "+v8.7a") + if (Feature == "+v8.7a" && ArchKind < llvm::AArch64::ArchKind::ARMV8_7A) ArchKind = llvm::AArch64::ArchKind::ARMV8_7A; - if (Feature == "+v8.8a") + if (Feature == "+v8.8a" && ArchKind < llvm::AArch64::ArchKind::ARMV8_8A) ArchKind = llvm::AArch64::ArchKind::ARMV8_8A; - if (Feature == "+v9a") + if (Feature == "+v9a" && ArchKind < llvm::AArch64::ArchKind::ARMV9A) ArchKind = llvm::AArch64::ArchKind::ARMV9A; - if (Feature == "+v9.1a") + if (Feature == "+v9.1a" && ArchKind < llvm::AArch64::ArchKind::ARMV9_1A) ArchKind = llvm::AArch64::ArchKind::ARMV9_1A; - if (Feature == "+v9.2a") + if (Feature == "+v9.2a" && ArchKind < llvm::AArch64::ArchKind::ARMV9_2A) ArchKind = llvm::AArch64::ArchKind::ARMV9_2A; - if (Feature == "+v9.3a") + if (Feature == "+v9.3a" && ArchKind < llvm::AArch64::ArchKind::ARMV9_3A) ArchKind = llvm::AArch64::ArchKind::ARMV9_3A; if (Feature == "+v8r") ArchKind = llvm::AArch64::ArchKind::ARMV8R; Index: clang/lib/Driver/ToolChains/Arch/AArch64.cpp =================================================================== --- clang/lib/Driver/ToolChains/Arch/AArch64.cpp +++ clang/lib/Driver/ToolChains/Arch/AArch64.cpp @@ -366,21 +366,36 @@ int ArchFeatPos = -1; for (auto I = Features.begin(), E = Features.end(); I != E; I++) { - if (*I == "+v8a") V8Version = 0; - else if (*I == "+v8.1a") V8Version = 1; - else if (*I == "+v8.2a") V8Version = 2; - else if (*I == "+v8.3a") V8Version = 3; - else if (*I == "+v8.4a") V8Version = 4; - else if (*I == "+v8.5a") V8Version = 5; - else if (*I == "+v8.6a") V8Version = 6; - else if (*I == "+v8.7a") V8Version = 7; - else if (*I == "+v8.8a") V8Version = 8; - else if (*I == "+v8.9a") V8Version = 9; - else if (*I == "+v9a") V9Version = 0; - else if (*I == "+v9.1a") V9Version = 1; - else if (*I == "+v9.2a") V9Version = 2; - else if (*I == "+v9.3a") V9Version = 3; - else if (*I == "+v9.4a") V9Version = 4; + if (*I == "+v8a" && V8Version < 0) + V8Version = 0; + else if (*I == "+v8.1a" && V8Version < 1) + V8Version = 1; + else if (*I == "+v8.2a" && V8Version < 2) + V8Version = 2; + else if (*I == "+v8.3a" && V8Version < 3) + V8Version = 3; + else if (*I == "+v8.4a" && V8Version < 4) + V8Version = 4; + else if (*I == "+v8.5a" && V8Version < 5) + V8Version = 5; + else if (*I == "+v8.6a" && V8Version < 6) + V8Version = 6; + else if (*I == "+v8.7a" && V8Version < 7) + V8Version = 7; + else if (*I == "+v8.8a" && V8Version < 8) + V8Version = 8; + else if (*I == "+v8.9a" && V8Version < 9) + V8Version = 9; + else if (*I == "+v9a" && V9Version < 0) + V9Version = 0; + else if (*I == "+v9.1a" && V9Version < 1) + V9Version = 1; + else if (*I == "+v9.2a" && V9Version < 2) + V9Version = 2; + else if (*I == "+v9.3a" && V9Version < 3) + V9Version = 3; + else if (*I == "+v9.4a" && V9Version < 4) + V9Version = 4; else if (*I == "+sm4") HasSM4 = true; else if (*I == "+sha3") HasSHA3 = true; else if (*I == "+sha2") HasSHA2 = true; Index: llvm/include/llvm/Support/AArch64TargetParser.h =================================================================== --- llvm/include/llvm/Support/AArch64TargetParser.h +++ llvm/include/llvm/Support/AArch64TargetParser.h @@ -113,6 +113,19 @@ #include "AArch64TargetParser.def" }; +inline ArchKind operator--(ArchKind Kind) { + if (Kind == ArchKind::INVALID) + return ArchKind::INVALID; + if (Kind == ArchKind::ARMV8A) + return ArchKind::INVALID; + if (Kind == ArchKind::ARMV9A) + return ArchKind::INVALID; + if (Kind == ArchKind::ARMV8R) + return ArchKind::INVALID; + unsigned KindAsInteger = static_cast(Kind); + return static_cast(--KindAsInteger); +} + // FIXME: These should be moved to TargetTuple once it exists bool getExtensionFeatures(uint64_t Extensions, std::vector &Features);