xref: /rk3399_ARM-atf/lib/compiler-rt/builtins/assembly.h (revision 658ce7ad8eceb40741cd40f1639a6d923f922fad)
18a6a9560SDaniel Boulby //===-- assembly.h - compiler-rt assembler support macros -----------------===//
28a6a9560SDaniel Boulby //
38a6a9560SDaniel Boulby // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
48a6a9560SDaniel Boulby // See https://llvm.org/LICENSE.txt for license information.
58a6a9560SDaniel Boulby // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
68a6a9560SDaniel Boulby //
78a6a9560SDaniel Boulby //===----------------------------------------------------------------------===//
88a6a9560SDaniel Boulby //
98a6a9560SDaniel Boulby // This file defines macros for use in compiler-rt assembler source.
108a6a9560SDaniel Boulby // This file is not part of the interface of this library.
118a6a9560SDaniel Boulby //
128a6a9560SDaniel Boulby //===----------------------------------------------------------------------===//
130e14a7fbSdp-arm 
140e14a7fbSdp-arm #ifndef COMPILERRT_ASSEMBLY_H
150e14a7fbSdp-arm #define COMPILERRT_ASSEMBLY_H
160e14a7fbSdp-arm 
178a6a9560SDaniel Boulby #if defined(__linux__) && defined(__CET__)
188a6a9560SDaniel Boulby #if __has_include(<cet.h>)
198a6a9560SDaniel Boulby #include <cet.h>
208a6a9560SDaniel Boulby #endif
218a6a9560SDaniel Boulby #endif
228a6a9560SDaniel Boulby 
238a6a9560SDaniel Boulby #if defined(__APPLE__) && defined(__aarch64__)
248a6a9560SDaniel Boulby #define SEPARATOR %%
250e14a7fbSdp-arm #else
260e14a7fbSdp-arm #define SEPARATOR ;
270e14a7fbSdp-arm #endif
280e14a7fbSdp-arm 
290e14a7fbSdp-arm #if defined(__APPLE__)
300e14a7fbSdp-arm #define HIDDEN(name) .private_extern name
310e14a7fbSdp-arm #define LOCAL_LABEL(name) L_##name
320e14a7fbSdp-arm // tell linker it can break up file at label boundaries
330e14a7fbSdp-arm #define FILE_LEVEL_DIRECTIVE .subsections_via_symbols
340e14a7fbSdp-arm #define SYMBOL_IS_FUNC(name)
350e14a7fbSdp-arm #define CONST_SECTION .const
360e14a7fbSdp-arm 
370e14a7fbSdp-arm #define NO_EXEC_STACK_DIRECTIVE
380e14a7fbSdp-arm 
390e14a7fbSdp-arm #elif defined(__ELF__)
400e14a7fbSdp-arm 
410e14a7fbSdp-arm #define HIDDEN(name) .hidden name
420e14a7fbSdp-arm #define LOCAL_LABEL(name) .L_##name
430e14a7fbSdp-arm #define FILE_LEVEL_DIRECTIVE
448a6a9560SDaniel Boulby #if defined(__arm__) || defined(__aarch64__)
450e14a7fbSdp-arm #define SYMBOL_IS_FUNC(name) .type name,%function
460e14a7fbSdp-arm #else
470e14a7fbSdp-arm #define SYMBOL_IS_FUNC(name) .type name,@function
480e14a7fbSdp-arm #endif
490e14a7fbSdp-arm #define CONST_SECTION .section .rodata
500e14a7fbSdp-arm 
518a6a9560SDaniel Boulby #if defined(__GNU__) || defined(__FreeBSD__) || defined(__Fuchsia__) ||        \
528a6a9560SDaniel Boulby     defined(__linux__)
530e14a7fbSdp-arm #define NO_EXEC_STACK_DIRECTIVE .section .note.GNU-stack,"",%progbits
540e14a7fbSdp-arm #else
550e14a7fbSdp-arm #define NO_EXEC_STACK_DIRECTIVE
560e14a7fbSdp-arm #endif
570e14a7fbSdp-arm 
580e14a7fbSdp-arm #else // !__APPLE__ && !__ELF__
590e14a7fbSdp-arm 
600e14a7fbSdp-arm #define HIDDEN(name)
610e14a7fbSdp-arm #define LOCAL_LABEL(name) .L ## name
620e14a7fbSdp-arm #define FILE_LEVEL_DIRECTIVE
630e14a7fbSdp-arm #define SYMBOL_IS_FUNC(name)                                                   \
640e14a7fbSdp-arm   .def name SEPARATOR                                                          \
650e14a7fbSdp-arm     .scl 2 SEPARATOR                                                           \
660e14a7fbSdp-arm     .type 32 SEPARATOR                                                         \
670e14a7fbSdp-arm   .endef
680e14a7fbSdp-arm #define CONST_SECTION .section .rdata,"rd"
690e14a7fbSdp-arm 
700e14a7fbSdp-arm #define NO_EXEC_STACK_DIRECTIVE
710e14a7fbSdp-arm 
720e14a7fbSdp-arm #endif
730e14a7fbSdp-arm 
748a6a9560SDaniel Boulby #if defined(__arm__) || defined(__aarch64__)
758a6a9560SDaniel Boulby #define FUNC_ALIGN                                                             \
768a6a9560SDaniel Boulby   .text SEPARATOR                                                              \
778a6a9560SDaniel Boulby   .balign 16 SEPARATOR
788a6a9560SDaniel Boulby #else
798a6a9560SDaniel Boulby #define FUNC_ALIGN
808a6a9560SDaniel Boulby #endif
818a6a9560SDaniel Boulby 
828a6a9560SDaniel Boulby // BTI and PAC gnu property note
838a6a9560SDaniel Boulby #define NT_GNU_PROPERTY_TYPE_0 5
848a6a9560SDaniel Boulby #define GNU_PROPERTY_AARCH64_FEATURE_1_AND 0xc0000000
858a6a9560SDaniel Boulby #define GNU_PROPERTY_AARCH64_FEATURE_1_BTI 1
868a6a9560SDaniel Boulby #define GNU_PROPERTY_AARCH64_FEATURE_1_PAC 2
878a6a9560SDaniel Boulby 
888a6a9560SDaniel Boulby #if defined(__ARM_FEATURE_BTI_DEFAULT)
898a6a9560SDaniel Boulby #define BTI_FLAG GNU_PROPERTY_AARCH64_FEATURE_1_BTI
908a6a9560SDaniel Boulby #else
918a6a9560SDaniel Boulby #define BTI_FLAG 0
928a6a9560SDaniel Boulby #endif
938a6a9560SDaniel Boulby 
948a6a9560SDaniel Boulby #if __ARM_FEATURE_PAC_DEFAULT & 3
958a6a9560SDaniel Boulby #define PAC_FLAG GNU_PROPERTY_AARCH64_FEATURE_1_PAC
968a6a9560SDaniel Boulby #else
978a6a9560SDaniel Boulby #define PAC_FLAG 0
988a6a9560SDaniel Boulby #endif
998a6a9560SDaniel Boulby 
1008a6a9560SDaniel Boulby #define GNU_PROPERTY(type, value)                                              \
1018a6a9560SDaniel Boulby   .pushsection .note.gnu.property, "a" SEPARATOR                               \
1028a6a9560SDaniel Boulby   .p2align 3 SEPARATOR                                                         \
1038a6a9560SDaniel Boulby   .word 4 SEPARATOR                                                            \
1048a6a9560SDaniel Boulby   .word 16 SEPARATOR                                                           \
1058a6a9560SDaniel Boulby   .word NT_GNU_PROPERTY_TYPE_0 SEPARATOR                                       \
1068a6a9560SDaniel Boulby   .asciz "GNU" SEPARATOR                                                       \
1078a6a9560SDaniel Boulby   .word type SEPARATOR                                                         \
1088a6a9560SDaniel Boulby   .word 4 SEPARATOR                                                            \
1098a6a9560SDaniel Boulby   .word value SEPARATOR                                                        \
1108a6a9560SDaniel Boulby   .word 0 SEPARATOR                                                            \
1118a6a9560SDaniel Boulby   .popsection
1128a6a9560SDaniel Boulby 
1138a6a9560SDaniel Boulby #if BTI_FLAG != 0
1148a6a9560SDaniel Boulby #define BTI_C hint #34
1158a6a9560SDaniel Boulby #define BTI_J hint #36
1168a6a9560SDaniel Boulby #else
1178a6a9560SDaniel Boulby #define BTI_C
1188a6a9560SDaniel Boulby #define BTI_J
1198a6a9560SDaniel Boulby #endif
1208a6a9560SDaniel Boulby 
1218a6a9560SDaniel Boulby #if (BTI_FLAG | PAC_FLAG) != 0
1228a6a9560SDaniel Boulby #define GNU_PROPERTY_BTI_PAC                                                   \
1238a6a9560SDaniel Boulby   GNU_PROPERTY(GNU_PROPERTY_AARCH64_FEATURE_1_AND, BTI_FLAG | PAC_FLAG)
1248a6a9560SDaniel Boulby #else
1258a6a9560SDaniel Boulby #define GNU_PROPERTY_BTI_PAC
1268a6a9560SDaniel Boulby #endif
1278a6a9560SDaniel Boulby 
1288a6a9560SDaniel Boulby #if defined(__clang__) || defined(__GCC_HAVE_DWARF2_CFI_ASM)
1298a6a9560SDaniel Boulby #define CFI_START .cfi_startproc
1308a6a9560SDaniel Boulby #define CFI_END .cfi_endproc
1318a6a9560SDaniel Boulby #else
1328a6a9560SDaniel Boulby #define CFI_START
1338a6a9560SDaniel Boulby #define CFI_END
1348a6a9560SDaniel Boulby #endif
1358a6a9560SDaniel Boulby 
1360e14a7fbSdp-arm #if defined(__arm__)
1378a6a9560SDaniel Boulby 
1388a6a9560SDaniel Boulby // Determine actual [ARM][THUMB[1][2]] ISA using compiler predefined macros:
1398a6a9560SDaniel Boulby // - for '-mthumb -march=armv6' compiler defines '__thumb__'
1408a6a9560SDaniel Boulby // - for '-mthumb -march=armv7' compiler defines '__thumb__' and '__thumb2__'
1418a6a9560SDaniel Boulby #if defined(__thumb2__) || defined(__thumb__)
1428a6a9560SDaniel Boulby #define DEFINE_CODE_STATE .thumb SEPARATOR
1438a6a9560SDaniel Boulby #define DECLARE_FUNC_ENCODING    .thumb_func SEPARATOR
1448a6a9560SDaniel Boulby #if defined(__thumb2__)
1458a6a9560SDaniel Boulby #define USE_THUMB_2
1468a6a9560SDaniel Boulby #define IT(cond)  it cond
1478a6a9560SDaniel Boulby #define ITT(cond) itt cond
1488a6a9560SDaniel Boulby #define ITE(cond) ite cond
1498a6a9560SDaniel Boulby #else
1508a6a9560SDaniel Boulby #define USE_THUMB_1
1518a6a9560SDaniel Boulby #define IT(cond)
1528a6a9560SDaniel Boulby #define ITT(cond)
1538a6a9560SDaniel Boulby #define ITE(cond)
1548a6a9560SDaniel Boulby #endif // defined(__thumb__2)
1558a6a9560SDaniel Boulby #else // !defined(__thumb2__) && !defined(__thumb__)
1568a6a9560SDaniel Boulby #define DEFINE_CODE_STATE .arm SEPARATOR
1578a6a9560SDaniel Boulby #define DECLARE_FUNC_ENCODING
1588a6a9560SDaniel Boulby #define IT(cond)
1598a6a9560SDaniel Boulby #define ITT(cond)
1608a6a9560SDaniel Boulby #define ITE(cond)
1618a6a9560SDaniel Boulby #endif
1628a6a9560SDaniel Boulby 
1638a6a9560SDaniel Boulby #if defined(USE_THUMB_1) && defined(USE_THUMB_2)
1648a6a9560SDaniel Boulby #error "USE_THUMB_1 and USE_THUMB_2 can't be defined together."
1658a6a9560SDaniel Boulby #endif
1668a6a9560SDaniel Boulby 
1670e14a7fbSdp-arm #if defined(__ARM_ARCH_4T__) || __ARM_ARCH >= 5
1680e14a7fbSdp-arm #define ARM_HAS_BX
1690e14a7fbSdp-arm #endif
1708a6a9560SDaniel Boulby #if !defined(__ARM_FEATURE_CLZ) && !defined(USE_THUMB_1) &&  \
1710e14a7fbSdp-arm     (__ARM_ARCH >= 6 || (__ARM_ARCH == 5 && !defined(__ARM_ARCH_5__)))
1720e14a7fbSdp-arm #define __ARM_FEATURE_CLZ
1730e14a7fbSdp-arm #endif
1740e14a7fbSdp-arm 
1750e14a7fbSdp-arm #ifdef ARM_HAS_BX
1760e14a7fbSdp-arm #define JMP(r) bx r
1770e14a7fbSdp-arm #define JMPc(r, c) bx##c r
1780e14a7fbSdp-arm #else
1790e14a7fbSdp-arm #define JMP(r) mov pc, r
1800e14a7fbSdp-arm #define JMPc(r, c) mov##c pc, r
1810e14a7fbSdp-arm #endif
1820e14a7fbSdp-arm 
1830e14a7fbSdp-arm // pop {pc} can't switch Thumb mode on ARMv4T
1840e14a7fbSdp-arm #if __ARM_ARCH >= 5
1850e14a7fbSdp-arm #define POP_PC() pop {pc}
1860e14a7fbSdp-arm #else
1870e14a7fbSdp-arm #define POP_PC()                                                               \
1880e14a7fbSdp-arm   pop {ip};                                                                    \
1890e14a7fbSdp-arm   JMP(ip)
1900e14a7fbSdp-arm #endif
1910e14a7fbSdp-arm 
1928a6a9560SDaniel Boulby #if defined(USE_THUMB_2)
1930e14a7fbSdp-arm #define WIDE(op) op.w
1940e14a7fbSdp-arm #else
1950e14a7fbSdp-arm #define WIDE(op) op
1960e14a7fbSdp-arm #endif
1978a6a9560SDaniel Boulby #else // !defined(__arm)
1988a6a9560SDaniel Boulby #define DECLARE_FUNC_ENCODING
1998a6a9560SDaniel Boulby #define DEFINE_CODE_STATE
2000e14a7fbSdp-arm #endif
2010e14a7fbSdp-arm 
2028a6a9560SDaniel Boulby #define GLUE2_(a, b) a##b
2038a6a9560SDaniel Boulby #define GLUE(a, b) GLUE2_(a, b)
2048a6a9560SDaniel Boulby #define GLUE2(a, b) GLUE2_(a, b)
2058a6a9560SDaniel Boulby #define GLUE3_(a, b, c) a##b##c
2068a6a9560SDaniel Boulby #define GLUE3(a, b, c) GLUE3_(a, b, c)
2078a6a9560SDaniel Boulby #define GLUE4_(a, b, c, d) a##b##c##d
2088a6a9560SDaniel Boulby #define GLUE4(a, b, c, d) GLUE4_(a, b, c, d)
2098a6a9560SDaniel Boulby 
2100e14a7fbSdp-arm #define SYMBOL_NAME(name) GLUE(__USER_LABEL_PREFIX__, name)
2110e14a7fbSdp-arm 
2120e14a7fbSdp-arm #ifdef VISIBILITY_HIDDEN
2130e14a7fbSdp-arm #define DECLARE_SYMBOL_VISIBILITY(name)                                        \
2140e14a7fbSdp-arm   HIDDEN(SYMBOL_NAME(name)) SEPARATOR
2158a6a9560SDaniel Boulby #define DECLARE_SYMBOL_VISIBILITY_UNMANGLED(name) \
2168a6a9560SDaniel Boulby   HIDDEN(name) SEPARATOR
2170e14a7fbSdp-arm #else
2180e14a7fbSdp-arm #define DECLARE_SYMBOL_VISIBILITY(name)
2198a6a9560SDaniel Boulby #define DECLARE_SYMBOL_VISIBILITY_UNMANGLED(name)
2200e14a7fbSdp-arm #endif
2210e14a7fbSdp-arm 
2220e14a7fbSdp-arm #define DEFINE_COMPILERRT_FUNCTION(name)                                       \
2238a6a9560SDaniel Boulby   DEFINE_CODE_STATE                                                            \
2240e14a7fbSdp-arm   FILE_LEVEL_DIRECTIVE SEPARATOR                                               \
2250e14a7fbSdp-arm   .globl SYMBOL_NAME(name) SEPARATOR                                           \
2260e14a7fbSdp-arm   SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR                                  \
2270e14a7fbSdp-arm   DECLARE_SYMBOL_VISIBILITY(name)                                              \
2288a6a9560SDaniel Boulby   DECLARE_FUNC_ENCODING                                                        \
2290e14a7fbSdp-arm   SYMBOL_NAME(name):
2300e14a7fbSdp-arm 
2310e14a7fbSdp-arm #define DEFINE_COMPILERRT_THUMB_FUNCTION(name)                                 \
2328a6a9560SDaniel Boulby   DEFINE_CODE_STATE                                                            \
2330e14a7fbSdp-arm   FILE_LEVEL_DIRECTIVE SEPARATOR                                               \
2340e14a7fbSdp-arm   .globl SYMBOL_NAME(name) SEPARATOR                                           \
2350e14a7fbSdp-arm   SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR                                  \
2360e14a7fbSdp-arm   DECLARE_SYMBOL_VISIBILITY(name) SEPARATOR                                    \
2370e14a7fbSdp-arm   .thumb_func SEPARATOR                                                        \
2380e14a7fbSdp-arm   SYMBOL_NAME(name):
2390e14a7fbSdp-arm 
2400e14a7fbSdp-arm #define DEFINE_COMPILERRT_PRIVATE_FUNCTION(name)                               \
2418a6a9560SDaniel Boulby   DEFINE_CODE_STATE                                                            \
2420e14a7fbSdp-arm   FILE_LEVEL_DIRECTIVE SEPARATOR                                               \
2430e14a7fbSdp-arm   .globl SYMBOL_NAME(name) SEPARATOR                                           \
2440e14a7fbSdp-arm   SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR                                  \
2450e14a7fbSdp-arm   HIDDEN(SYMBOL_NAME(name)) SEPARATOR                                          \
2468a6a9560SDaniel Boulby   DECLARE_FUNC_ENCODING                                                        \
2470e14a7fbSdp-arm   SYMBOL_NAME(name):
2480e14a7fbSdp-arm 
2490e14a7fbSdp-arm #define DEFINE_COMPILERRT_PRIVATE_FUNCTION_UNMANGLED(name)                     \
2508a6a9560SDaniel Boulby   DEFINE_CODE_STATE                                                            \
2510e14a7fbSdp-arm   .globl name SEPARATOR                                                        \
2520e14a7fbSdp-arm   SYMBOL_IS_FUNC(name) SEPARATOR                                               \
2530e14a7fbSdp-arm   HIDDEN(name) SEPARATOR                                                       \
2548a6a9560SDaniel Boulby   DECLARE_FUNC_ENCODING                                                        \
2550e14a7fbSdp-arm   name:
2560e14a7fbSdp-arm 
2578a6a9560SDaniel Boulby #define DEFINE_COMPILERRT_OUTLINE_FUNCTION_UNMANGLED(name)                     \
2588a6a9560SDaniel Boulby   DEFINE_CODE_STATE                                                            \
2598a6a9560SDaniel Boulby   FUNC_ALIGN                                                                   \
2608a6a9560SDaniel Boulby   .globl name SEPARATOR                                                        \
2618a6a9560SDaniel Boulby   SYMBOL_IS_FUNC(name) SEPARATOR                                               \
2628a6a9560SDaniel Boulby   DECLARE_SYMBOL_VISIBILITY_UNMANGLED(name) SEPARATOR                          \
2638a6a9560SDaniel Boulby   CFI_START SEPARATOR                                                          \
2648a6a9560SDaniel Boulby   DECLARE_FUNC_ENCODING                                                        \
2658a6a9560SDaniel Boulby   name: SEPARATOR BTI_C
2668a6a9560SDaniel Boulby 
2670e14a7fbSdp-arm #define DEFINE_COMPILERRT_FUNCTION_ALIAS(name, target)                         \
2680e14a7fbSdp-arm   .globl SYMBOL_NAME(name) SEPARATOR                                           \
2690e14a7fbSdp-arm   SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR                                  \
270*658ce7adSMaksims Svecovs   DECLARE_SYMBOL_VISIBILITY(name) SEPARATOR                                    \
2710e14a7fbSdp-arm   .set SYMBOL_NAME(name), SYMBOL_NAME(target) SEPARATOR
2720e14a7fbSdp-arm 
2730e14a7fbSdp-arm #if defined(__ARM_EABI__)
2740e14a7fbSdp-arm #define DEFINE_AEABI_FUNCTION_ALIAS(aeabi_name, name)                          \
2750e14a7fbSdp-arm   DEFINE_COMPILERRT_FUNCTION_ALIAS(aeabi_name, name)
2760e14a7fbSdp-arm #else
2770e14a7fbSdp-arm #define DEFINE_AEABI_FUNCTION_ALIAS(aeabi_name, name)
2780e14a7fbSdp-arm #endif
2790e14a7fbSdp-arm 
2800e14a7fbSdp-arm #ifdef __ELF__
2810e14a7fbSdp-arm #define END_COMPILERRT_FUNCTION(name)                                          \
2820e14a7fbSdp-arm   .size SYMBOL_NAME(name), . - SYMBOL_NAME(name)
2838a6a9560SDaniel Boulby #define END_COMPILERRT_OUTLINE_FUNCTION(name)                                  \
2848a6a9560SDaniel Boulby   CFI_END SEPARATOR                                                            \
2858a6a9560SDaniel Boulby   .size SYMBOL_NAME(name), . - SYMBOL_NAME(name)
2860e14a7fbSdp-arm #else
2870e14a7fbSdp-arm #define END_COMPILERRT_FUNCTION(name)
2888a6a9560SDaniel Boulby #define END_COMPILERRT_OUTLINE_FUNCTION(name)                                  \
2898a6a9560SDaniel Boulby   CFI_END
2900e14a7fbSdp-arm #endif
2910e14a7fbSdp-arm 
2928a6a9560SDaniel Boulby #endif // COMPILERRT_ASSEMBLY_H
293