Skip to content

Commit 11f74cd

Browse files
authored
[RISCV] Improve error message when the extension is not supported (llvm#83989)
If the "march" has some extension with version that is not supported, it returns the error message like: "error: invalid arch name 'some_arch', unsupported version number 2.0 for extension 'some_arch'", which is not precise enough, it should return the message that only tells users "the extension is not supported".
1 parent 2a1b09f commit 11f74cd

File tree

3 files changed

+33
-12
lines changed

3 files changed

+33
-12
lines changed

clang/test/Driver/riscv-arch.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -306,7 +306,7 @@
306306
// RUN: not %clang --target=riscv32-unknown-elf -march=rv32ist2p0 -### %s \
307307
// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-SMINOR0 %s
308308
// RV32-SMINOR0: error: invalid arch name 'rv32ist2p0',
309-
// RV32-SMINOR0: unsupported version number 2.0 for extension 'st'
309+
// RV32-SMINOR0: unsupported standard supervisor-level extension 'st'
310310

311311
// RUN: not %clang --target=riscv32-unknown-elf -march=rv32ixabc_ -### %s \
312312
// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-XSEP %s
@@ -397,7 +397,7 @@
397397

398398
// RUN: not %clang --target=riscv32-unknown-elf -march=rv32izbb1p0zbs1p0 -menable-experimental-extensions -### %s \
399399
// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-EXPERIMENTAL-ZBB-ZBS-UNDERSCORE %s
400-
// RV32-EXPERIMENTAL-ZBB-ZBS-UNDERSCORE: error: invalid arch name 'rv32izbb1p0zbs1p0', unsupported version number 1.0 for extension 'zbb1p0zbs'
400+
// RV32-EXPERIMENTAL-ZBB-ZBS-UNDERSCORE: error: invalid arch name 'rv32izbb1p0zbs1p0', unsupported standard user-level extension 'zbb1p0zbs'
401401

402402
// RUN: %clang --target=riscv32-unknown-elf -march=rv32izba1p0 -### %s \
403403
// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-ZBA %s

llvm/lib/Support/RISCVISAInfo.cpp

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,17 @@ std::vector<std::string> RISCVISAInfo::toFeatures(bool AddAllExtensions,
531531
return Features;
532532
}
533533

534+
static Error getStringErrorForInvalidExt(std::string_view ExtName) {
535+
if (ExtName.size() == 1) {
536+
return createStringError(errc::invalid_argument,
537+
"unsupported standard user-level extension '" +
538+
ExtName + "'");
539+
}
540+
return createStringError(errc::invalid_argument,
541+
"unsupported " + getExtensionTypeDesc(ExtName) +
542+
" '" + ExtName + "'");
543+
}
544+
534545
// Extensions may have a version number, and may be separated by
535546
// an underscore '_' e.g.: rv32i2_m2.
536547
// Version number is divided into major and minor version numbers,
@@ -629,6 +640,9 @@ static Error getExtensionVersion(StringRef Ext, StringRef In, unsigned &Major,
629640
if (RISCVISAInfo::isSupportedExtension(Ext, Major, Minor))
630641
return Error::success();
631642

643+
if (!RISCVISAInfo::isSupportedExtension(Ext))
644+
return getStringErrorForInvalidExt(Ext);
645+
632646
std::string Error = "unsupported version number " + std::string(MajorStr);
633647
if (!MinorStr.empty())
634648
Error += "." + MinorStr.str();
@@ -965,16 +979,8 @@ RISCVISAInfo::parseArchString(StringRef Arch, bool EnableExperimentalExtension,
965979
const std::string &ExtName = SeenExtAndVers.first;
966980
RISCVISAInfo::ExtensionVersion ExtVers = SeenExtAndVers.second;
967981

968-
if (!RISCVISAInfo::isSupportedExtension(ExtName)) {
969-
if (ExtName.size() == 1) {
970-
return createStringError(errc::invalid_argument,
971-
"unsupported standard user-level extension '" +
972-
ExtName + "'");
973-
}
974-
return createStringError(errc::invalid_argument,
975-
"unsupported " + getExtensionTypeDesc(ExtName) +
976-
" '" + ExtName + "'");
977-
}
982+
if (!RISCVISAInfo::isSupportedExtension(ExtName))
983+
return getStringErrorForInvalidExt(ExtName);
978984
ISAInfo->addExtension(ExtName, ExtVers);
979985
}
980986

llvm/unittests/Support/RISCVISAInfoTest.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,21 @@ TEST(ParseArchString, RejectsUnrecognizedExtensionNamesByDefault) {
218218
toString(
219219
RISCVISAInfo::parseArchString("rv64g_xmadeup", true).takeError()),
220220
"unsupported non-standard user-level extension 'xmadeup'");
221+
EXPECT_EQ(
222+
toString(RISCVISAInfo::parseArchString("rv64ib1p0", true).takeError()),
223+
"unsupported standard user-level extension 'b'");
224+
EXPECT_EQ(
225+
toString(
226+
RISCVISAInfo::parseArchString("rv32i_zmadeup1p0", true).takeError()),
227+
"unsupported standard user-level extension 'zmadeup'");
228+
EXPECT_EQ(
229+
toString(
230+
RISCVISAInfo::parseArchString("rv64g_smadeup1p0", true).takeError()),
231+
"unsupported standard supervisor-level extension 'smadeup'");
232+
EXPECT_EQ(
233+
toString(
234+
RISCVISAInfo::parseArchString("rv64g_xmadeup1p0", true).takeError()),
235+
"unsupported non-standard user-level extension 'xmadeup'");
221236
}
222237

223238
TEST(ParseArchString, IgnoresUnrecognizedExtensionNamesWithIgnoreUnknown) {

0 commit comments

Comments
 (0)