diff --git a/clang/lib/Driver/ToolChains/Arch/ARM.cpp b/clang/lib/Driver/ToolChains/Arch/ARM.cpp --- a/clang/lib/Driver/ToolChains/Arch/ARM.cpp +++ b/clang/lib/Driver/ToolChains/Arch/ARM.cpp @@ -790,7 +790,8 @@ if (Arg *A = Args.getLastArg(options::OPT_mexecute_only, options::OPT_mno_execute_only)) { if (A->getOption().matches(options::OPT_mexecute_only)) { if (getARMSubArchVersionNumber(Triple) < 7 && - llvm::ARM::parseArch(Triple.getArchName()) != llvm::ARM::ArchKind::ARMV6T2) + llvm::ARM::parseArch(Triple.getArchName()) != llvm::ARM::ArchKind::ARMV6T2 && + llvm::ARM::parseArch(Triple.getArchName()) != llvm::ARM::ArchKind::ARMV6M) D.Diag(diag::err_target_unsupported_execute_only) << Triple.getArchName(); else if (Arg *B = Args.getLastArg(options::OPT_mno_movt)) D.Diag(diag::err_opt_not_valid_with_opt) diff --git a/clang/test/Driver/arm-execute-only.c b/clang/test/Driver/arm-execute-only.c --- a/clang/test/Driver/arm-execute-only.c +++ b/clang/test/Driver/arm-execute-only.c @@ -1,6 +1,11 @@ -// RUN: not %clang -c -target thumbv6m-eabi -mexecute-only %s 2>&1 | \ +// RUN: %clang -c -target thumbv6m-eabi -mexecute-only %s 2>&1 | \ +// RUN: FileCheck -allow-empty --check-prefix CHECK-THIS %s +// CHECK-THIS-NOT: warning: +// CHECK-THIS-NOT: error: + +// RUN: not %clang -c -target thumbv6-eabi -mexecute-only %s 2>&1 | \ // RUN: FileCheck --check-prefix CHECK-EXECUTE-ONLY-NOT-SUPPORTED %s -// CHECK-EXECUTE-ONLY-NOT-SUPPORTED: error: execute only is not supported for the thumbv6m sub-architecture +// CHECK-EXECUTE-ONLY-NOT-SUPPORTED: error: execute only is not supported for the armv6 sub-architecture // RUN: not %clang -target armv8m.main-eabi -mexecute-only -mno-movt %s 2>&1 \ // RUN: | FileCheck %s -check-prefix CHECK-EXECUTE-ONLY-NO-MOVT @@ -11,7 +16,7 @@ // CHECK-NO-EXECUTE-ONLY-ASM: warning: argument unused during compilation: '-mexecute-only' // -mpure-code flag for GCC compatibility -// RUN: not %clang -c -target thumbv6m-eabi -mpure-code %s 2>&1 | \ +// RUN: not %clang -c -target armv6-eabi -mpure-code %s 2>&1 | \ // RUN: FileCheck --check-prefix CHECK-EXECUTE-ONLY-NOT-SUPPORTED %s // RUN: not %clang -target armv8m.main-eabi -mpure-code -mno-movt %s 2>&1 \ diff --git a/llvm/lib/Target/ARM/ARMSubtarget.cpp b/llvm/lib/Target/ARM/ARMSubtarget.cpp --- a/llvm/lib/Target/ARM/ARMSubtarget.cpp +++ b/llvm/lib/Target/ARM/ARMSubtarget.cpp @@ -187,10 +187,11 @@ // Assert this for now to make the change obvious. assert(hasV6T2Ops() || !hasThumb2()); - // Execute only support requires movt support if (genExecuteOnly()) { - NoMovt = false; - assert(hasV8MBaselineOps() && "Cannot generate execute-only code for this target"); + // Execute only support for >= v8-M Baseline requires movt support + if (hasV8MBaselineOps()) + NoMovt = false; + assert(hasV6MOps() && "Cannot generate execute-only code for this target"); } // Keep a pointer to static instruction cost data for the specified CPU.