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