Index: include/llvm/Support/TargetParser.h =================================================================== --- include/llvm/Support/TargetParser.h +++ include/llvm/Support/TargetParser.h @@ -137,6 +137,7 @@ ArchKind parseArch(StringRef Arch); unsigned parseArchExt(StringRef ArchExt); ArchKind parseCPUArch(StringRef CPU); +void fillValidCPUArchList(SmallVectorImpl &Values); ISAKind parseArchISA(StringRef Arch); EndianKind parseArchEndian(StringRef Arch); ProfileKind parseArchProfile(StringRef Arch); @@ -205,6 +206,7 @@ AArch64::ArchKind parseArch(StringRef Arch); ArchExtKind parseArchExt(StringRef ArchExt); ArchKind parseCPUArch(StringRef CPU); +void fillValidCPUArchList(SmallVectorImpl &Values); ARM::ISAKind parseArchISA(StringRef Arch); ARM::EndianKind parseArchEndian(StringRef Arch); ARM::ProfileKind parseArchProfile(StringRef Arch); Index: lib/Support/TargetParser.cpp =================================================================== --- lib/Support/TargetParser.cpp +++ lib/Support/TargetParser.cpp @@ -689,6 +689,20 @@ return ARM::ArchKind::INVALID; } +void llvm::ARM::fillValidCPUArchList(SmallVectorImpl &Values) { + for (const CpuNames &Arch : CPUNames) { + if (Arch.ArchID != ARM::ArchKind::INVALID) + Values.emplace_back(Arch.NameCStr, Arch.NameLength); + } +} + +void llvm::AArch64::fillValidCPUArchList(SmallVectorImpl &Values) { + for (const CpuNames &Arch : AArch64CPUNames) { + if (Arch.ArchID != AArch64::ArchKind::INVALID) + Values.emplace_back(Arch.NameCStr, Arch.NameLength); + } +} + // ARM, Thumb, AArch64 ARM::ISAKind ARM::parseArchISA(StringRef Arch) { return StringSwitch(Arch) Index: unittests/Support/TargetParserTest.cpp =================================================================== --- unittests/Support/TargetParserTest.cpp +++ unittests/Support/TargetParserTest.cpp @@ -279,6 +279,20 @@ "7-S")); } +static const int NumARMCPUArchs = 82; + +TEST(TargetParserTest, testARMCPUArchList) { + SmallVector List; + ARM::fillValidCPUArchList(List); + + // No list exists for these in this test suite, so ensure all are + // valid, and match the expected 'magic' count. + EXPECT_EQ(List.size(), NumARMCPUArchs); + for(StringRef CPU : List) { + EXPECT_NE(ARM::parseCPUArch(CPU), ARM::ArchKind::INVALID); + } +} + TEST(TargetParserTest, testInvalidARMArch) { auto InvalidArchStrings = {"armv", "armv99", "noarm"}; for (const char* InvalidArch : InvalidArchStrings) @@ -747,6 +761,20 @@ "8-A")); } +static const int NumAArch64CPUArchs = 19; + +TEST(TargetParserTest, testAArch64CPUArchList) { + SmallVector List; + AArch64::fillValidCPUArchList(List); + + // No list exists for these in this test suite, so ensure all are + // valid, and match the expected 'magic' count. + EXPECT_EQ(List.size(), NumAArch64CPUArchs); + for(StringRef CPU : List) { + EXPECT_NE(AArch64::parseCPUArch(CPU), AArch64::ArchKind::INVALID); + } +} + bool testAArch64Arch(StringRef Arch, StringRef DefaultCPU, StringRef SubArch, unsigned ArchAttr) { AArch64::ArchKind AK = AArch64::parseArch(Arch);