[Driver] Error if ARM mode was selected explicitly for M-profile CPUs.

Summary:
M-class profiles do not support ARM execution mode, so providing
-marm/-mno-thumb does not make sense in combination with -mcpu/-march
options that support the M-profile.

This is a follow-up patch to D35569 and it seemed pretty clear that we
should emit an error in the driver in this case.

We probably also should warn/error if the provided -mcpu/-march options
do not match, e.g. -mcpu=cortex-m0 -march=armv8-a is invalid, as
cortex-m0 does not support armv8-a. But that should be a separate patch
I think.


Reviewers: echristo, richard.barton.arm, rengolin, labrinea, charles.baylis

Reviewed By: rengolin

Subscribers: aemerson, javed.absar, kristof.beyls, cfe-commits

Differential Revision: https://reviews.llvm.org/D35826

llvm-svn: 310047
diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp
index 6c7a6c8..1e446dc 100644
--- a/clang/lib/Driver/ToolChain.cpp
+++ b/clang/lib/Driver/ToolChain.cpp
@@ -517,6 +517,18 @@
     else
       ArchName = "arm";
 
+    // Check if ARM ISA was explicitly selected (using -mno-thumb or -marm) for
+    // M-Class CPUs/architecture variants, which is not supported.
+    bool ARMModeRequested = !Args.hasFlag(options::OPT_mthumb,
+                                          options::OPT_mno_thumb, ThumbDefault);
+    if (IsMProfile && ARMModeRequested) {
+      if (!MCPU.empty())
+        getDriver().Diag(diag::err_cpu_unsupported_isa) << CPU << "ARM";
+       else
+        getDriver().Diag(diag::err_arch_unsupported_isa)
+          << tools::arm::getARMArch(MArch, getTriple()) << "ARM";
+    }
+
     // Assembly files should start in ARM mode, unless arch is M-profile.
     // Windows is always thumb.
     if ((InputType != types::TY_PP_Asm && Args.hasFlag(options::OPT_mthumb,