diff options
author | Florian Hahn <florian.hahn@arm.com> | 2017-07-27 16:27:56 +0000 |
---|---|---|
committer | Florian Hahn <florian.hahn@arm.com> | 2017-07-27 16:27:56 +0000 |
commit | 5a3180dd84bc8dbaa53ab07756adbd5adacbad8f (patch) | |
tree | 37c2b58b251290a2b72b037a649031d4280ac969 /lib/Support/Triple.cpp | |
parent | fb84191e188ade23d753f5abb54fb6c17872d7b4 (diff) |
[TargetParser] Use enum classes for various ARM kind enums.
Summary:
Using c++11 enum classes ensures that only valid enum values are used
for ArchKind, ProfileKind, VersionKind and ISAKind. This removes the
need for checks that the provided values map to a proper enum value,
allows us to get rid of AK_LAST and prevents comparing values from
different enums. It also removes a bunch of static_cast
from unsigned to enum values and vice versa, at the cost of introducing
static casts to access AArch64ARCHNames and ARMARCHNames by ArchKind.
FPUKind and ArchExtKind are the only remaining old-style enum in
TargetParser.h. I think it's beneficial to keep ArchExtKind as old-style
enum, but FPUKind can be converted too, but this patch is quite big, so
could do this in a follow-up patch. I could also split this patch up a
bit, if people would prefer that.
Reviewers: rengolin, javed.absar, chandlerc, rovka
Reviewed By: rovka
Subscribers: aemerson, kristof.beyls, llvm-commits
Differential Revision: https://reviews.llvm.org/D35882
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@309287 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support/Triple.cpp')
-rw-r--r-- | lib/Support/Triple.cpp | 89 |
1 files changed, 48 insertions, 41 deletions
diff --git a/lib/Support/Triple.cpp b/lib/Support/Triple.cpp index b5b7a955fdc..018f993c2dc 100644 --- a/lib/Support/Triple.cpp +++ b/lib/Support/Triple.cpp @@ -307,39 +307,46 @@ Triple::ArchType Triple::getArchTypeForLLVMName(StringRef Name) { } static Triple::ArchType parseARMArch(StringRef ArchName) { - unsigned ISA = ARM::parseArchISA(ArchName); - unsigned ENDIAN = ARM::parseArchEndian(ArchName); + ARM::ISAKind ISA = ARM::parseArchISA(ArchName); + ARM::EndianKind ENDIAN = ARM::parseArchEndian(ArchName); Triple::ArchType arch = Triple::UnknownArch; switch (ENDIAN) { - case ARM::EK_LITTLE: { + case ARM::EndianKind::LITTLE: { switch (ISA) { - case ARM::IK_ARM: + case ARM::ISAKind::ARM: arch = Triple::arm; break; - case ARM::IK_THUMB: + case ARM::ISAKind::THUMB: arch = Triple::thumb; break; - case ARM::IK_AARCH64: + case ARM::ISAKind::AARCH64: arch = Triple::aarch64; break; + case ARM::ISAKind::INVALID: + break; } break; } - case ARM::EK_BIG: { + case ARM::EndianKind::BIG: { switch (ISA) { - case ARM::IK_ARM: + case ARM::ISAKind::ARM: arch = Triple::armeb; break; - case ARM::IK_THUMB: + case ARM::ISAKind::THUMB: arch = Triple::thumbeb; break; - case ARM::IK_AARCH64: + case ARM::ISAKind::AARCH64: arch = Triple::aarch64_be; break; + case ARM::ISAKind::INVALID: + break; } break; } + case ARM::EndianKind::INVALID: { + break; + } } ArchName = ARM::getCanonicalArchName(ArchName); @@ -347,15 +354,15 @@ static Triple::ArchType parseARMArch(StringRef ArchName) { return Triple::UnknownArch; // Thumb only exists in v4+ - if (ISA == ARM::IK_THUMB && + if (ISA == ARM::ISAKind::THUMB && (ArchName.startswith("v2") || ArchName.startswith("v3"))) return Triple::UnknownArch; // Thumb only for v6m - unsigned Profile = ARM::parseArchProfile(ArchName); + ARM::ProfileKind Profile = ARM::parseArchProfile(ArchName); unsigned Version = ARM::parseArchVersion(ArchName); - if (Profile == ARM::PK_M && Version == 6) { - if (ENDIAN == ARM::EK_BIG) + if (Profile == ARM::ProfileKind::M && Version == 6) { + if (ENDIAN == ARM::EndianKind::BIG) return Triple::thumbeb; else return Triple::thumb; @@ -534,51 +541,51 @@ static Triple::SubArchType parseSubArch(StringRef SubArchName) { // ARM sub arch. switch(ARM::parseArch(ARMSubArch)) { - case ARM::AK_ARMV4: + case ARM::ArchKind::ARMV4: return Triple::NoSubArch; - case ARM::AK_ARMV4T: + case ARM::ArchKind::ARMV4T: return Triple::ARMSubArch_v4t; - case ARM::AK_ARMV5T: + case ARM::ArchKind::ARMV5T: return Triple::ARMSubArch_v5; - case ARM::AK_ARMV5TE: - case ARM::AK_IWMMXT: - case ARM::AK_IWMMXT2: - case ARM::AK_XSCALE: - case ARM::AK_ARMV5TEJ: + case ARM::ArchKind::ARMV5TE: + case ARM::ArchKind::IWMMXT: + case ARM::ArchKind::IWMMXT2: + case ARM::ArchKind::XSCALE: + case ARM::ArchKind::ARMV5TEJ: return Triple::ARMSubArch_v5te; - case ARM::AK_ARMV6: + case ARM::ArchKind::ARMV6: return Triple::ARMSubArch_v6; - case ARM::AK_ARMV6K: - case ARM::AK_ARMV6KZ: + case ARM::ArchKind::ARMV6K: + case ARM::ArchKind::ARMV6KZ: return Triple::ARMSubArch_v6k; - case ARM::AK_ARMV6T2: + case ARM::ArchKind::ARMV6T2: return Triple::ARMSubArch_v6t2; - case ARM::AK_ARMV6M: + case ARM::ArchKind::ARMV6M: return Triple::ARMSubArch_v6m; - case ARM::AK_ARMV7A: - case ARM::AK_ARMV7R: + case ARM::ArchKind::ARMV7A: + case ARM::ArchKind::ARMV7R: return Triple::ARMSubArch_v7; - case ARM::AK_ARMV7VE: + case ARM::ArchKind::ARMV7VE: return Triple::ARMSubArch_v7ve; - case ARM::AK_ARMV7K: + case ARM::ArchKind::ARMV7K: return Triple::ARMSubArch_v7k; - case ARM::AK_ARMV7M: + case ARM::ArchKind::ARMV7M: return Triple::ARMSubArch_v7m; - case ARM::AK_ARMV7S: + case ARM::ArchKind::ARMV7S: return Triple::ARMSubArch_v7s; - case ARM::AK_ARMV7EM: + case ARM::ArchKind::ARMV7EM: return Triple::ARMSubArch_v7em; - case ARM::AK_ARMV8A: + case ARM::ArchKind::ARMV8A: return Triple::ARMSubArch_v8; - case ARM::AK_ARMV8_1A: + case ARM::ArchKind::ARMV8_1A: return Triple::ARMSubArch_v8_1a; - case ARM::AK_ARMV8_2A: + case ARM::ArchKind::ARMV8_2A: return Triple::ARMSubArch_v8_2a; - case ARM::AK_ARMV8R: + case ARM::ArchKind::ARMV8R: return Triple::ARMSubArch_v8r; - case ARM::AK_ARMV8MBaseline: + case ARM::ArchKind::ARMV8MBaseline: return Triple::ARMSubArch_v8m_baseline; - case ARM::AK_ARMV8MMainline: + case ARM::ArchKind::ARMV8MMainline: return Triple::ARMSubArch_v8m_mainline; default: return Triple::NoSubArch; @@ -1550,7 +1557,7 @@ StringRef Triple::getARMCPUForArch(StringRef MArch) const { return StringRef(); StringRef CPU = ARM::getDefaultCPU(MArch); - if (!CPU.empty()) + if (!CPU.empty() && !CPU.equals("invalid")) return CPU; // If no specific architecture version is requested, return the minimum CPU |