Skip to content

Commit 941eab1

Browse files
authored
[RISCV] Make parseNormalizedArchString only accept [a-z0-9_]. (#90815)
Previously we only rejected upper case characters. We should instead reject anything except lower case, numbers, and underscore. Other characters will likely confuse the extension sorting.
1 parent eb82363 commit 941eab1

File tree

2 files changed

+10
-7
lines changed

2 files changed

+10
-7
lines changed

llvm/lib/TargetParser/RISCVISAInfo.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -429,9 +429,11 @@ RISCVISAInfo::parseFeatures(unsigned XLen,
429429

430430
llvm::Expected<std::unique_ptr<RISCVISAInfo>>
431431
RISCVISAInfo::parseNormalizedArchString(StringRef Arch) {
432-
if (llvm::any_of(Arch, isupper))
432+
// RISC-V ISA strings must be [a-z0-9_]
433+
if (!llvm::all_of(
434+
Arch, [](char C) { return isDigit(C) || isLower(C) || C == '_'; }))
433435
return createStringError(errc::invalid_argument,
434-
"string must be lowercase");
436+
"string may only contain [a-z0-9_]");
435437

436438
// Must start with a valid base ISA name.
437439
unsigned XLen = 0;

llvm/unittests/TargetParser/RISCVISAInfoTest.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@ bool operator==(const RISCVISAUtils::ExtensionVersion &A,
2020
return A.Major == B.Major && A.Minor == B.Minor;
2121
}
2222

23-
TEST(ParseNormalizedArchString, RejectsUpperCase) {
24-
for (StringRef Input : {"RV32", "rV64", "rv32i2P0", "rv64i2p0_A2p0"}) {
23+
TEST(ParseNormalizedArchString, RejectsInvalidChars) {
24+
for (StringRef Input :
25+
{"RV32", "rV64", "rv32i2P0", "rv64i2p0_A2p0", "rv32e2.0"}) {
2526
EXPECT_EQ(
2627
toString(RISCVISAInfo::parseNormalizedArchString(Input).takeError()),
27-
"string must be lowercase");
28+
"string may only contain [a-z0-9_]");
2829
}
2930
}
3031

@@ -37,8 +38,8 @@ TEST(ParseNormalizedArchString, RejectsInvalidBaseISA) {
3738
}
3839

3940
TEST(ParseNormalizedArchString, RejectsMalformedInputs) {
40-
for (StringRef Input : {"rv64i2p0_", "rv32i2p0__a2p0", "rv32e2.0", "rv64e2p",
41-
"rv32i", "rv64ip1"}) {
41+
for (StringRef Input :
42+
{"rv64i2p0_", "rv32i2p0__a2p0", "rv64e2p", "rv32i", "rv64ip1"}) {
4243
EXPECT_EQ(
4344
toString(RISCVISAInfo::parseNormalizedArchString(Input).takeError()),
4445
"extension lacks version in expected format");

0 commit comments

Comments
 (0)