OSDN Git Service

[ARM] In thumb mode, emit directive ".code 16" before file level inline
authorAkira Hatanaka <ahatanaka@apple.com>
Fri, 25 Jul 2014 05:12:49 +0000 (05:12 +0000)
committerAkira Hatanaka <ahatanaka@apple.com>
Fri, 25 Jul 2014 05:12:49 +0000 (05:12 +0000)
assembly instructions.

This is necessary to ensure ARM assembler switches to Thumb mode before it
starts assembling the file level inline assembly instructions at the beginning
of a .s file.

<rdar://problem/17757232>

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213924 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMAsmPrinter.cpp
test/CodeGen/ARM/inlineasm-global.ll [new file with mode: 0644]

index 28d2610..9ad808c 100644 (file)
@@ -478,6 +478,9 @@ void ARMAsmPrinter::EmitStartOfAsmFile(Module &M) {
   // Emit ARM Build Attributes
   if (Subtarget->isTargetELF())
     emitAttributes();
+
+  if (!M.getModuleInlineAsm().empty() && Subtarget->isThumb())
+    OutStreamer.EmitAssemblerFlag(MCAF_Code16);
 }
 
 static void
diff --git a/test/CodeGen/ARM/inlineasm-global.ll b/test/CodeGen/ARM/inlineasm-global.ll
new file mode 100644 (file)
index 0000000..d1a15e3
--- /dev/null
@@ -0,0 +1,13 @@
+; RUN: llc -march thumb -no-integrated-as %s -o - | FileCheck %s --check-prefix=THUMB
+; RUN: llc -march arm -no-integrated-as %s -o - | FileCheck %s --check-prefix=ARM
+
+; In thumb mode, emit ".code 16" before global inline-asm instructions.
+
+; THUMB: .code 16
+; THUMB: stmib
+; THUMB: .code 16
+
+; ARM-NOT: .code 16
+; ARM:     stmib
+
+module asm "stmib sp, {r0-r14};"