Index: lib/Driver/ToolChain.cpp =================================================================== --- lib/Driver/ToolChain.cpp +++ lib/Driver/ToolChain.cpp @@ -541,11 +541,30 @@ << 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, - options::OPT_mno_thumb, ThumbDefault)) || IsMProfile || - getTriple().isOSWindows()) { + // Check to see if an explicit choice to use thumb has been made via + // -mthumb. For assembler files we must check for -mthumb in the options + // passed to the assember via -Wa or -Xassembler. + bool IsMThumb = false; + if (InputType != types::TY_PP_Asm) + IsMThumb = Args.hasFlag(options::OPT_mthumb, options::OPT_mno_thumb, + ThumbDefault); + else { + // Ideally we would check for these flags in + // CollectArgsForIntegratedAssembler but we can't change the ArchName at + // that point. There is no assembler equivalent of -mno-thumb, -marm, or + // -mno-arm. + for (const Arg *A : + Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) { + for (StringRef Value : A->getValues()) { + if (Value == "-mthumb") + IsMThumb = true; + } + } + } + // Assembly files should start in ARM mode, unless arch is M-profile, or + // -mthumb has been passed explicitly to the assembler. Windows is always + // thumb. + if (IsMThumb || IsMProfile || getTriple().isOSWindows()) { if (IsBigEndian) ArchName = "thumbeb"; else Index: lib/Driver/ToolChains/Clang.cpp =================================================================== --- lib/Driver/ToolChains/Clang.cpp +++ lib/Driver/ToolChains/Clang.cpp @@ -1889,6 +1889,15 @@ switch (C.getDefaultToolChain().getArch()) { default: break; + case llvm::Triple::thumb: + case llvm::Triple::thumbeb: + case llvm::Triple::arm: + case llvm::Triple::armeb: + if (Value == "-mthumb") + // -mthumb has already been processed in ComputeLLVMTriple() + // recognize but skip over here. + continue; + case llvm::Triple::mips: case llvm::Triple::mipsel: case llvm::Triple::mips64: Index: test/Driver/arm-target-as-mthumb.s =================================================================== --- /dev/null +++ test/Driver/arm-target-as-mthumb.s @@ -0,0 +1,17 @@ +// Make sure -mthumb does not affect assembler triple, but -Wa,-mthumb or +// -Xassembler -mthumb does. Also check that -Wa,-mthumb or -Xassembler -mthumb +// does not affect non assembler files. + +// RUN: %clang -target armv7a-linux-gnueabi -### -c -mthumb %s 2>&1 | \ +// RUN: FileCheck -check-prefix=TRIPLE-ARM %s +// RUN: %clang -target armv7a-linux-gnueabi -### -c -Wa,-mthumb \ +// RUN: %S/Inputs/wildcard1.c 2>&1 | FileCheck -check-prefix=TRIPLE-ARM %s + +// TRIPLE-ARM: "-triple" "armv7--linux-gnueabi" + +// RUN: %clang -target armv7a-linux-gnueabi -### -c -Wa,-mthumb %s 2>&1 | \ +// RUN: FileCheck -check-prefix=TRIPLE-THUMB %s +// RUN: %clang -target armv7a-linux-gnueabi -### -c -Xassembler -mthumb %s \ +// RUN: 2>&1 | FileCheck -check-prefix=TRIPLE-THUMB %s + +// TRIPLE-THUMB: "-triple" "thumbv7--linux-gnueabi"