[llvm] 6cba93f - [RISCV] Add partial validation of S and X extension names to RISCVISAInfo::parseNormalizedArchString.
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Tue May 7 12:17:37 PDT 2024
Author: Craig Topper
Date: 2024-05-07T12:16:55-07:00
New Revision: 6cba93f25dc2014b5d8c71c739f17be1d8c3763a
URL: https://github.com/llvm/llvm-project/commit/6cba93f25dc2014b5d8c71c739f17be1d8c3763a
DIFF: https://github.com/llvm/llvm-project/commit/6cba93f25dc2014b5d8c71c739f17be1d8c3763a.diff
LOG: [RISCV] Add partial validation of S and X extension names to RISCVISAInfo::parseNormalizedArchString.
Extensions starting with 's' or 'x' should always be followed by an
alphabetical character. I don't know of any crashes from this currently,
but it seemed better to be defensive.
Added:
Modified:
llvm/lib/TargetParser/RISCVISAInfo.cpp
llvm/test/tools/llvm-objdump/ELF/RISCV/unknown-arch-attr.test
llvm/unittests/TargetParser/RISCVISAInfoTest.cpp
Removed:
################################################################################
diff --git a/llvm/lib/TargetParser/RISCVISAInfo.cpp b/llvm/lib/TargetParser/RISCVISAInfo.cpp
index 6ab5ee3508a67..9c2ac8c3893f1 100644
--- a/llvm/lib/TargetParser/RISCVISAInfo.cpp
+++ b/llvm/lib/TargetParser/RISCVISAInfo.cpp
@@ -486,9 +486,11 @@ RISCVISAInfo::parseNormalizedArchString(StringRef Arch) {
return createStringError(errc::invalid_argument,
"failed to parse major version number");
- if (ExtName[0] == 'z' && (ExtName.size() == 1 || isDigit(ExtName[1])))
+ if ((ExtName[0] == 'z' || ExtName[0] == 's' || ExtName[0] == 'x') &&
+ (ExtName.size() == 1 || isDigit(ExtName[1])))
return createStringError(errc::invalid_argument,
- "'z' must be followed by a letter");
+ "'" + Twine(ExtName[0]) +
+ "' must be followed by a letter");
ISAInfo->addExtension(ExtName, {MajorVersion, MinorVersion});
}
diff --git a/llvm/test/tools/llvm-objdump/ELF/RISCV/unknown-arch-attr.test b/llvm/test/tools/llvm-objdump/ELF/RISCV/unknown-arch-attr.test
index 35c8c6240d84b..704c9d4add0d1 100644
--- a/llvm/test/tools/llvm-objdump/ELF/RISCV/unknown-arch-attr.test
+++ b/llvm/test/tools/llvm-objdump/ELF/RISCV/unknown-arch-attr.test
@@ -3,7 +3,7 @@
## The expected behavior is to ignore the unrecognized arch feature and
## continue to process the following arch features.
##
-## The object file has the "rv32i2p0_m2p0_x1p0" arch feature. "x1p0" is an
+## The object file has the "rv32i2p0_m2p0_y1p0" arch feature. "y1p0" is an
## unrecognized architecture extension. llvm-objdump will ignore it and decode
## "mul" instruction correctly according to "m2p0" in the arch feature.
##
@@ -34,5 +34,5 @@ Sections:
Content: 3385C502
- Name: .riscv.attributes
Type: SHT_RISCV_ATTRIBUTES
-## The content is the encoding of the arch feature "rv32i2p0_m2p0_x1p0"
- Content: 412300000072697363760001190000000572763332693270305F6D3270305F7831703000
+## The content is the encoding of the arch feature "rv32i2p0_m2p0_y1p0"
+ Content: 412300000072697363760001190000000572763332693270305F6D3270305F7931703000
diff --git a/llvm/unittests/TargetParser/RISCVISAInfoTest.cpp b/llvm/unittests/TargetParser/RISCVISAInfoTest.cpp
index d813a8d7185f6..a6c21c18c0ecc 100644
--- a/llvm/unittests/TargetParser/RISCVISAInfoTest.cpp
+++ b/llvm/unittests/TargetParser/RISCVISAInfoTest.cpp
@@ -62,6 +62,22 @@ TEST(ParseNormalizedArchString, RejectsBadZ) {
}
}
+TEST(ParseNormalizedArchString, RejectsBadS) {
+ for (StringRef Input : {"rv64i2p0_s1p0", "rv32i2p0_s2a1p0"}) {
+ EXPECT_EQ(
+ toString(RISCVISAInfo::parseNormalizedArchString(Input).takeError()),
+ "'s' must be followed by a letter");
+ }
+}
+
+TEST(ParseNormalizedArchString, RejectsBadX) {
+ for (StringRef Input : {"rv64i2p0_x1p0", "rv32i2p0_x2a1p0"}) {
+ EXPECT_EQ(
+ toString(RISCVISAInfo::parseNormalizedArchString(Input).takeError()),
+ "'x' must be followed by a letter");
+ }
+}
+
TEST(ParseNormalizedArchString, AcceptsValidBaseISAsAndSetsXLen) {
auto MaybeRV32I = RISCVISAInfo::parseNormalizedArchString("rv32i2p0");
ASSERT_THAT_EXPECTED(MaybeRV32I, Succeeded());
More information about the llvm-commits
mailing list