From: John Brawn Date: Fri, 8 May 2015 12:52:18 +0000 (+0000) Subject: [ARM] Give an error on invalid -march values X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a67054279c030cfc5539938105fcccd27ce8485b;p=clang [ARM] Give an error on invalid -march values llvm::Triple::getARMCPUForArch now returns nullptr for invalid -march values, instead of silently translating it to arm7tdmi. Use this to give an error message, which is consistent with how gcc behaves. Differential Revision: http://reviews.llvm.org/D9602 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@236846 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index a6f650c2cc..88e4221710 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -743,6 +743,13 @@ static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple, if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ)) getARMHWDivFeatures(D, A, Args, Features); + // -march is handled in getARMCPUForMarch by translating it into a CPU name, + // but it needs to return an empty string on invalid arguments. We therefore + // check and give an error here if the -march is invalid. + if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) + if (!Triple.getARMCPUForArch(A->getValue())) + D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args); + // Setting -msoft-float effectively disables NEON because of the GCC // implementation, although the same isn't true of VFP or VFP3. if (FloatABI == "soft") { @@ -5619,7 +5626,13 @@ const char *arm::getARMCPUForMArch(const ArgList &Args, } } - return Triple.getARMCPUForArch(MArch); + // We need to return an empty string here on invalid MArch values as the + // various places that call this function can't cope with a null result. + const char *result = Triple.getARMCPUForArch(MArch); + if (result) + return result; + else + return ""; } /// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting. diff --git a/test/Driver/arm-cortex-cpus.c b/test/Driver/arm-cortex-cpus.c index 7810bdd971..5883800d95 100644 --- a/test/Driver/arm-cortex-cpus.c +++ b/test/Driver/arm-cortex-cpus.c @@ -166,11 +166,11 @@ // RUN: %clang -target arm -march=armebv8a -mbig-endian -mthumb -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BE-V8A-THUMB %s // CHECK-BE-V8A-THUMB: "-cc1"{{.*}} "-triple" "thumbebv8-{{.*}}" "-target-cpu" "cortex-a53" -// ================== Check default CPU on bogus architecture +// ================== Check that a bogus architecture gives an error // RUN: %clang -target arm -march=armbogusv6 -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BOGUS %s -// CHECK-BOGUS: "-cc1"{{.*}} "-triple" "armv4t-{{.*}} "-target-cpu" "arm7tdmi" +// CHECK-BOGUS: error: the clang compiler does not support '-march=armbogusv6' // RUN: %clang -target arm---eabihf -march=armbogusv7 -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-BOGUS-HF %s -// CHECK-BOGUS-HF: "-cc1"{{.*}} "-triple" "armv6k-{{.*}} "-target-cpu" "arm1176jzf-s" +// CHECK-BOGUS-HF: error: the clang compiler does not support '-march=armbogusv7' // ================== Check default Architecture on each ARM11 CPU // RUN: %clang -target arm-linux-gnueabi -mcpu=arm1136j-s -### -c %s 2>&1 | FileCheck -check-prefix=CHECK-CPUV6 %s