[PATCH] D38227: [Builtins] ARM: Fix assembling files in thumb mode.

Manoj Gupta via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 25 05:04:58 PDT 2017


manojgupta created this revision.
Herald added subscribers: kristof.beyls, javed.absar, aemerson.

clang does not assemble files in thumb mode unless .thumb declaration
is present. Add .thumb/.arm decl to _FUNCTION macros to ensure that
files are assembled correctly.
Addition fixes:
Fix a use of msr instruction. msr instruction cannot have immediate
operand in thumb state so use mov immediate + msr instead.
Align aeabi_memset function to 4-bytes.

Fixes PR 34715.


https://reviews.llvm.org/D38227

Files:
  lib/builtins/arm/aeabi_cdcmp.S
  lib/builtins/arm/aeabi_cfcmp.S
  lib/builtins/arm/aeabi_memset.S
  lib/builtins/assembly.h


Index: lib/builtins/assembly.h
===================================================================
--- lib/builtins/assembly.h
+++ lib/builtins/assembly.h
@@ -75,7 +75,7 @@
  * - for '-mthumb -march=armv7' compiler defines '__thumb__' and '__thumb2__'
  */
 #if defined(__thumb2__) || defined(__thumb__)
-#define DEFINE_CODE_STATE .thumb
+#define DEFINE_CODE_STATE .thumb SEPARATOR
 #define DECLARE_FUNC_ENCODING    .thumb_func SEPARATOR
 #if defined(__thumb2__)
 #define USE_THUMB_2
@@ -89,7 +89,7 @@
 #define ITE(cond)
 #endif // defined(__thumb__2)
 #else // !defined(__thumb2__) && !defined(__thumb__)
-#define DEFINE_CODE_STATE .arm
+#define DEFINE_CODE_STATE .arm SEPARATOR
 #define DECLARE_FUNC_ENCODING
 #define IT(cond)
 #define ITT(cond)
@@ -146,30 +146,34 @@
 #endif
 
 #define DEFINE_COMPILERRT_FUNCTION(name)                                       \
+  DEFINE_CODE_STATE                                                            \
   FILE_LEVEL_DIRECTIVE SEPARATOR                                               \
   .globl SYMBOL_NAME(name) SEPARATOR                                           \
   SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR                                  \
   DECLARE_SYMBOL_VISIBILITY(name)                                              \
   DECLARE_FUNC_ENCODING                                                        \
   SYMBOL_NAME(name):
 
 #define DEFINE_COMPILERRT_THUMB_FUNCTION(name)                                 \
+  DEFINE_CODE_STATE                                                            \
   FILE_LEVEL_DIRECTIVE SEPARATOR                                               \
   .globl SYMBOL_NAME(name) SEPARATOR                                           \
   SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR                                  \
   DECLARE_SYMBOL_VISIBILITY(name) SEPARATOR                                    \
   .thumb_func SEPARATOR                                                        \
   SYMBOL_NAME(name):
 
 #define DEFINE_COMPILERRT_PRIVATE_FUNCTION(name)                               \
+  DEFINE_CODE_STATE                                                            \
   FILE_LEVEL_DIRECTIVE SEPARATOR                                               \
   .globl SYMBOL_NAME(name) SEPARATOR                                           \
   SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR                                  \
   HIDDEN(SYMBOL_NAME(name)) SEPARATOR                                          \
   DECLARE_FUNC_ENCODING                                                        \
   SYMBOL_NAME(name):
 
 #define DEFINE_COMPILERRT_PRIVATE_FUNCTION_UNMANGLED(name)                     \
+  DEFINE_CODE_STATE                                                            \
   .globl name SEPARATOR                                                        \
   SYMBOL_IS_FUNC(name) SEPARATOR                                               \
   HIDDEN(name) SEPARATOR                                                       \
Index: lib/builtins/arm/aeabi_memset.S
===================================================================
--- lib/builtins/arm/aeabi_memset.S
+++ lib/builtins/arm/aeabi_memset.S
@@ -24,6 +24,7 @@
 DEFINE_AEABI_FUNCTION_ALIAS(__aeabi_memset4, __aeabi_memset)
 DEFINE_AEABI_FUNCTION_ALIAS(__aeabi_memset8, __aeabi_memset)
 
+        .p2align 2
 DEFINE_COMPILERRT_FUNCTION(__aeabi_memclr)
         mov     r2, r1
         movs    r1, #0
Index: lib/builtins/arm/aeabi_cfcmp.S
===================================================================
--- lib/builtins/arm/aeabi_cfcmp.S
+++ lib/builtins/arm/aeabi_cfcmp.S
@@ -51,6 +51,9 @@
 #if defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__)
         mov ip, #APSR_C
         msr APSR_nzcvq, ip
+#elif defined(USE_THUMB_2)
+        mov ip, #APSR_C
+        msr CPSR_f, ip
 #else
         msr CPSR_f, #APSR_C
 #endif
Index: lib/builtins/arm/aeabi_cdcmp.S
===================================================================
--- lib/builtins/arm/aeabi_cdcmp.S
+++ lib/builtins/arm/aeabi_cdcmp.S
@@ -51,6 +51,9 @@
 #if defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7EM__)
         mov ip, #APSR_C
         msr APSR_nzcvq, ip
+#elif defined(USE_THUMB_2)
+        mov ip, #APSR_C
+        msr CPSR_f, ip
 #else
         msr CPSR_f, #APSR_C
 #endif


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D38227.116496.patch
Type: text/x-patch
Size: 4273 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170925/d71ad257/attachment.bin>


More information about the llvm-commits mailing list