13cab2bb3Spatrick //===-- assembly.h - compiler-rt assembler support macros -----------------===// 23cab2bb3Spatrick // 33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information. 53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 63cab2bb3Spatrick // 73cab2bb3Spatrick //===----------------------------------------------------------------------===// 83cab2bb3Spatrick // 93cab2bb3Spatrick // This file defines macros for use in compiler-rt assembler source. 103cab2bb3Spatrick // This file is not part of the interface of this library. 113cab2bb3Spatrick // 123cab2bb3Spatrick //===----------------------------------------------------------------------===// 133cab2bb3Spatrick 143cab2bb3Spatrick #ifndef COMPILERRT_ASSEMBLY_H 153cab2bb3Spatrick #define COMPILERRT_ASSEMBLY_H 163cab2bb3Spatrick 17*810390e3Srobert #if defined(__linux__) && defined(__CET__) 18*810390e3Srobert #if __has_include(<cet.h>) 19*810390e3Srobert #include <cet.h> 20*810390e3Srobert #endif 21*810390e3Srobert #endif 22*810390e3Srobert 23d89ec533Spatrick #if defined(__APPLE__) && defined(__aarch64__) 24d89ec533Spatrick #define SEPARATOR %% 253cab2bb3Spatrick #else 263cab2bb3Spatrick #define SEPARATOR ; 273cab2bb3Spatrick #endif 283cab2bb3Spatrick 293cab2bb3Spatrick #if defined(__APPLE__) 303cab2bb3Spatrick #define HIDDEN(name) .private_extern name 313cab2bb3Spatrick #define LOCAL_LABEL(name) L_##name 323cab2bb3Spatrick // tell linker it can break up file at label boundaries 333cab2bb3Spatrick #define FILE_LEVEL_DIRECTIVE .subsections_via_symbols 343cab2bb3Spatrick #define SYMBOL_IS_FUNC(name) 353cab2bb3Spatrick #define CONST_SECTION .const 363cab2bb3Spatrick 373cab2bb3Spatrick #define NO_EXEC_STACK_DIRECTIVE 383cab2bb3Spatrick 393cab2bb3Spatrick #elif defined(__ELF__) 403cab2bb3Spatrick 413cab2bb3Spatrick #define HIDDEN(name) .hidden name 423cab2bb3Spatrick #define LOCAL_LABEL(name) .L_##name 433cab2bb3Spatrick #define FILE_LEVEL_DIRECTIVE 44d89ec533Spatrick #if defined(__arm__) || defined(__aarch64__) 453cab2bb3Spatrick #define SYMBOL_IS_FUNC(name) .type name,%function 463cab2bb3Spatrick #else 473cab2bb3Spatrick #define SYMBOL_IS_FUNC(name) .type name,@function 483cab2bb3Spatrick #endif 493cab2bb3Spatrick #define CONST_SECTION .section .rodata 503cab2bb3Spatrick 513cab2bb3Spatrick #if defined(__GNU__) || defined(__FreeBSD__) || defined(__Fuchsia__) || \ 523cab2bb3Spatrick defined(__linux__) 533cab2bb3Spatrick #define NO_EXEC_STACK_DIRECTIVE .section .note.GNU-stack,"",%progbits 543cab2bb3Spatrick #else 553cab2bb3Spatrick #define NO_EXEC_STACK_DIRECTIVE 563cab2bb3Spatrick #endif 573cab2bb3Spatrick 583cab2bb3Spatrick #else // !__APPLE__ && !__ELF__ 593cab2bb3Spatrick 603cab2bb3Spatrick #define HIDDEN(name) 613cab2bb3Spatrick #define LOCAL_LABEL(name) .L ## name 623cab2bb3Spatrick #define FILE_LEVEL_DIRECTIVE 633cab2bb3Spatrick #define SYMBOL_IS_FUNC(name) \ 643cab2bb3Spatrick .def name SEPARATOR \ 653cab2bb3Spatrick .scl 2 SEPARATOR \ 663cab2bb3Spatrick .type 32 SEPARATOR \ 673cab2bb3Spatrick .endef 683cab2bb3Spatrick #define CONST_SECTION .section .rdata,"rd" 693cab2bb3Spatrick 703cab2bb3Spatrick #define NO_EXEC_STACK_DIRECTIVE 713cab2bb3Spatrick 723cab2bb3Spatrick #endif 733cab2bb3Spatrick 74d89ec533Spatrick #if defined(__arm__) || defined(__aarch64__) 75d89ec533Spatrick #define FUNC_ALIGN \ 76d89ec533Spatrick .text SEPARATOR \ 77d89ec533Spatrick .balign 16 SEPARATOR 78d89ec533Spatrick #else 79d89ec533Spatrick #define FUNC_ALIGN 80d89ec533Spatrick #endif 81d89ec533Spatrick 82d89ec533Spatrick // BTI and PAC gnu property note 83d89ec533Spatrick #define NT_GNU_PROPERTY_TYPE_0 5 84d89ec533Spatrick #define GNU_PROPERTY_AARCH64_FEATURE_1_AND 0xc0000000 85d89ec533Spatrick #define GNU_PROPERTY_AARCH64_FEATURE_1_BTI 1 86d89ec533Spatrick #define GNU_PROPERTY_AARCH64_FEATURE_1_PAC 2 87d89ec533Spatrick 88d89ec533Spatrick #if defined(__ARM_FEATURE_BTI_DEFAULT) 89d89ec533Spatrick #define BTI_FLAG GNU_PROPERTY_AARCH64_FEATURE_1_BTI 90d89ec533Spatrick #else 91d89ec533Spatrick #define BTI_FLAG 0 92d89ec533Spatrick #endif 93d89ec533Spatrick 94d89ec533Spatrick #if __ARM_FEATURE_PAC_DEFAULT & 3 95d89ec533Spatrick #define PAC_FLAG GNU_PROPERTY_AARCH64_FEATURE_1_PAC 96d89ec533Spatrick #else 97d89ec533Spatrick #define PAC_FLAG 0 98d89ec533Spatrick #endif 99d89ec533Spatrick 100d89ec533Spatrick #define GNU_PROPERTY(type, value) \ 101d89ec533Spatrick .pushsection .note.gnu.property, "a" SEPARATOR \ 102d89ec533Spatrick .p2align 3 SEPARATOR \ 103d89ec533Spatrick .word 4 SEPARATOR \ 104d89ec533Spatrick .word 16 SEPARATOR \ 105d89ec533Spatrick .word NT_GNU_PROPERTY_TYPE_0 SEPARATOR \ 106d89ec533Spatrick .asciz "GNU" SEPARATOR \ 107d89ec533Spatrick .word type SEPARATOR \ 108d89ec533Spatrick .word 4 SEPARATOR \ 109d89ec533Spatrick .word value SEPARATOR \ 110d89ec533Spatrick .word 0 SEPARATOR \ 111d89ec533Spatrick .popsection 112d89ec533Spatrick 113d89ec533Spatrick #if BTI_FLAG != 0 114d89ec533Spatrick #define BTI_C hint #34 115d89ec533Spatrick #define BTI_J hint #36 116d89ec533Spatrick #else 117d89ec533Spatrick #define BTI_C 118d89ec533Spatrick #define BTI_J 119d89ec533Spatrick #endif 120d89ec533Spatrick 121d89ec533Spatrick #if (BTI_FLAG | PAC_FLAG) != 0 122d89ec533Spatrick #define GNU_PROPERTY_BTI_PAC \ 123d89ec533Spatrick GNU_PROPERTY(GNU_PROPERTY_AARCH64_FEATURE_1_AND, BTI_FLAG | PAC_FLAG) 124d89ec533Spatrick #else 125d89ec533Spatrick #define GNU_PROPERTY_BTI_PAC 126d89ec533Spatrick #endif 127d89ec533Spatrick 128d89ec533Spatrick #if defined(__clang__) || defined(__GCC_HAVE_DWARF2_CFI_ASM) 129d89ec533Spatrick #define CFI_START .cfi_startproc 130d89ec533Spatrick #define CFI_END .cfi_endproc 131d89ec533Spatrick #else 132d89ec533Spatrick #define CFI_START 133d89ec533Spatrick #define CFI_END 134d89ec533Spatrick #endif 135d89ec533Spatrick 1363cab2bb3Spatrick #if defined(__arm__) 1373cab2bb3Spatrick 1383cab2bb3Spatrick // Determine actual [ARM][THUMB[1][2]] ISA using compiler predefined macros: 1393cab2bb3Spatrick // - for '-mthumb -march=armv6' compiler defines '__thumb__' 1403cab2bb3Spatrick // - for '-mthumb -march=armv7' compiler defines '__thumb__' and '__thumb2__' 1413cab2bb3Spatrick #if defined(__thumb2__) || defined(__thumb__) 1423cab2bb3Spatrick #define DEFINE_CODE_STATE .thumb SEPARATOR 1433cab2bb3Spatrick #define DECLARE_FUNC_ENCODING .thumb_func SEPARATOR 1443cab2bb3Spatrick #if defined(__thumb2__) 1453cab2bb3Spatrick #define USE_THUMB_2 1463cab2bb3Spatrick #define IT(cond) it cond 1473cab2bb3Spatrick #define ITT(cond) itt cond 1483cab2bb3Spatrick #define ITE(cond) ite cond 1493cab2bb3Spatrick #else 1503cab2bb3Spatrick #define USE_THUMB_1 1513cab2bb3Spatrick #define IT(cond) 1523cab2bb3Spatrick #define ITT(cond) 1533cab2bb3Spatrick #define ITE(cond) 1543cab2bb3Spatrick #endif // defined(__thumb__2) 1553cab2bb3Spatrick #else // !defined(__thumb2__) && !defined(__thumb__) 1563cab2bb3Spatrick #define DEFINE_CODE_STATE .arm SEPARATOR 1573cab2bb3Spatrick #define DECLARE_FUNC_ENCODING 1583cab2bb3Spatrick #define IT(cond) 1593cab2bb3Spatrick #define ITT(cond) 1603cab2bb3Spatrick #define ITE(cond) 1613cab2bb3Spatrick #endif 1623cab2bb3Spatrick 1633cab2bb3Spatrick #if defined(USE_THUMB_1) && defined(USE_THUMB_2) 1643cab2bb3Spatrick #error "USE_THUMB_1 and USE_THUMB_2 can't be defined together." 1653cab2bb3Spatrick #endif 1663cab2bb3Spatrick 1673cab2bb3Spatrick #if defined(__ARM_ARCH_4T__) || __ARM_ARCH >= 5 1683cab2bb3Spatrick #define ARM_HAS_BX 1693cab2bb3Spatrick #endif 1703cab2bb3Spatrick #if !defined(__ARM_FEATURE_CLZ) && !defined(USE_THUMB_1) && \ 1713cab2bb3Spatrick (__ARM_ARCH >= 6 || (__ARM_ARCH == 5 && !defined(__ARM_ARCH_5__))) 1723cab2bb3Spatrick #define __ARM_FEATURE_CLZ 1733cab2bb3Spatrick #endif 1743cab2bb3Spatrick 1753cab2bb3Spatrick #ifdef ARM_HAS_BX 1763cab2bb3Spatrick #define JMP(r) bx r 1773cab2bb3Spatrick #define JMPc(r, c) bx##c r 1783cab2bb3Spatrick #else 1793cab2bb3Spatrick #define JMP(r) mov pc, r 1803cab2bb3Spatrick #define JMPc(r, c) mov##c pc, r 1813cab2bb3Spatrick #endif 1823cab2bb3Spatrick 1833cab2bb3Spatrick // pop {pc} can't switch Thumb mode on ARMv4T 1843cab2bb3Spatrick #if __ARM_ARCH >= 5 1853cab2bb3Spatrick #define POP_PC() pop {pc} 1863cab2bb3Spatrick #else 1873cab2bb3Spatrick #define POP_PC() \ 1883cab2bb3Spatrick pop {ip}; \ 1893cab2bb3Spatrick JMP(ip) 1903cab2bb3Spatrick #endif 1913cab2bb3Spatrick 1923cab2bb3Spatrick #if defined(USE_THUMB_2) 1933cab2bb3Spatrick #define WIDE(op) op.w 1943cab2bb3Spatrick #else 1953cab2bb3Spatrick #define WIDE(op) op 1963cab2bb3Spatrick #endif 1973cab2bb3Spatrick #else // !defined(__arm) 1983cab2bb3Spatrick #define DECLARE_FUNC_ENCODING 1993cab2bb3Spatrick #define DEFINE_CODE_STATE 2003cab2bb3Spatrick #endif 2013cab2bb3Spatrick 202d89ec533Spatrick #define GLUE2_(a, b) a##b 203d89ec533Spatrick #define GLUE(a, b) GLUE2_(a, b) 204d89ec533Spatrick #define GLUE2(a, b) GLUE2_(a, b) 205d89ec533Spatrick #define GLUE3_(a, b, c) a##b##c 206d89ec533Spatrick #define GLUE3(a, b, c) GLUE3_(a, b, c) 207d89ec533Spatrick #define GLUE4_(a, b, c, d) a##b##c##d 208d89ec533Spatrick #define GLUE4(a, b, c, d) GLUE4_(a, b, c, d) 209d89ec533Spatrick 2103cab2bb3Spatrick #define SYMBOL_NAME(name) GLUE(__USER_LABEL_PREFIX__, name) 2113cab2bb3Spatrick 2123cab2bb3Spatrick #ifdef VISIBILITY_HIDDEN 2133cab2bb3Spatrick #define DECLARE_SYMBOL_VISIBILITY(name) \ 2143cab2bb3Spatrick HIDDEN(SYMBOL_NAME(name)) SEPARATOR 215d89ec533Spatrick #define DECLARE_SYMBOL_VISIBILITY_UNMANGLED(name) \ 216d89ec533Spatrick HIDDEN(name) SEPARATOR 2173cab2bb3Spatrick #else 2183cab2bb3Spatrick #define DECLARE_SYMBOL_VISIBILITY(name) 219d89ec533Spatrick #define DECLARE_SYMBOL_VISIBILITY_UNMANGLED(name) 2203cab2bb3Spatrick #endif 2213cab2bb3Spatrick 2223cab2bb3Spatrick #define DEFINE_COMPILERRT_FUNCTION(name) \ 2233cab2bb3Spatrick DEFINE_CODE_STATE \ 2243cab2bb3Spatrick FILE_LEVEL_DIRECTIVE SEPARATOR \ 2253cab2bb3Spatrick .globl SYMBOL_NAME(name) SEPARATOR \ 2263cab2bb3Spatrick SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \ 2273cab2bb3Spatrick DECLARE_SYMBOL_VISIBILITY(name) \ 2283cab2bb3Spatrick DECLARE_FUNC_ENCODING \ 2293cab2bb3Spatrick SYMBOL_NAME(name): 2303cab2bb3Spatrick 2313cab2bb3Spatrick #define DEFINE_COMPILERRT_THUMB_FUNCTION(name) \ 2323cab2bb3Spatrick DEFINE_CODE_STATE \ 2333cab2bb3Spatrick FILE_LEVEL_DIRECTIVE SEPARATOR \ 2343cab2bb3Spatrick .globl SYMBOL_NAME(name) SEPARATOR \ 2353cab2bb3Spatrick SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \ 2363cab2bb3Spatrick DECLARE_SYMBOL_VISIBILITY(name) SEPARATOR \ 2373cab2bb3Spatrick .thumb_func SEPARATOR \ 2383cab2bb3Spatrick SYMBOL_NAME(name): 2393cab2bb3Spatrick 2403cab2bb3Spatrick #define DEFINE_COMPILERRT_PRIVATE_FUNCTION(name) \ 2413cab2bb3Spatrick DEFINE_CODE_STATE \ 2423cab2bb3Spatrick FILE_LEVEL_DIRECTIVE SEPARATOR \ 2433cab2bb3Spatrick .globl SYMBOL_NAME(name) SEPARATOR \ 2443cab2bb3Spatrick SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \ 2453cab2bb3Spatrick HIDDEN(SYMBOL_NAME(name)) SEPARATOR \ 2463cab2bb3Spatrick DECLARE_FUNC_ENCODING \ 2473cab2bb3Spatrick SYMBOL_NAME(name): 2483cab2bb3Spatrick 2493cab2bb3Spatrick #define DEFINE_COMPILERRT_PRIVATE_FUNCTION_UNMANGLED(name) \ 2503cab2bb3Spatrick DEFINE_CODE_STATE \ 2513cab2bb3Spatrick .globl name SEPARATOR \ 2523cab2bb3Spatrick SYMBOL_IS_FUNC(name) SEPARATOR \ 2533cab2bb3Spatrick HIDDEN(name) SEPARATOR \ 2543cab2bb3Spatrick DECLARE_FUNC_ENCODING \ 2553cab2bb3Spatrick name: 2563cab2bb3Spatrick 257d89ec533Spatrick #define DEFINE_COMPILERRT_OUTLINE_FUNCTION_UNMANGLED(name) \ 258d89ec533Spatrick DEFINE_CODE_STATE \ 259d89ec533Spatrick FUNC_ALIGN \ 260d89ec533Spatrick .globl name SEPARATOR \ 261d89ec533Spatrick SYMBOL_IS_FUNC(name) SEPARATOR \ 262d89ec533Spatrick DECLARE_SYMBOL_VISIBILITY_UNMANGLED(name) SEPARATOR \ 263d89ec533Spatrick CFI_START SEPARATOR \ 264d89ec533Spatrick DECLARE_FUNC_ENCODING \ 265d89ec533Spatrick name: SEPARATOR BTI_C 266d89ec533Spatrick 2673cab2bb3Spatrick #define DEFINE_COMPILERRT_FUNCTION_ALIAS(name, target) \ 2683cab2bb3Spatrick .globl SYMBOL_NAME(name) SEPARATOR \ 2693cab2bb3Spatrick SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \ 2703cab2bb3Spatrick DECLARE_SYMBOL_VISIBILITY(SYMBOL_NAME(name)) SEPARATOR \ 2713cab2bb3Spatrick .set SYMBOL_NAME(name), SYMBOL_NAME(target) SEPARATOR 2723cab2bb3Spatrick 2733cab2bb3Spatrick #if defined(__ARM_EABI__) 2743cab2bb3Spatrick #define DEFINE_AEABI_FUNCTION_ALIAS(aeabi_name, name) \ 2753cab2bb3Spatrick DEFINE_COMPILERRT_FUNCTION_ALIAS(aeabi_name, name) 2763cab2bb3Spatrick #else 2773cab2bb3Spatrick #define DEFINE_AEABI_FUNCTION_ALIAS(aeabi_name, name) 2783cab2bb3Spatrick #endif 2793cab2bb3Spatrick 2803cab2bb3Spatrick #ifdef __ELF__ 2813cab2bb3Spatrick #define END_COMPILERRT_FUNCTION(name) \ 2823cab2bb3Spatrick .size SYMBOL_NAME(name), . - SYMBOL_NAME(name) 283d89ec533Spatrick #define END_COMPILERRT_OUTLINE_FUNCTION(name) \ 284d89ec533Spatrick CFI_END SEPARATOR \ 285d89ec533Spatrick .size SYMBOL_NAME(name), . - SYMBOL_NAME(name) 2863cab2bb3Spatrick #else 2873cab2bb3Spatrick #define END_COMPILERRT_FUNCTION(name) 288d89ec533Spatrick #define END_COMPILERRT_OUTLINE_FUNCTION(name) \ 289d89ec533Spatrick CFI_END 2903cab2bb3Spatrick #endif 2913cab2bb3Spatrick 2923cab2bb3Spatrick #endif // COMPILERRT_ASSEMBLY_H 293