diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2023-09-02 21:17:18 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2023-12-08 17:34:50 +0000 |
commit | 06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e (patch) | |
tree | 62f873df87c7c675557a179e0c4c83fe9f3087bc /contrib/llvm-project/llvm/lib/TargetParser/RISCVTargetParser.cpp | |
parent | cf037972ea8863e2bab7461d77345367d2c1e054 (diff) | |
parent | 7fa27ce4a07f19b07799a767fc29416f3b625afb (diff) |
Diffstat (limited to 'contrib/llvm-project/llvm/lib/TargetParser/RISCVTargetParser.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/TargetParser/RISCVTargetParser.cpp | 87 |
1 files changed, 35 insertions, 52 deletions
diff --git a/contrib/llvm-project/llvm/lib/TargetParser/RISCVTargetParser.cpp b/contrib/llvm-project/llvm/lib/TargetParser/RISCVTargetParser.cpp index 933a82b7c6cb..30a1023c0673 100644 --- a/contrib/llvm-project/llvm/lib/TargetParser/RISCVTargetParser.cpp +++ b/contrib/llvm-project/llvm/lib/TargetParser/RISCVTargetParser.cpp @@ -7,7 +7,7 @@ //===----------------------------------------------------------------------===// // // This file implements a target parser to recognise hardware features -// FOR RISC-V CPUS. +// for RISC-V CPUs. // //===----------------------------------------------------------------------===// @@ -19,92 +19,75 @@ namespace llvm { namespace RISCV { +enum CPUKind : unsigned { +#define PROC(ENUM, NAME, DEFAULT_MARCH) CK_##ENUM, +#define TUNE_PROC(ENUM, NAME) CK_##ENUM, +#include "llvm/TargetParser/RISCVTargetParserDef.inc" +}; + struct CPUInfo { StringLiteral Name; - CPUKind Kind; StringLiteral DefaultMarch; - bool isInvalid() const { return DefaultMarch.empty(); } bool is64Bit() const { return DefaultMarch.starts_with("rv64"); } }; constexpr CPUInfo RISCVCPUInfo[] = { #define PROC(ENUM, NAME, DEFAULT_MARCH) \ - {NAME, CK_##ENUM, DEFAULT_MARCH}, + {NAME, DEFAULT_MARCH}, #include "llvm/TargetParser/RISCVTargetParserDef.inc" }; -bool checkCPUKind(CPUKind Kind, bool IsRV64) { - if (Kind == CK_INVALID) - return false; - return RISCVCPUInfo[static_cast<unsigned>(Kind)].is64Bit() == IsRV64; +static const CPUInfo *getCPUInfoByName(StringRef CPU) { + for (auto &C : RISCVCPUInfo) + if (C.Name == CPU) + return &C; + return nullptr; } -bool checkTuneCPUKind(CPUKind Kind, bool IsRV64) { - if (Kind == CK_INVALID) - return false; -#define TUNE_PROC(ENUM, NAME) \ - if (Kind == CK_##ENUM) \ - return true; -#include "llvm/TargetParser/RISCVTargetParserDef.inc" - return RISCVCPUInfo[static_cast<unsigned>(Kind)].is64Bit() == IsRV64; -} +bool parseCPU(StringRef CPU, bool IsRV64) { + const CPUInfo *Info = getCPUInfoByName(CPU); -CPUKind parseCPUKind(StringRef CPU) { - return llvm::StringSwitch<CPUKind>(CPU) -#define PROC(ENUM, NAME, DEFAULT_MARCH) .Case(NAME, CK_##ENUM) -#include "llvm/TargetParser/RISCVTargetParserDef.inc" - .Default(CK_INVALID); + if (!Info) + return false; + return Info->is64Bit() == IsRV64; } -CPUKind parseTuneCPUKind(StringRef TuneCPU, bool IsRV64) { - return llvm::StringSwitch<CPUKind>(TuneCPU) -#define PROC(ENUM, NAME, DEFAULT_MARCH) .Case(NAME, CK_##ENUM) +bool parseTuneCPU(StringRef TuneCPU, bool IsRV64) { + std::optional<CPUKind> Kind = + llvm::StringSwitch<std::optional<CPUKind>>(TuneCPU) #define TUNE_PROC(ENUM, NAME) .Case(NAME, CK_##ENUM) -#include "llvm/TargetParser/RISCVTargetParserDef.inc" - .Default(CK_INVALID); + #include "llvm/TargetParser/RISCVTargetParserDef.inc" + .Default(std::nullopt); + + if (Kind.has_value()) + return true; + + // Fallback to parsing as a CPU. + return parseCPU(TuneCPU, IsRV64); } StringRef getMArchFromMcpu(StringRef CPU) { - CPUKind Kind = parseCPUKind(CPU); - return RISCVCPUInfo[static_cast<unsigned>(Kind)].DefaultMarch; + const CPUInfo *Info = getCPUInfoByName(CPU); + if (!Info) + return ""; + return Info->DefaultMarch; } void fillValidCPUArchList(SmallVectorImpl<StringRef> &Values, bool IsRV64) { for (const auto &C : RISCVCPUInfo) { - if (C.Kind != CK_INVALID && IsRV64 == C.is64Bit()) + if (IsRV64 == C.is64Bit()) Values.emplace_back(C.Name); } } void fillValidTuneCPUArchList(SmallVectorImpl<StringRef> &Values, bool IsRV64) { for (const auto &C : RISCVCPUInfo) { - if (C.Kind != CK_INVALID && IsRV64 == C.is64Bit()) + if (IsRV64 == C.is64Bit()) Values.emplace_back(C.Name); } #define TUNE_PROC(ENUM, NAME) Values.emplace_back(StringRef(NAME)); #include "llvm/TargetParser/RISCVTargetParserDef.inc" } -// Get all features except standard extension feature -bool getCPUFeaturesExceptStdExt(CPUKind Kind, - std::vector<StringRef> &Features) { - const CPUInfo &Info = RISCVCPUInfo[static_cast<unsigned>(Kind)]; - - if (Info.isInvalid()) - return false; - - if (Info.is64Bit()) - Features.push_back("+64bit"); - else - Features.push_back("-64bit"); - - return true; -} - -bool isX18ReservedByDefault(const Triple &TT) { - // X18 is reserved for the ShadowCallStack ABI (even when not enabled). - return TT.isOSFuchsia(); -} - } // namespace RISCV } // namespace llvm |