Skip to content

Commit 0d93b01

Browse files
authored
[RISCV] Don't crash if parseNormalizedArchString encounters a multi-letter extension with an unknown prefix. (#91398)
The sorting code previously asserted if a prefix was multiple letters, but didn't start with s, x, or z. Replace the assert with an explicit check and sort the multi-letter extension after the known multi-letter prefixes.
1 parent ef84452 commit 0d93b01

File tree

2 files changed

+15
-4
lines changed

2 files changed

+15
-4
lines changed

llvm/lib/Support/RISCVISAUtils.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,15 @@ using namespace llvm;
2424
// -Multi-letter extensions starting with 's' in alphabetical order.
2525
// -(TODO) Multi-letter extensions starting with 'zxm' in alphabetical order.
2626
// -X extensions in alphabetical order.
27+
// -Unknown multi-letter extensions in alphabetical order.
2728
// These flags are used to indicate the category. The first 6 bits store the
2829
// single letter extension rank for single letter and multi-letter extensions
2930
// starting with 'z'.
3031
enum RankFlags {
3132
RF_Z_EXTENSION = 1 << 6,
32-
RF_S_EXTENSION = 1 << 7,
33-
RF_X_EXTENSION = 1 << 8,
33+
RF_S_EXTENSION = 2 << 6,
34+
RF_X_EXTENSION = 3 << 6,
35+
RF_UNKNOWN_MULTILETTER_EXTENSION = 4 << 6,
3436
};
3537

3638
// Get the rank for single-letter extension, lower value meaning higher
@@ -68,8 +70,9 @@ static unsigned getExtensionRank(const std::string &ExtName) {
6870
case 'x':
6971
return RF_X_EXTENSION;
7072
default:
71-
assert(ExtName.size() == 1);
72-
return singleLetterExtensionRank(ExtName[0]);
73+
if (ExtName.size() == 1)
74+
return singleLetterExtensionRank(ExtName[0]);
75+
return RF_UNKNOWN_MULTILETTER_EXTENSION;
7376
}
7477
}
7578

llvm/unittests/TargetParser/RISCVISAInfoTest.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,14 @@ TEST(ParseNormalizedArchString, UpdatesFLenMinVLenMaxELen) {
150150
EXPECT_EQ(Info.getMaxELenFp(), 64U);
151151
}
152152

153+
TEST(ParseNormalizedArchString, AcceptsUnknownMultiletter) {
154+
auto MaybeISAInfo = RISCVISAInfo::parseNormalizedArchString(
155+
"rv64i2p0_f2p0_d2p0_zicsr2p0_ykk1p0");
156+
ASSERT_THAT_EXPECTED(MaybeISAInfo, Succeeded());
157+
RISCVISAInfo &Info = **MaybeISAInfo;
158+
EXPECT_EQ(Info.toString(), "rv64i2p0_f2p0_d2p0_zicsr2p0_ykk1p0");
159+
}
160+
153161
TEST(ParseArchString, RejectsInvalidChars) {
154162
for (StringRef Input : {"RV32", "rV64", "rv32i2P0", "rv64i2p0_A2p0"}) {
155163
EXPECT_EQ(toString(RISCVISAInfo::parseArchString(Input, true).takeError()),

0 commit comments

Comments
 (0)