fhahn created this revision. Herald added subscribers: kristof.beyls, javed.absar, aemerson.
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 https://reviews.llvm.org/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. https://reviews.llvm.org/D35826 Files: include/clang/Basic/DiagnosticDriverKinds.td lib/Driver/ToolChain.cpp test/Driver/arm-thumb-only-cores.c Index: test/Driver/arm-thumb-only-cores.c =================================================================== --- /dev/null +++ test/Driver/arm-thumb-only-cores.c @@ -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. Index: lib/Driver/ToolChain.cpp =================================================================== --- lib/Driver/ToolChain.cpp +++ 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, Index: include/clang/Basic/DiagnosticDriverKinds.td =================================================================== --- include/clang/Basic/DiagnosticDriverKinds.td +++ include/clang/Basic/DiagnosticDriverKinds.td @@ -106,6 +106,10 @@ 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">;
Index: test/Driver/arm-thumb-only-cores.c =================================================================== --- /dev/null +++ test/Driver/arm-thumb-only-cores.c @@ -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. Index: lib/Driver/ToolChain.cpp =================================================================== --- lib/Driver/ToolChain.cpp +++ 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, Index: include/clang/Basic/DiagnosticDriverKinds.td =================================================================== --- include/clang/Basic/DiagnosticDriverKinds.td +++ include/clang/Basic/DiagnosticDriverKinds.td @@ -106,6 +106,10 @@ 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">;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits