diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp --- 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 @@ // 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 --- 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 --- 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