[llvm] 1b942ae - [RISCV] Use consume_front to parse rv32/rv64 in RISCVISAInfo::parse*ArchString. NFC (#90562)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 30 08:13:26 PDT 2024
Author: Craig Topper
Date: 2024-04-30T08:13:23-07:00
New Revision: 1b942ae3843ca943a249288612e69df0b2fc188b
URL: https://github.com/llvm/llvm-project/commit/1b942ae3843ca943a249288612e69df0b2fc188b
DIFF: https://github.com/llvm/llvm-project/commit/1b942ae3843ca943a249288612e69df0b2fc188b.diff
LOG: [RISCV] Use consume_front to parse rv32/rv64 in RISCVISAInfo::parse*ArchString. NFC (#90562)
This replaces some starts_with calls wth consume_front. This allows us
to remove a later assumption that prefix was 4 characters. We would
eventually need to fix this anyway if we ever support rv128.
Noticed while reviewing the RISCVISAInfo code for other reasons.
Added:
Modified:
llvm/lib/TargetParser/RISCVISAInfo.cpp
Removed:
################################################################################
diff --git a/llvm/lib/TargetParser/RISCVISAInfo.cpp b/llvm/lib/TargetParser/RISCVISAInfo.cpp
index aec82a94cf97bc..96f1a7a512020b 100644
--- a/llvm/lib/TargetParser/RISCVISAInfo.cpp
+++ b/llvm/lib/TargetParser/RISCVISAInfo.cpp
@@ -430,17 +430,17 @@ RISCVISAInfo::parseNormalizedArchString(StringRef Arch) {
"string must be lowercase");
}
// Must start with a valid base ISA name.
- unsigned XLen;
- if (Arch.starts_with("rv32i") || Arch.starts_with("rv32e"))
+ unsigned XLen = 0;
+ if (Arch.consume_front("rv32"))
XLen = 32;
- else if (Arch.starts_with("rv64i") || Arch.starts_with("rv64e"))
+ else if (Arch.consume_front("rv64"))
XLen = 64;
- else
+
+ if (XLen == 0 || Arch.empty() || (Arch[0] != 'i' && Arch[0] != 'e'))
return createStringError(errc::invalid_argument,
"arch string must begin with valid base ISA");
+
std::unique_ptr<RISCVISAInfo> ISAInfo(new RISCVISAInfo(XLen));
- // Discard rv32/rv64 prefix.
- Arch = Arch.substr(4);
// Each extension is of the form ${name}${major_version}p${minor_version}
// and separated by _. Split by _ and then extract the name and version
@@ -616,15 +616,18 @@ RISCVISAInfo::parseArchString(StringRef Arch, bool EnableExperimentalExtension,
ExperimentalExtensionVersionCheck, IgnoreUnknown);
}
- bool HasRV64 = Arch.starts_with("rv64");
// ISA string must begin with rv32 or rv64.
- if (!(Arch.starts_with("rv32") || HasRV64) || (Arch.size() < 5)) {
+ unsigned XLen = 0;
+ if (Arch.consume_front("rv32"))
+ XLen = 32;
+ else if (Arch.consume_front("rv64"))
+ XLen = 64;
+
+ if (XLen == 0 || Arch.empty())
return createStringError(
errc::invalid_argument,
"string must begin with rv32{i,e,g} or rv64{i,e,g}");
- }
- unsigned XLen = HasRV64 ? 64 : 32;
std::unique_ptr<RISCVISAInfo> ISAInfo(new RISCVISAInfo(XLen));
MapVector<std::string, RISCVISAUtils::ExtensionVersion,
std::map<std::string, unsigned>>
@@ -632,20 +635,20 @@ RISCVISAInfo::parseArchString(StringRef Arch, bool EnableExperimentalExtension,
// The canonical order specified in ISA manual.
// Ref: Table 22.1 in RISC-V User-Level ISA V2.2
- char Baseline = Arch[4];
+ char Baseline = Arch.front();
// First letter should be 'e', 'i' or 'g'.
switch (Baseline) {
default:
return createStringError(errc::invalid_argument,
- "first letter after \'" + Arch.slice(0, 4) +
+ "first letter after \'rv" + Twine(XLen) +
"\' should be 'e', 'i' or 'g'");
case 'e':
case 'i':
break;
case 'g':
// g expands to extensions in RISCVGImplications.
- if (Arch.size() > 5 && isDigit(Arch[5]))
+ if (Arch.size() > 1 && isDigit(Arch[1]))
return createStringError(errc::invalid_argument,
"version not supported for 'g'");
break;
@@ -655,8 +658,8 @@ RISCVISAInfo::parseArchString(StringRef Arch, bool EnableExperimentalExtension,
return createStringError(errc::invalid_argument,
"extension name missing after separator '_'");
- // Skip rvxxx
- StringRef Exts = Arch.substr(5);
+ // Skip baseline.
+ StringRef Exts = Arch.drop_front(1);
unsigned Major, Minor, ConsumeLength;
if (Baseline == 'g') {
More information about the llvm-commits
mailing list