aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/TargetParser/RISCVTargetParser.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2023-09-02 21:17:18 +0000
committerDimitry Andric <dim@FreeBSD.org>2023-12-08 17:34:50 +0000
commit06c3fb2749bda94cb5201f81ffdb8fa6c3161b2e (patch)
tree62f873df87c7c675557a179e0c4c83fe9f3087bc /contrib/llvm-project/llvm/lib/TargetParser/RISCVTargetParser.cpp
parentcf037972ea8863e2bab7461d77345367d2c1e054 (diff)
parent7fa27ce4a07f19b07799a767fc29416f3b625afb (diff)
Diffstat (limited to 'contrib/llvm-project/llvm/lib/TargetParser/RISCVTargetParser.cpp')
-rw-r--r--contrib/llvm-project/llvm/lib/TargetParser/RISCVTargetParser.cpp87
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