xref: /openbsd-src/gnu/llvm/compiler-rt/lib/builtins/assembly.h (revision 810390e339a5425391477d5d41c78d7cab2424ac)
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