diff --git a/llvm/include/llvm/Support/ARMTargetParser.h b/llvm/include/llvm/Support/ARMTargetParser.h --- a/llvm/include/llvm/Support/ARMTargetParser.h +++ b/llvm/include/llvm/Support/ARMTargetParser.h @@ -16,6 +16,7 @@ #include "llvm/ADT/StringRef.h" #include "llvm/Support/ARMBuildAttributes.h" +#include "llvm/Support/ARMTargetParserCommon.h" #include namespace llvm { @@ -158,13 +159,6 @@ Crypto ///< Neon with Crypto }; -// ISA kinds. -enum class ISAKind { INVALID = 0, ARM, THUMB, AARCH64 }; - -// Endianness -// FIXME: BE8 vs. BE32? -enum class EndianKind { INVALID = 0, LITTLE, BIG }; - // v6/v7/v8 Profile enum class ProfileKind { INVALID = 0, A, R, M }; @@ -226,7 +220,7 @@ } }; -static const ArchNames ARCHNames[] = { +static const ArchNames ARMArchNames[] = { #define ARM_ARCH(NAME, ID, CPU_ATTR, SUB_ARCH, ARCH_ATTR, ARCH_FPU, \ ARCH_BASE_EXT) \ {NAME, sizeof(NAME) - 1, \ @@ -287,8 +281,6 @@ ArchKind parseArch(StringRef Arch); uint64_t parseArchExt(StringRef ArchExt); ArchKind parseCPUArch(StringRef CPU); -ISAKind parseArchISA(StringRef Arch); -EndianKind parseArchEndian(StringRef Arch); ProfileKind parseArchProfile(StringRef Arch); unsigned parseArchVersion(StringRef Arch); diff --git a/llvm/include/llvm/Support/ARMTargetParserCommon.h b/llvm/include/llvm/Support/ARMTargetParserCommon.h --- a/llvm/include/llvm/Support/ARMTargetParserCommon.h +++ b/llvm/include/llvm/Support/ARMTargetParserCommon.h @@ -18,6 +18,10 @@ namespace llvm { namespace ARM { +enum class ISAKind { INVALID = 0, ARM, THUMB, AARCH64 }; + +enum class EndianKind { INVALID = 0, LITTLE, BIG }; + /// Converts e.g. "armv8" -> "armv8-a" StringRef getArchSynonym(StringRef Arch); @@ -27,6 +31,12 @@ /// If invalid, return empty string. StringRef getCanonicalArchName(StringRef Arch); +// ARM, Thumb, AArch64 +ISAKind parseArchISA(StringRef Arch); + +// Little/Big endian +EndianKind parseArchEndian(StringRef Arch); + } // namespace ARM } // namespace llvm #endif diff --git a/llvm/lib/Support/ARMTargetParser.cpp b/llvm/lib/Support/ARMTargetParser.cpp --- a/llvm/lib/Support/ARMTargetParser.cpp +++ b/llvm/lib/Support/ARMTargetParser.cpp @@ -29,7 +29,7 @@ ARM::ArchKind ARM::parseArch(StringRef Arch) { Arch = getCanonicalArchName(Arch); StringRef Syn = getArchSynonym(Arch); - for (const auto &A : ARCHNames) { + for (const auto &A : ARMArchNames) { if (A.getName().endswith(Syn)) return A.ID; } @@ -211,35 +211,6 @@ return true; } -// Little/Big endian -ARM::EndianKind ARM::parseArchEndian(StringRef Arch) { - if (Arch.startswith("armeb") || Arch.startswith("thumbeb") || - Arch.startswith("aarch64_be")) - return EndianKind::BIG; - - if (Arch.startswith("arm") || Arch.startswith("thumb")) { - if (Arch.endswith("eb")) - return EndianKind::BIG; - else - return EndianKind::LITTLE; - } - - if (Arch.startswith("aarch64") || Arch.startswith("aarch64_32")) - return EndianKind::LITTLE; - - return EndianKind::INVALID; -} - -// ARM, Thumb, AArch64 -ARM::ISAKind ARM::parseArchISA(StringRef Arch) { - return StringSwitch(Arch) - .StartsWith("aarch64", ISAKind::AARCH64) - .StartsWith("arm64", ISAKind::AARCH64) - .StartsWith("thumb", ISAKind::THUMB) - .StartsWith("arm", ISAKind::ARM) - .Default(ISAKind::INVALID); -} - unsigned ARM::parseFPU(StringRef FPU) { StringRef Syn = getFPUSynonym(FPU); for (const auto &F : FPUNames) { @@ -292,7 +263,7 @@ unsigned ARM::getDefaultFPU(StringRef CPU, ARM::ArchKind AK) { if (CPU == "generic") - return ARM::ARCHNames[static_cast(AK)].DefaultFPU; + return ARM::ARMArchNames[static_cast(AK)].DefaultFPU; return StringSwitch(CPU) #define ARM_CPU_NAME(NAME, ID, DEFAULT_FPU, IS_DEFAULT, DEFAULT_EXT) \ @@ -303,12 +274,12 @@ uint64_t ARM::getDefaultExtensions(StringRef CPU, ARM::ArchKind AK) { if (CPU == "generic") - return ARM::ARCHNames[static_cast(AK)].ArchBaseExtensions; + return ARM::ARMArchNames[static_cast(AK)].ArchBaseExtensions; return StringSwitch(CPU) #define ARM_CPU_NAME(NAME, ID, DEFAULT_FPU, IS_DEFAULT, DEFAULT_EXT) \ .Case(NAME, \ - ARCHNames[static_cast(ArchKind::ID)].ArchBaseExtensions | \ + ARMArchNames[static_cast(ArchKind::ID)].ArchBaseExtensions | \ DEFAULT_EXT) #include "llvm/Support/ARMTargetParser.def" .Default(ARM::AEK_INVALID); @@ -350,19 +321,19 @@ } StringRef ARM::getArchName(ARM::ArchKind AK) { - return ARCHNames[static_cast(AK)].getName(); + return ARMArchNames[static_cast(AK)].getName(); } StringRef ARM::getCPUAttr(ARM::ArchKind AK) { - return ARCHNames[static_cast(AK)].getCPUAttr(); + return ARMArchNames[static_cast(AK)].getCPUAttr(); } StringRef ARM::getSubArch(ARM::ArchKind AK) { - return ARCHNames[static_cast(AK)].getSubArch(); + return ARMArchNames[static_cast(AK)].getSubArch(); } unsigned ARM::getArchAttr(ARM::ArchKind AK) { - return ARCHNames[static_cast(AK)].ArchAttr; + return ARMArchNames[static_cast(AK)].ArchAttr; } StringRef ARM::getArchExtName(uint64_t ArchExtKind) { diff --git a/llvm/lib/Support/ARMTargetParserCommon.cpp b/llvm/lib/Support/ARMTargetParserCommon.cpp --- a/llvm/lib/Support/ARMTargetParserCommon.cpp +++ b/llvm/lib/Support/ARMTargetParserCommon.cpp @@ -103,3 +103,30 @@ // Arch will either be a 'v' name (v7a) or a marketing name (xscale). return A; } + +ARM::ISAKind ARM::parseArchISA(StringRef Arch) { + return StringSwitch(Arch) + .StartsWith("aarch64", ISAKind::AARCH64) + .StartsWith("arm64", ISAKind::AARCH64) + .StartsWith("thumb", ISAKind::THUMB) + .StartsWith("arm", ISAKind::ARM) + .Default(ISAKind::INVALID); +} + +ARM::EndianKind ARM::parseArchEndian(StringRef Arch) { + if (Arch.startswith("armeb") || Arch.startswith("thumbeb") || + Arch.startswith("aarch64_be")) + return EndianKind::BIG; + + if (Arch.startswith("arm") || Arch.startswith("thumb")) { + if (Arch.endswith("eb")) + return EndianKind::BIG; + else + return EndianKind::LITTLE; + } + + if (Arch.startswith("aarch64") || Arch.startswith("aarch64_32")) + return EndianKind::LITTLE; + + return EndianKind::INVALID; +} diff --git a/llvm/lib/Support/Triple.cpp b/llvm/lib/Support/Triple.cpp --- a/llvm/lib/Support/Triple.cpp +++ b/llvm/lib/Support/Triple.cpp @@ -11,6 +11,7 @@ #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/Support/ARMTargetParser.h" +#include "llvm/Support/ARMTargetParserCommon.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/Host.h" #include "llvm/Support/SwapByteOrder.h"