From d1ad006a8f64bdc17f618deffa9e7c91d82c444d Mon Sep 17 00:00:00 2001 From: Craig Topper Date: Tue, 27 Sep 2022 10:04:30 -0700 Subject: [PATCH] [Driver] Prevent Mips specific code from claiming -mabi argument on other targets. Fixes PR57976. Reviewed By: erichkeane, arichardson, MaskRay Differential Revision: https://reviews.llvm.org/D134671 --- clang/lib/Driver/Driver.cpp | 52 +++++++++++++++++++++++---------------------- clang/test/Driver/mabi.c | 6 ++++++ 2 files changed, 33 insertions(+), 25 deletions(-) create mode 100644 clang/test/Driver/mabi.c diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index c16797f..73ee0b9 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -634,36 +634,38 @@ static llvm::Triple computeTargetTriple(const Driver &D, // If target is MIPS adjust the target triple // accordingly to provided ABI name. - A = Args.getLastArg(options::OPT_mabi_EQ); - if (A && Target.isMIPS()) { - StringRef ABIName = A->getValue(); - if (ABIName == "32") { - Target = Target.get32BitArchVariant(); - if (Target.getEnvironment() == llvm::Triple::GNUABI64 || - Target.getEnvironment() == llvm::Triple::GNUABIN32) - Target.setEnvironment(llvm::Triple::GNU); - } else if (ABIName == "n32") { - Target = Target.get64BitArchVariant(); - if (Target.getEnvironment() == llvm::Triple::GNU || - Target.getEnvironment() == llvm::Triple::GNUABI64) - Target.setEnvironment(llvm::Triple::GNUABIN32); - } else if (ABIName == "64") { - Target = Target.get64BitArchVariant(); - if (Target.getEnvironment() == llvm::Triple::GNU || - Target.getEnvironment() == llvm::Triple::GNUABIN32) - Target.setEnvironment(llvm::Triple::GNUABI64); + if (Target.isMIPS()) { + if (A = Args.getLastArg(options::OPT_mabi_EQ)) { + StringRef ABIName = A->getValue(); + if (ABIName == "32") { + Target = Target.get32BitArchVariant(); + if (Target.getEnvironment() == llvm::Triple::GNUABI64 || + Target.getEnvironment() == llvm::Triple::GNUABIN32) + Target.setEnvironment(llvm::Triple::GNU); + } else if (ABIName == "n32") { + Target = Target.get64BitArchVariant(); + if (Target.getEnvironment() == llvm::Triple::GNU || + Target.getEnvironment() == llvm::Triple::GNUABI64) + Target.setEnvironment(llvm::Triple::GNUABIN32); + } else if (ABIName == "64") { + Target = Target.get64BitArchVariant(); + if (Target.getEnvironment() == llvm::Triple::GNU || + Target.getEnvironment() == llvm::Triple::GNUABIN32) + Target.setEnvironment(llvm::Triple::GNUABI64); + } } } // If target is RISC-V adjust the target triple according to // provided architecture name - A = Args.getLastArg(options::OPT_march_EQ); - if (A && Target.isRISCV()) { - StringRef ArchName = A->getValue(); - if (ArchName.startswith_insensitive("rv32")) - Target.setArch(llvm::Triple::riscv32); - else if (ArchName.startswith_insensitive("rv64")) - Target.setArch(llvm::Triple::riscv64); + if (Target.isRISCV()) { + if (A = Args.getLastArg(options::OPT_march_EQ)) { + StringRef ArchName = A->getValue(); + if (ArchName.startswith_insensitive("rv32")) + Target.setArch(llvm::Triple::riscv32); + else if (ArchName.startswith_insensitive("rv64")) + Target.setArch(llvm::Triple::riscv64); + } } return Target; diff --git a/clang/test/Driver/mabi.c b/clang/test/Driver/mabi.c new file mode 100644 index 0000000..01e494d --- /dev/null +++ b/clang/test/Driver/mabi.c @@ -0,0 +1,6 @@ +// RUN: %clang --target=i386-unknown-linux -mabi=ms -S %s -### 2>&1 | FileCheck --check-prefix=CHECK %s + +int f() { + // CHECK: warning: argument unused during compilation: '-mabi=ms' + return 0; +} -- 2.7.4