Index: lib/Driver/Tools.cpp =================================================================== --- lib/Driver/Tools.cpp +++ lib/Driver/Tools.cpp @@ -795,10 +795,21 @@ Features.push_back("-crc"); } - if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) { + auto SubArch = Triple.getSubArch(); + + if (SubArch == llvm::Triple::SubArchType::ARMSubArch_v8_1a) { Features.insert(Features.begin(), "+v8.1a"); } + // Windows on ARM and ARMv8 expect restricted IT blocks. + if (Triple.isOSWindows() || + SubArch == llvm::Triple::SubArchType::ARMSubArch_v8 || + SubArch == llvm::Triple::SubArchType::ARMSubArch_v8_1a) + Features.push_back("+restrict-it"); + else if (Args.hasFlag(options::OPT_mrestrict_it, options::OPT_mno_restrict_it, + false)) + Features.push_back("+restrict-it"); + // Look for the last occurrence of -mlong-calls or -mno-long-calls. If // neither options are specified, see if we are compiling for kernel/kext and // decide whether to pass "+long-calls" based on the OS and its version. @@ -4366,23 +4377,6 @@ break; } - if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it, - options::OPT_mno_restrict_it)) { - if (A->getOption().matches(options::OPT_mrestrict_it)) { - CmdArgs.push_back("-backend-option"); - CmdArgs.push_back("-arm-restrict-it"); - } else { - CmdArgs.push_back("-backend-option"); - CmdArgs.push_back("-arm-no-restrict-it"); - } - } else if (Triple.isOSWindows() && - (Triple.getArch() == llvm::Triple::arm || - Triple.getArch() == llvm::Triple::thumb)) { - // Windows on ARM expects restricted IT blocks - CmdArgs.push_back("-backend-option"); - CmdArgs.push_back("-arm-restrict-it"); - } - // Forward -f options with positive and negative forms; we translate // these by hand. if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) { Index: test/Driver/arm-restrict-it.c =================================================================== --- test/Driver/arm-restrict-it.c +++ test/Driver/arm-restrict-it.c @@ -1,15 +1,21 @@ -// RUN: %clang -target arm-none-gnueabi -mrestrict-it -### %s 2> %t +// RUN: %clang -target arm-none-gnueabi -mno-restrict-it -mrestrict-it -### %s 2> %t // RUN: FileCheck --check-prefix=CHECK-RESTRICTED < %t %s -// RUN: %clang -target armv8a-none-gnueabi -mrestrict-it -### %s 2> %t +// RUN: %clang -target armv8-none-gnueabi -mno-restrict-it -### %s 2> %t // RUN: FileCheck --check-prefix=CHECK-RESTRICTED < %t %s -// CHECK-RESTRICTED: "-backend-option" "-arm-restrict-it" +// RUN: %clang -target armv8a-none-gnueabi -### %s 2> %t +// RUN: FileCheck --check-prefix=CHECK-RESTRICTED < %t %s + +// RUN: %clang -target armv8a-none-gnueabi -mno-restrict-it -### %s 2> %t +// RUN: FileCheck --check-prefix=CHECK-RESTRICTED < %t %s + +// CHECK-RESTRICTED: "-target-feature" "+restrict-it" // RUN: %clang -target arm-none-gnueabi -mno-restrict-it -### %s 2> %t // RUN: FileCheck --check-prefix=CHECK-NO-RESTRICTED < %t %s -// RUN: %clang -target armv8a-none-gnueabi -mno-restrict-it -### %s 2> %t +// RUN: %clang -target arm-none-gnueabi -### %s 2> %t // RUN: FileCheck --check-prefix=CHECK-NO-RESTRICTED < %t %s -// CHECK-NO-RESTRICTED: "-backend-option" "-arm-no-restrict-it" +// CHECK-NO-RESTRICTED-NOT: "-target-feature" "+restrict-it" Index: test/Driver/woa-restrict-it.c =================================================================== --- test/Driver/woa-restrict-it.c +++ test/Driver/woa-restrict-it.c @@ -1,4 +1,4 @@ -// RUN: %clang -target armv7-windows -### %s 2>&1 | FileCheck %s - -// CHECK: "-backend-option" "-arm-restrict-it" +// RUN: %clang -target armv7-windows -### %s 2>&1 | FileCheck --check-prefix=CHECK-RESTRICTED %s +// RUN: %clang -target armv7-windows -mno-restrict-it -### %s 2>&1 | FileCheck --check-prefix=CHECK-RESTRICTED %s +// CHECK-RESTRICTED: "-target-feature" "+restrict-it"