Author: Kito Cheng Date: 2023-04-27T14:46:01+08:00 New Revision: da4fcb0c0b281746067f92d8804c18dbce4269bd
URL: https://github.com/llvm/llvm-project/commit/da4fcb0c0b281746067f92d8804c18dbce4269bd DIFF: https://github.com/llvm/llvm-project/commit/da4fcb0c0b281746067f92d8804c18dbce4269bd.diff LOG: [RISCV][Driver] Allow the use of CPUs with a different XLEN than the triple. Our downstream toolchain release got some issue is we set the default triple by creating symbolic link of clang like `riscv64-unknown-elf-clang`, and has lots of multi-lib config including rv32's config. However when we trying to set arch by a 32 bit CPU like generic-rv32 but got error message below: error: unsupported argument 'generic-rv32' to option '-mcpu=' `generic-rv32` is listed in the output of `-mcpu=help`, that might be confusing for user since help message say supported. So let clang driver also consider -mcpu option during computing the target triple to archvie that. Reviewed By: asb, craig.topper Differential Revision: https://reviews.llvm.org/D148124 Added: Modified: clang/lib/Driver/Driver.cpp clang/test/Driver/riscv-arch.c clang/test/Driver/riscv-cpus.c Removed: ################################################################################ diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index 4c8a83e6ff28a..509191762f8b4 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -12,6 +12,7 @@ #include "ToolChains/AMDGPUOpenMP.h" #include "ToolChains/AVR.h" #include "ToolChains/Ananas.h" +#include "ToolChains/Arch/RISCV.h" #include "ToolChains/BareMetal.h" #include "ToolChains/CSKYToolChain.h" #include "ToolChains/Clang.h" @@ -689,8 +690,9 @@ static llvm::Triple computeTargetTriple(const Driver &D, // If target is RISC-V adjust the target triple according to // provided architecture name if (Target.isRISCV()) { - if ((A = Args.getLastArg(options::OPT_march_EQ))) { - StringRef ArchName = A->getValue(); + if (Args.hasArg(options::OPT_march_EQ) || + Args.hasArg(options::OPT_mcpu_EQ)) { + StringRef ArchName = tools::riscv::getRISCVArch(Args, Target); if (ArchName.startswith_insensitive("rv32")) Target.setArch(llvm::Triple::riscv32); else if (ArchName.startswith_insensitive("rv64")) diff --git a/clang/test/Driver/riscv-arch.c b/clang/test/Driver/riscv-arch.c index 4d11db2a5e09a..5b9a45deb06a2 100644 --- a/clang/test/Driver/riscv-arch.c +++ b/clang/test/Driver/riscv-arch.c @@ -355,12 +355,20 @@ // RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-TARGET %s // RUN: %clang --target=riscv64-unknown-elf -march=rv32i -### %s \ // RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-TARGET %s +// RUN: %clang --target=riscv32-unknown-elf -mcpu=generic-rv32 -### %s \ +// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-TARGET %s +// RUN: %clang --target=riscv64-unknown-elf -mcpu=generic-rv32 -### %s \ +// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV32-TARGET %s // RV32-TARGET: "-triple" "riscv32-unknown-unknown-elf" // RUN: %clang --target=riscv32-unknown-elf -march=rv64i -### %s \ // RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV64-TARGET %s // RUN: %clang --target=riscv64-unknown-elf -march=rv64i -### %s \ // RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV64-TARGET %s +// RUN: %clang --target=riscv32-unknown-elf -mcpu=generic-rv64 -### %s \ +// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV64-TARGET %s +// RUN: %clang --target=riscv64-unknown-elf -mcpu=generic-rv64 -### %s \ +// RUN: -fsyntax-only 2>&1 | FileCheck -check-prefix=RV64-TARGET %s // RV64-TARGET: "-triple" "riscv64-unknown-unknown-elf" // RUN: %clang --target=riscv32-unknown-elf -march=rv32ifzfh01p0 -### %s \ diff --git a/clang/test/Driver/riscv-cpus.c b/clang/test/Driver/riscv-cpus.c index b107d89773e1c..76325311668d8 100644 --- a/clang/test/Driver/riscv-cpus.c +++ b/clang/test/Driver/riscv-cpus.c @@ -174,6 +174,3 @@ // RUN: %clang --target=riscv32 -### -c %s 2>&1 -mcpu=generic-rv32 -march=rv64i | FileCheck -check-prefix=MISMATCH-ARCH %s // 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: cpu 'generic-rv64' does not support rv32 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits