diff --git a/clang/test/Misc/target-invalid-cpu-note.c b/clang/test/Misc/target-invalid-cpu-note.c index 7857e72eca0653..f2071c866956f9 100644 --- a/clang/test/Misc/target-invalid-cpu-note.c +++ b/clang/test/Misc/target-invalid-cpu-note.c @@ -5,11 +5,11 @@ // RUN: not %clang_cc1 -triple arm64--- -target-cpu not-a-cpu -fsyntax-only %s 2>&1 | FileCheck %s --check-prefix AARCH64 // AARCH64: error: unknown target CPU 'not-a-cpu' -// AARCH64-NEXT: note: valid target CPU values are: cortex-a34, cortex-a35, cortex-a53, cortex-a55, cortex-a510, cortex-a57, cortex-a65, cortex-a65ae, cortex-a72, cortex-a73, cortex-a75, cortex-a76, cortex-a76ae, cortex-a77, cortex-a78, cortex-a78c, cortex-a710, cortex-r82, cortex-x1, cortex-x1c, cortex-x2, neoverse-e1, neoverse-n1, neoverse-n2, neoverse-512tvb, neoverse-v1, neoverse-v2, cyclone, apple-a7, apple-a8, apple-a9, apple-a10, apple-a11, apple-a12, apple-a13, apple-a14, apple-a15, apple-a16, apple-m1, apple-m2, apple-s4, apple-s5, exynos-m3, exynos-m4, exynos-m5, falkor, saphira, kryo, thunderx2t99, thunderx3t110, thunderx, thunderxt88, thunderxt81, thunderxt83, tsv110, a64fx, carmel, ampere1{{$}} +// AARCH64-NEXT: note: valid target CPU values are: cortex-a34, cortex-a35, cortex-a53, cortex-a55, cortex-a510, cortex-a57, cortex-a65, cortex-a65ae, cortex-a72, cortex-a73, cortex-a75, cortex-a76, cortex-a76ae, cortex-a77, cortex-a78, cortex-a78c, cortex-a710, cortex-r82, cortex-x1, cortex-x1c, cortex-x2, neoverse-e1, neoverse-n1, neoverse-n2, neoverse-512tvb, neoverse-v1, neoverse-v2, cyclone, apple-a7, apple-a8, apple-a9, apple-a10, apple-a11, apple-a12, apple-a13, apple-a14, apple-a15, apple-a16, apple-m1, apple-m2, apple-s4, apple-s5, exynos-m3, exynos-m4, exynos-m5, falkor, saphira, kryo, thunderx2t99, thunderx3t110, thunderx, thunderxt88, thunderxt81, thunderxt83, tsv110, a64fx, carmel, ampere1, grace{{$}} // RUN: not %clang_cc1 -triple arm64--- -tune-cpu not-a-cpu -fsyntax-only %s 2>&1 | FileCheck %s --check-prefix TUNE_AARCH64 // TUNE_AARCH64: error: unknown target CPU 'not-a-cpu' -// TUNE_AARCH64-NEXT: note: valid target CPU values are: cortex-a34, cortex-a35, cortex-a53, cortex-a55, cortex-a510, cortex-a57, cortex-a65, cortex-a65ae, cortex-a72, cortex-a73, cortex-a75, cortex-a76, cortex-a76ae, cortex-a77, cortex-a78, cortex-a78c, cortex-a710, cortex-r82, cortex-x1, cortex-x1c, cortex-x2, neoverse-e1, neoverse-n1, neoverse-n2, neoverse-512tvb, neoverse-v1, neoverse-v2, cyclone, apple-a7, apple-a8, apple-a9, apple-a10, apple-a11, apple-a12, apple-a13, apple-a14, apple-a15, apple-a16, apple-m1, apple-m2, apple-s4, apple-s5, exynos-m3, exynos-m4, exynos-m5, falkor, saphira, kryo, thunderx2t99, thunderx3t110, thunderx, thunderxt88, thunderxt81, thunderxt83, tsv110, a64fx, carmel, ampere1{{$}} +// TUNE_AARCH64-NEXT: note: valid target CPU values are: cortex-a34, cortex-a35, cortex-a53, cortex-a55, cortex-a510, cortex-a57, cortex-a65, cortex-a65ae, cortex-a72, cortex-a73, cortex-a75, cortex-a76, cortex-a76ae, cortex-a77, cortex-a78, cortex-a78c, cortex-a710, cortex-r82, cortex-x1, cortex-x1c, cortex-x2, neoverse-e1, neoverse-n1, neoverse-n2, neoverse-512tvb, neoverse-v1, neoverse-v2, cyclone, apple-a7, apple-a8, apple-a9, apple-a10, apple-a11, apple-a12, apple-a13, apple-a14, apple-a15, apple-a16, apple-m1, apple-m2, apple-s4, apple-s5, exynos-m3, exynos-m4, exynos-m5, falkor, saphira, kryo, thunderx2t99, thunderx3t110, thunderx, thunderxt88, thunderxt81, thunderxt83, tsv110, a64fx, carmel, ampere1, grace{{$}} // RUN: not %clang_cc1 -triple i386--- -target-cpu not-a-cpu -fsyntax-only %s 2>&1 | FileCheck %s --check-prefix X86 // X86: error: unknown target CPU 'not-a-cpu' diff --git a/llvm/include/llvm/Support/AArch64TargetParser.def b/llvm/include/llvm/Support/AArch64TargetParser.def index 49ed806b1d56ac..2005638e38c3a9 100644 --- a/llvm/include/llvm/Support/AArch64TargetParser.def +++ b/llvm/include/llvm/Support/AArch64TargetParser.def @@ -315,3 +315,9 @@ AARCH64_CPU_NAME("ampere1", ARMV8_6A, FK_CRYPTO_NEON_FP_ARMV8, false, // Invalid CPU AARCH64_CPU_NAME("invalid", INVALID, FK_INVALID, true, AArch64::AEK_INVALID) #undef AARCH64_CPU_NAME + +#ifndef AARCH64_CPU_ALIAS +#define AARCH64_CPU_ALIAS(ALIAS,NAME) +#endif +AARCH64_CPU_ALIAS("grace", "neoverse-v2") +#undef AARCH64_CPU_ALIAS diff --git a/llvm/include/llvm/Support/AArch64TargetParser.h b/llvm/include/llvm/Support/AArch64TargetParser.h index 3f0981d27427b8..35b28413a88f77 100644 --- a/llvm/include/llvm/Support/AArch64TargetParser.h +++ b/llvm/include/llvm/Support/AArch64TargetParser.h @@ -109,6 +109,20 @@ const ARM::CpuNames AArch64CPUNames[] = { #include "AArch64TargetParser.def" }; +const struct { + const char *Alias; + size_t AliasLength; + const char *Name; + size_t NameLength; + + StringRef getAlias() const { return StringRef(Alias, AliasLength); } + StringRef getName() const { return StringRef(Name, NameLength); } +} AArch64CPUAliases[] = { +#define AARCH64_CPU_ALIAS(ALIAS,NAME) \ + {ALIAS, sizeof(ALIAS) - 1, NAME, sizeof(NAME) - 1}, +#include "AArch64TargetParser.def" +}; + const ArchKind ArchKinds[] = { #define AARCH64_ARCH(NAME, ID, CPU_ATTR, SUB_ARCH, ARCH_ATTR, ARCH_FPU, ARCH_BASE_EXT) \ ArchKind::ID, @@ -138,13 +152,7 @@ StringRef getSubArch(ArchKind AK); StringRef getArchExtName(unsigned ArchExtKind); StringRef getArchExtFeature(StringRef ArchExt); ArchKind convertV9toV8(ArchKind AK); - -// FIXME: We should be able to define CPU aliases in TargetParser. -inline StringRef resolveCPUAlias(StringRef CPU) { - if (CPU == "grace") - return "neoverse-v2"; - return CPU; -} +StringRef resolveCPUAlias(StringRef CPU); // Information by Name unsigned getDefaultFPU(StringRef CPU, ArchKind AK); diff --git a/llvm/lib/Support/AArch64TargetParser.cpp b/llvm/lib/Support/AArch64TargetParser.cpp index cb06f6146be1f8..ba02a80df23f1e 100644 --- a/llvm/lib/Support/AArch64TargetParser.cpp +++ b/llvm/lib/Support/AArch64TargetParser.cpp @@ -85,6 +85,14 @@ bool AArch64::getExtensionFeatures(uint64_t Extensions, return true; } +StringRef AArch64::resolveCPUAlias(StringRef CPU) { + return StringSwitch(CPU) +#define AARCH64_CPU_ALIAS(ALIAS,NAME) \ + .Case(ALIAS, NAME) +#include "../../include/llvm/Support/AArch64TargetParser.def" + .Default(CPU); +} + bool AArch64::getArchFeatures(AArch64::ArchKind AK, std::vector &Features) { if (AK == ArchKind::INVALID) @@ -164,6 +172,9 @@ void AArch64::fillValidCPUArchList(SmallVectorImpl &Values) { if (Arch.ArchID != ArchKind::INVALID) Values.push_back(Arch.getName()); } + + for (const auto &Alias: AArch64CPUAliases) + Values.push_back(Alias.getAlias()); } bool AArch64::isX18ReservedByDefault(const Triple &TT) { @@ -194,9 +205,17 @@ AArch64::ArchExtKind AArch64::parseArchExt(StringRef ArchExt) { } AArch64::ArchKind AArch64::parseCPUArch(StringRef CPU) { - for (const auto &C : AArch64CPUNames) { + // Resolve aliases first. + for (const auto &Alias : AArch64CPUAliases) { + if (CPU == Alias.getAlias()) { + CPU = Alias.getName(); + break; + } + } + // Then find the CPU name. + for (const auto &C : AArch64CPUNames) if (CPU == C.getName()) return C.ArchID; - } + return ArchKind::INVALID; } diff --git a/llvm/unittests/Support/TargetParserTest.cpp b/llvm/unittests/Support/TargetParserTest.cpp index e93f1695c70a88..805084ac1f295a 100644 --- a/llvm/unittests/Support/TargetParserTest.cpp +++ b/llvm/unittests/Support/TargetParserTest.cpp @@ -1295,7 +1295,8 @@ INSTANTIATE_TEST_SUITE_P( AArch64::AEK_LSE | AArch64::AEK_RDM, "8.2-A"))); -static constexpr unsigned NumAArch64CPUArchs = 58; +// Note: number of CPUs includes aliases. +static constexpr unsigned NumAArch64CPUArchs = 59; TEST(TargetParserTest, testAArch64CPUArchList) { SmallVector List;