Skip to content

Commit d8f8ac8

Browse files
authored
[RISCV] Don't pre-split before the loop in parseNormalizedArchString. (#91684)
We can extract each extension as we process them without much complexity. I changed the error message for cases where there are double underscores or a trailing underscore. I think this is an improvement over the previous error.
1 parent b8f4f39 commit d8f8ac8

File tree

2 files changed

+19
-5
lines changed

2 files changed

+19
-5
lines changed

llvm/lib/TargetParser/RISCVISAInfo.cpp

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -451,9 +451,18 @@ RISCVISAInfo::parseNormalizedArchString(StringRef Arch) {
451451
// Each extension is of the form ${name}${major_version}p${minor_version}
452452
// and separated by _. Split by _ and then extract the name and version
453453
// information for each extension.
454-
SmallVector<StringRef, 8> Split;
455-
Arch.split(Split, '_');
456-
for (StringRef Ext : Split) {
454+
while (!Arch.empty()) {
455+
if (Arch[0] == '_') {
456+
if (Arch.size() == 1 || Arch[1] == '_')
457+
return createStringError(errc::invalid_argument,
458+
"extension name missing after separator '_'");
459+
Arch = Arch.drop_front();
460+
}
461+
462+
size_t Idx = Arch.find('_');
463+
StringRef Ext = Arch.slice(0, Idx);
464+
Arch = Arch.slice(Idx, StringRef::npos);
465+
457466
StringRef Prefix, MinorVersionStr;
458467
std::tie(Prefix, MinorVersionStr) = Ext.rsplit('p');
459468
if (MinorVersionStr.empty())

llvm/unittests/TargetParser/RISCVISAInfoTest.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,17 @@ TEST(ParseNormalizedArchString, RejectsInvalidBaseISA) {
3838
}
3939

4040
TEST(ParseNormalizedArchString, RejectsMalformedInputs) {
41-
for (StringRef Input :
42-
{"rv64i2p0_", "rv32i2p0__a2p0", "rv64e2p", "rv32i", "rv64ip1"}) {
41+
for (StringRef Input : {"rv64e2p", "rv32i", "rv64ip1"}) {
4342
EXPECT_EQ(
4443
toString(RISCVISAInfo::parseNormalizedArchString(Input).takeError()),
4544
"extension lacks version in expected format");
4645
}
46+
47+
for (StringRef Input : {"rv64i2p0_", "rv32i2p0__a2p0"}) {
48+
EXPECT_EQ(
49+
toString(RISCVISAInfo::parseNormalizedArchString(Input).takeError()),
50+
"extension name missing after separator '_'");
51+
}
4752
}
4853

4954
TEST(ParseNormalizedArchString, RejectsOnlyVersion) {

0 commit comments

Comments
 (0)