mirror of https://github.com/microsoft/clang.git
[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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@310047 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b376dd59b0
commit
c4f2a80fd3
|
@ -106,6 +106,10 @@ def err_drv_malformed_sanitizer_blacklist : Error<
|
|||
|
||||
def err_target_unsupported_arch
|
||||
: Error<"the target architecture '%0' is not supported by the target '%1'">;
|
||||
def err_cpu_unsupported_isa
|
||||
: Error<"CPU '%0' does not support '%1' execution mode">;
|
||||
def err_arch_unsupported_isa
|
||||
: Error<"Architecture '%0' does not support '%1' execution mode">;
|
||||
|
||||
def err_drv_I_dash_not_supported : Error<
|
||||
"'%0' not supported, please use -iquote instead">;
|
||||
|
|
|
@ -517,6 +517,18 @@ std::string ToolChain::ComputeLLVMTriple(const ArgList &Args,
|
|||
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,
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
// RUN: not %clang -target arm-unknown-linux -marm -mcpu=cortex-m0 %s -o /dev/null 2>&1 \
|
||||
// RUN: | FileCheck --check-prefix M0 %s
|
||||
// M0: error: CPU 'cortex-m0' does not support 'ARM' execution mode
|
||||
|
||||
// RUN: not %clang -target arm-unknown-linux -marm -march=armv7m %s -o /dev/null 2>&1 \
|
||||
// RUN: | FileCheck --check-prefix ARMV7M %s
|
||||
// RUN: not %clang -target armv7m-unknown-linux -mno-thumb %s -o /dev/null 2>&1 \
|
||||
// RUN: | FileCheck --check-prefix ARMV7M %s
|
||||
// ARMV7M: error: Architecture 'armv7m' does not support 'ARM' execution mode
|
||||
//
|
||||
// RUN: %clang -S -emit-llvm -target arm-unknown-linux -mcpu=cortex-m0 %s -o /dev/null 2>&1
|
||||
// M-Profile CPUs default to Thumb mode even if arm triples are provided.
|
Loading…
Reference in New Issue