Index: include/llvm/Support/TargetParser.h =================================================================== --- include/llvm/Support/TargetParser.h +++ include/llvm/Support/TargetParser.h @@ -90,6 +90,7 @@ AEK_IWMMXT2 = 0x20000000, AEK_MAVERICK = 0x40000000, AEK_XSCALE = 0x80000000, + AEK_LAST = 0x2000 }; // ISA kinds. @@ -162,7 +163,8 @@ AEK_SIMD = 0x10, AEK_FP16 = 0x20, AEK_PROFILE = 0x40, - AEK_RAS = 0x80 + AEK_RAS = 0x80, + AEK_LAST = 0x100 }; StringRef getCanonicalArchName(StringRef Arch); Index: lib/Support/TargetParser.cpp =================================================================== --- lib/Support/TargetParser.cpp +++ lib/Support/TargetParser.cpp @@ -202,7 +202,7 @@ bool llvm::ARM::getHWDivFeatures(unsigned HWDivKind, std::vector &Features) { - if (HWDivKind == ARM::AEK_INVALID) + if (HWDivKind >= ARM::AEK_LAST || HWDivKind == ARM::AEK_INVALID) return false; if (HWDivKind & ARM::AEK_HWDIVARM) @@ -221,7 +221,7 @@ bool llvm::ARM::getExtensionFeatures(unsigned Extensions, std::vector &Features) { - if (Extensions == ARM::AEK_INVALID) + if (Extensions >= ARM::AEK_LAST || Extensions == ARM::AEK_INVALID) return false; if (Extensions & ARM::AEK_CRC) @@ -431,7 +431,7 @@ bool llvm::AArch64::getExtensionFeatures(unsigned Extensions, std::vector &Features) { - if (Extensions == AArch64::AEK_INVALID) + if (Extensions >= AArch64::AEK_LAST || Extensions == AArch64::AEK_INVALID) return false; if (Extensions & AArch64::AEK_FP) Index: unittests/Support/TargetParserTest.cpp =================================================================== --- unittests/Support/TargetParserTest.cpp +++ unittests/Support/TargetParserTest.cpp @@ -16,6 +16,18 @@ using namespace llvm; namespace { +static const unsigned kHWDivKinds[] = { +#define ARM_HW_DIV_NAME(NAME, ID) ID, +#include "llvm/Support/ARMTargetParser.def" +#undef ARM_HW_DIV_NAME +}; + +static const unsigned kARMArchExtKinds[] = { +#define ARM_ARCH_EXT_NAME(NAME, ID, FEATURE, NEGFEATURE) ID, +#include "llvm/Support/ARMTargetParser.def" +#undef ARM_ARCH_EXT_NAME +}; + static const unsigned kAArch64ArchExtKinds[] = { #define AARCH64_ARCH_EXT_NAME(NAME, ID, FEATURE, NEGFEATURE) ID, #include "llvm/Support/AArch64TargetParser.def" @@ -201,6 +213,15 @@ : (kARMARCHNames[AK].ArchAttr == ARM::getArchAttr(AK))); } +TEST(TargetParserTest, ARMArchExtName) { + for (ARM::ArchExtKind AEK = static_cast(0); + AEK <= ARM::ArchExtKind::AEK_LAST; + AEK = static_cast(static_cast(AEK) + 1)) + EXPECT_TRUE(contains(kARMArchExtKinds, static_cast(AEK)) + ? !ARM::getArchExtName(AEK).empty() + : ARM::getArchExtName(AEK).empty()); +} + TEST(TargetParserTest, ARMArchExtFeature) { const char *ArchExt[][4] = {{"crc", "nocrc", "+crc", "-crc"}, {"crypto", "nocrypto", "+crypto", "-crypto"}, @@ -225,6 +246,15 @@ } } +TEST(TargetParserTest, ARMHWDivName) { + for (ARM::ArchExtKind AEK = static_cast(0); + AEK <= ARM::ArchExtKind::AEK_LAST; + AEK = static_cast(static_cast(AEK) + 1)) + EXPECT_TRUE(contains(kHWDivKinds, static_cast(AEK)) + ? !ARM::getHWDivName(AEK).empty() + : ARM::getHWDivName(AEK).empty()); +} + TEST(TargetParserTest, ARMDefaultCPU) { for (unsigned i = 0; i < array_lengthof(ARMArch); i++) EXPECT_FALSE(ARM::getDefaultCPU(ARMArch[i]).empty()); @@ -481,7 +511,7 @@ TEST(TargetParserTest, AArch64ArchExtName) { for (AArch64::ArchExtKind AEK = static_cast(0); - AEK <= AArch64::ArchExtKind::AEK_RAS; + AEK <= AArch64::ArchExtKind::AEK_LAST; AEK = static_cast(static_cast(AEK) + 1)) EXPECT_TRUE(contains(kAArch64ArchExtKinds, static_cast(AEK)) ? !AArch64::getArchExtName(AEK).empty()