diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -1357,6 +1357,17 @@ } } +static bool isLaxVectorConversionsDefault(const llvm::Triple &Triple) { + switch (Triple.getArch()) { + default: + return true; + + case llvm::Triple::thumb: + case llvm::Triple::thumbeb: + return Triple.getSubArch() != llvm::Triple::ARMSubArch_v8_1m_mainline; + } +} + static bool isNoCommonDefault(const llvm::Triple &Triple) { switch (Triple.getArch()) { default: @@ -4674,10 +4685,13 @@ if (TC.SupportsProfiling()) Args.AddLastArg(CmdArgs, options::OPT_mfentry); - // -flax-vector-conversions is default. - if (!Args.hasFlag(options::OPT_flax_vector_conversions, - options::OPT_fno_lax_vector_conversions)) + if (const Arg *A = Args.getLastArg(options::OPT_flax_vector_conversions, + options::OPT_fno_lax_vector_conversions)) { + if (A->getOption().matches(options::OPT_fno_lax_vector_conversions)) + CmdArgs.push_back("-fno-lax-vector-conversions"); + } else if (!isLaxVectorConversionsDefault(Triple)) { CmdArgs.push_back("-fno-lax-vector-conversions"); + } if (Args.getLastArg(options::OPT_fapple_kext) || (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))