diff --git a/lld/test/ELF/arm-ldrlit-err.s b/lld/test/ELF/arm-ldrlit-err.s --- a/lld/test/ELF/arm-ldrlit-err.s +++ b/lld/test/ELF/arm-ldrlit-err.s @@ -8,6 +8,9 @@ bx lr nop nop + nop + nop + nop .section .text.1, "ax", %progbits .global _start @@ -27,3 +30,4 @@ .balign 4 high: bx lr + nop diff --git a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp --- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -11165,6 +11165,12 @@ "unexpected token in '.thumb_func' directive")) return true; + // .thumb_func implies .thumb + if (!isThumb()) + SwitchMode(); + + getParser().getStreamer().emitAssemblerFlag(MCAF_Code16); + NextSymbolIsThumb = true; return false; } diff --git a/llvm/test/MC/ARM/thumb_func-implies-thumb.s b/llvm/test/MC/ARM/thumb_func-implies-thumb.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/ARM/thumb_func-implies-thumb.s @@ -0,0 +1,31 @@ +@ RUN: llvm-mc -triple=armv7-darwin- -show-encoding < %s | FileCheck %s +.syntax unified + +.text + +.arm +@ Ensure the plain form switches mode. +.thumb_func +@ CHECK: .code 16 +@ CHECK-LABEL: foo +foo: + bx lr + +.arm +@ Ensure the labeled form doesn't switch mode. +.thumb_func bar +@ CHECK-NOT: .code 16 +@ CHECK-LABEL: bar +bar: + bx lr + +.arm +@ Ensure the nop is assembled in thumb mode, even though the baz symbol is +@ defined later. +.thumb_func +nop +@ CHECK: .code 16 +@ CHECK-NEXT: nop +@ CHECK-LABEL: baz +baz: + bx lr