Skip to content

Commit 7a6847e

Browse files
authored
[RISCV] Add partial validation of Z extension name to RISCVISAInfo::parseNormalizedArchString (#90895)
If 'z' is given as the complete extension name or with a digit after it, it will crash in the extension map compare function. Check for these cases and give an error.
1 parent 55ad294 commit 7a6847e

File tree

3 files changed

+16
-2
lines changed

3 files changed

+16
-2
lines changed

llvm/lib/Support/RISCVISAUtils.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
#include "llvm/Support/RISCVISAUtils.h"
14+
#include "llvm/ADT/StringExtras.h"
1415
#include <cassert>
1516

1617
using namespace llvm;
@@ -35,7 +36,7 @@ enum RankFlags {
3536
// Get the rank for single-letter extension, lower value meaning higher
3637
// priority.
3738
static unsigned singleLetterExtensionRank(char Ext) {
38-
assert(Ext >= 'a' && Ext <= 'z');
39+
assert(isLower(Ext));
3940
switch (Ext) {
4041
case 'i':
4142
return 0;

llvm/lib/TargetParser/RISCVISAInfo.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,11 @@ RISCVISAInfo::parseNormalizedArchString(StringRef Arch) {
485485
if (MajorVersionStr.getAsInteger(10, MajorVersion))
486486
return createStringError(errc::invalid_argument,
487487
"failed to parse major version number");
488+
489+
if (ExtName[0] == 'z' && (ExtName.size() == 1 || isDigit(ExtName[1])))
490+
return createStringError(errc::invalid_argument,
491+
"'z' must be followed by a letter");
492+
488493
ISAInfo->addExtension(ExtName, {MajorVersion, MinorVersion});
489494
}
490495
ISAInfo->updateImpliedLengths();

llvm/unittests/TargetParser/RISCVISAInfoTest.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,22 @@ TEST(ParseNormalizedArchString, RejectsMalformedInputs) {
4646
}
4747
}
4848

49-
TEST(ParseNormalizedArchString, OnlyVersion) {
49+
TEST(ParseNormalizedArchString, RejectsOnlyVersion) {
5050
for (StringRef Input : {"rv64i2p0_1p0", "rv32i2p0_1p0"}) {
5151
EXPECT_EQ(
5252
toString(RISCVISAInfo::parseNormalizedArchString(Input).takeError()),
5353
"missing extension name");
5454
}
5555
}
5656

57+
TEST(ParseNormalizedArchString, RejectsBadZ) {
58+
for (StringRef Input : {"rv64i2p0_z1p0", "rv32i2p0_z2a1p0"}) {
59+
EXPECT_EQ(
60+
toString(RISCVISAInfo::parseNormalizedArchString(Input).takeError()),
61+
"'z' must be followed by a letter");
62+
}
63+
}
64+
5765
TEST(ParseNormalizedArchString, AcceptsValidBaseISAsAndSetsXLen) {
5866
auto MaybeRV32I = RISCVISAInfo::parseNormalizedArchString("rv32i2p0");
5967
ASSERT_THAT_EXPECTED(MaybeRV32I, Succeeded());

0 commit comments

Comments
 (0)