Skip to content

Commit

Permalink
[RISCV] Add partial validation of Z extension name to RISCVISAInfo::p…
Browse files Browse the repository at this point in the history
…arseNormalizedArchString (#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.
  • Loading branch information
topperc committed May 3, 2024
1 parent 55ad294 commit 7a6847e
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 2 deletions.
3 changes: 2 additions & 1 deletion llvm/lib/Support/RISCVISAUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
//===----------------------------------------------------------------------===//

#include "llvm/Support/RISCVISAUtils.h"
#include "llvm/ADT/StringExtras.h"
#include <cassert>

using namespace llvm;
Expand All @@ -35,7 +36,7 @@ enum RankFlags {
// Get the rank for single-letter extension, lower value meaning higher
// priority.
static unsigned singleLetterExtensionRank(char Ext) {
assert(Ext >= 'a' && Ext <= 'z');
assert(isLower(Ext));
switch (Ext) {
case 'i':
return 0;
Expand Down
5 changes: 5 additions & 0 deletions llvm/lib/TargetParser/RISCVISAInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -485,6 +485,11 @@ RISCVISAInfo::parseNormalizedArchString(StringRef Arch) {
if (MajorVersionStr.getAsInteger(10, MajorVersion))
return createStringError(errc::invalid_argument,
"failed to parse major version number");

if (ExtName[0] == 'z' && (ExtName.size() == 1 || isDigit(ExtName[1])))
return createStringError(errc::invalid_argument,
"'z' must be followed by a letter");

ISAInfo->addExtension(ExtName, {MajorVersion, MinorVersion});
}
ISAInfo->updateImpliedLengths();
Expand Down
10 changes: 9 additions & 1 deletion llvm/unittests/TargetParser/RISCVISAInfoTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,22 @@ TEST(ParseNormalizedArchString, RejectsMalformedInputs) {
}
}

TEST(ParseNormalizedArchString, OnlyVersion) {
TEST(ParseNormalizedArchString, RejectsOnlyVersion) {
for (StringRef Input : {"rv64i2p0_1p0", "rv32i2p0_1p0"}) {
EXPECT_EQ(
toString(RISCVISAInfo::parseNormalizedArchString(Input).takeError()),
"missing extension name");
}
}

TEST(ParseNormalizedArchString, RejectsBadZ) {
for (StringRef Input : {"rv64i2p0_z1p0", "rv32i2p0_z2a1p0"}) {
EXPECT_EQ(
toString(RISCVISAInfo::parseNormalizedArchString(Input).takeError()),
"'z' must be followed by a letter");
}
}

TEST(ParseNormalizedArchString, AcceptsValidBaseISAsAndSetsXLen) {
auto MaybeRV32I = RISCVISAInfo::parseNormalizedArchString("rv32i2p0");
ASSERT_THAT_EXPECTED(MaybeRV32I, Succeeded());
Expand Down

0 comments on commit 7a6847e

Please sign in to comment.