[clang] 88d6311 - [RISCV] Print a better error message when a rv32 CPU is used on rv64 and vice versa.
Craig Topper via cfe-commits
cfe-commits at lists.llvm.org
Tue Apr 11 10:42:18 PDT 2023
Author: Craig Topper
Date: 2023-04-11T10:41:50-07:00
New Revision: 88d6311982557acf2dd04ce101aca077ac311012
URL: https://github.com/llvm/llvm-project/commit/88d6311982557acf2dd04ce101aca077ac311012
DIFF: https://github.com/llvm/llvm-project/commit/88d6311982557acf2dd04ce101aca077ac311012.diff
LOG: [RISCV] Print a better error message when a rv32 CPU is used on rv64 and vice versa.
Instead of rejecting the CPU outright with no information, try
to diagnose that it doesn't match the triple.
Differential Revision: https://reviews.llvm.org/D147986
Added:
Modified:
clang/include/clang/Basic/DiagnosticDriverKinds.td
clang/lib/Driver/ToolChains/Arch/RISCV.cpp
clang/test/Driver/riscv-cpus.c
Removed:
################################################################################
diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index 2c6bb0aa9331..1efe7573028e 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -29,6 +29,8 @@ def err_drv_invalid_arch_name : Error<
"invalid arch name '%0'">;
def err_drv_invalid_riscv_arch_name : Error<
"invalid arch name '%0', %1">;
+def err_drv_invalid_riscv_cpu_name_for_target : Error<
+ "cpu '%0' does not support rv%select{32|64}1">;
def warn_drv_invalid_arch_name_with_suggestion : Warning<
"ignoring invalid /arch: argument '%0'; for %select{64|32}1-bit expected one of %2">,
InGroup<UnusedCommandLineArgument>;
diff --git a/clang/lib/Driver/ToolChains/Arch/RISCV.cpp b/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
index 887442222210..7cf01ad8a72b 100644
--- a/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
@@ -49,11 +49,20 @@ static bool getArchFeatures(const Driver &D, StringRef Arch,
}
// Get features except standard extension feature
-static bool getRISCFeaturesFromMcpu(const llvm::Triple &Triple, StringRef Mcpu,
+static void getRISCFeaturesFromMcpu(const Driver &D, const Arg *A,
+ const llvm::Triple &Triple,
+ StringRef Mcpu,
std::vector<StringRef> &Features) {
bool Is64Bit = Triple.isRISCV64();
llvm::RISCV::CPUKind CPUKind = llvm::RISCV::parseCPUKind(Mcpu);
- return llvm::RISCV::checkCPUKind(CPUKind, Is64Bit);
+ if (!llvm::RISCV::checkCPUKind(CPUKind, Is64Bit)) {
+ // Try inverting Is64Bit in case the CPU is valid, but for the wrong target.
+ if (llvm::RISCV::checkCPUKind(CPUKind, !Is64Bit))
+ D.Diag(clang::diag::err_drv_invalid_riscv_cpu_name_for_target) << Mcpu << Is64Bit;
+ else
+ D.Diag(clang::diag::err_drv_unsupported_option_argument)
+ << A->getSpelling() << Mcpu;
+ }
}
void riscv::getRISCVTargetFeatures(const Driver &D, const llvm::Triple &Triple,
@@ -70,9 +79,8 @@ void riscv::getRISCVTargetFeatures(const Driver &D, const llvm::Triple &Triple,
StringRef CPU = A->getValue();
if (CPU == "native")
CPU = llvm::sys::getHostCPUName();
- if (!getRISCFeaturesFromMcpu(Triple, CPU, Features))
- D.Diag(clang::diag::err_drv_unsupported_option_argument)
- << A->getSpelling() << CPU;
+
+ getRISCFeaturesFromMcpu(D, A, Triple, CPU, Features);
}
// Handle features corresponding to "-ffixed-X" options
diff --git a/clang/test/Driver/riscv-cpus.c b/clang/test/Driver/riscv-cpus.c
index a57cbf1e0e25..b107d89773e1 100644
--- a/clang/test/Driver/riscv-cpus.c
+++ b/clang/test/Driver/riscv-cpus.c
@@ -173,7 +173,7 @@
// FAIL-MCPU-NAME: error: unsupported argument 'generic-rv321' to option '-mcpu='
// RUN: %clang --target=riscv32 -### -c %s 2>&1 -mcpu=generic-rv32 -march=rv64i | FileCheck -check-prefix=MISMATCH-ARCH %s
-// MISMATCH-ARCH: error: unsupported argument 'generic-rv32' to option '-mcpu='
+// MISMATCH-ARCH: cpu 'generic-rv32' does not support rv64
// RUN: %clang --target=riscv32 -### -c %s 2>&1 -mcpu=generic-rv64 | FileCheck -check-prefix=MISMATCH-MCPU %s
-// MISMATCH-MCPU: error: unsupported argument 'generic-rv64' to option '-mcpu='
+// MISMATCH-MCPU: error: cpu 'generic-rv64' does not support rv32
More information about the cfe-commits
mailing list