summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Support/TargetParser.cpp41
-rw-r--r--llvm/unittests/Support/TargetParserTest.cpp41
2 files changed, 62 insertions, 20 deletions
diff --git a/llvm/lib/Support/TargetParser.cpp b/llvm/lib/Support/TargetParser.cpp
index 720b3d0b837..9e6b9221f76 100644
--- a/llvm/lib/Support/TargetParser.cpp
+++ b/llvm/lib/Support/TargetParser.cpp
@@ -462,50 +462,52 @@ bool llvm::AArch64::getArchFeatures(unsigned ArchKind,
}
StringRef llvm::AArch64::getArchName(unsigned ArchKind) {
- if (ArchKind >= ARM::AK_LAST)
- return StringRef();
- return AArch64ARCHNames[ArchKind].getName();
+ for (const auto &AI : AArch64ARCHNames)
+ if (AI.ID == ArchKind)
+ return AI.getName();
+ return StringRef();
}
StringRef llvm::AArch64::getCPUAttr(unsigned ArchKind) {
- if (ArchKind == ARM::AK_INVALID || ArchKind >= ARM::AK_LAST)
- return StringRef();
- return AArch64ARCHNames[ArchKind].getCPUAttr();
+ for (const auto &AI : AArch64ARCHNames)
+ if (AI.ID == ArchKind)
+ return AI.getCPUAttr();
+ return StringRef();
}
StringRef llvm::AArch64::getSubArch(unsigned ArchKind) {
- if (ArchKind == ARM::AK_INVALID || ArchKind >= ARM::AK_LAST)
- return StringRef();
- return AArch64ARCHNames[ArchKind].getSubArch();
+ for (const auto &AI : AArch64ARCHNames)
+ if (AI.ID == ArchKind)
+ return AI.getSubArch();
+ return StringRef();
}
unsigned llvm::AArch64::getArchAttr(unsigned ArchKind) {
- if (ArchKind >= ARM::AK_LAST)
- return ARMBuildAttrs::CPUArch::v8_A;
- return AArch64ARCHNames[ArchKind].ArchAttr;
+ for (const auto &AI : AArch64ARCHNames)
+ if (AI.ID == ArchKind)
+ return AI.ArchAttr;
+ return ARMBuildAttrs::CPUArch::v8_A;
}
StringRef llvm::AArch64::getArchExtName(unsigned AArchExtKind) {
- for (const auto AE : AArch64ARCHExtNames) {
+ for (const auto &AE : AArch64ARCHExtNames)
if (AArchExtKind == AE.ID)
return AE.getName();
- }
return StringRef();
}
const char *llvm::AArch64::getArchExtFeature(StringRef ArchExt) {
if (ArchExt.startswith("no")) {
StringRef ArchExtBase(ArchExt.substr(2));
- for (const auto AE : AArch64ARCHExtNames) {
+ for (const auto &AE : AArch64ARCHExtNames) {
if (AE.NegFeature && ArchExtBase == AE.getName())
return AE.NegFeature;
}
}
- for (const auto AE : AArch64ARCHExtNames) {
+
+ for (const auto &AE : AArch64ARCHExtNames)
if (AE.Feature && ArchExt == AE.getName())
return AE.Feature;
- }
-
return nullptr;
}
@@ -515,10 +517,9 @@ StringRef llvm::AArch64::getDefaultCPU(StringRef Arch) {
return StringRef();
// Look for multiple AKs to find the default for pair AK+Name.
- for (const auto CPU : AArch64CPUNames) {
+ for (const auto &CPU : AArch64CPUNames)
if (CPU.ArchID == AK && CPU.Default)
return CPU.getName();
- }
// If we can't find a default then target the architecture instead
return "generic";
diff --git a/llvm/unittests/Support/TargetParserTest.cpp b/llvm/unittests/Support/TargetParserTest.cpp
index 4bdf03aa861..21994f27b73 100644
--- a/llvm/unittests/Support/TargetParserTest.cpp
+++ b/llvm/unittests/Support/TargetParserTest.cpp
@@ -13,6 +13,20 @@
using namespace llvm;
namespace {
+static const unsigned kAArch64ArchKinds[] = {
+#define AARCH64_ARCH(NAME, ID, CPU_ATTR, SUB_ARCH, ARCH_ATTR, ARCH_FPU, \
+ ARCH_BASE_EXT) \
+ llvm::ARM::ID,
+#include "llvm/Support/AArch64TargetParser.def"
+#undef AARCH64_ARCH
+};
+
+template <typename T, size_t N>
+bool contains(const T (&array)[N], const T element) {
+ return std::find(std::begin(array), std::end(array), element) !=
+ std::end(array);
+}
+
TEST(TargetParserTest, ARMArchName) {
for (ARM::ArchKind AK = static_cast<ARM::ArchKind>(0);
AK <= ARM::ArchKind::AK_LAST;
@@ -47,5 +61,32 @@ TEST(TargetParserTest, ARMFPUName) {
EXPECT_TRUE(FK == ARM::FK_LAST ? ARM::getFPUName(FK).empty()
: !ARM::getFPUName(FK).empty());
}
+
+TEST(TargetParserTest, AArch64ArchName) {
+ for (ARM::ArchKind AK = static_cast<ARM::ArchKind>(0);
+ AK <= ARM::ArchKind::AK_LAST;
+ AK = static_cast<ARM::ArchKind>(static_cast<unsigned>(AK) + 1))
+ EXPECT_TRUE(contains(kAArch64ArchKinds, static_cast<unsigned>(AK))
+ ? !AArch64::getArchName(AK).empty()
+ : AArch64::getArchName(AK).empty());
+}
+
+TEST(TargetParserTest, AArch64CPUAttr) {
+ for (ARM::ArchKind AK = static_cast<ARM::ArchKind>(0);
+ AK <= ARM::ArchKind::AK_LAST;
+ AK = static_cast<ARM::ArchKind>(static_cast<unsigned>(AK) + 1))
+ EXPECT_TRUE(contains(kAArch64ArchKinds, static_cast<unsigned>(AK))
+ ? !AArch64::getCPUAttr(AK).empty()
+ : AArch64::getCPUAttr(AK).empty());
+}
+
+TEST(TargetParserTest, AArch64SubArch) {
+ for (ARM::ArchKind AK = static_cast<ARM::ArchKind>(0);
+ AK <= ARM::ArchKind::AK_LAST;
+ AK = static_cast<ARM::ArchKind>(static_cast<unsigned>(AK) + 1))
+ EXPECT_TRUE(contains(kAArch64ArchKinds, static_cast<unsigned>(AK))
+ ? !AArch64::getSubArch(AK).empty()
+ : AArch64::getSubArch(AK).empty());
+}
}
OpenPOWER on IntegriCloud