1 /* ===-- assembly.h - libUnwind assembler support macros -------------------=== 2 * 3 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 * See https://llvm.org/LICENSE.txt for license information. 5 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 * 7 * ===----------------------------------------------------------------------=== 8 * 9 * This file defines macros for use in libUnwind assembler source. 10 * This file is not part of the interface of this library. 11 * 12 * ===----------------------------------------------------------------------=== 13 */ 14 15 #ifndef UNWIND_ASSEMBLY_H 16 #define UNWIND_ASSEMBLY_H 17 18 #if defined(__powerpc64__) 19 #define SEPARATOR ; 20 #define PPC64_OFFS_SRR0 0 21 #define PPC64_OFFS_CR 272 22 #define PPC64_OFFS_XER 280 23 #define PPC64_OFFS_LR 288 24 #define PPC64_OFFS_CTR 296 25 #define PPC64_OFFS_VRSAVE 304 26 #define PPC64_OFFS_FP 312 27 #define PPC64_OFFS_V 824 28 #elif defined(__APPLE__) && defined(__aarch64__) 29 #define SEPARATOR %% 30 #elif defined(__riscv) 31 # define RISCV_ISIZE (__riscv_xlen / 8) 32 # define RISCV_FOFFSET (RISCV_ISIZE * 32) 33 # if defined(__riscv_flen) 34 # define RISCV_FSIZE (__riscv_flen / 8) 35 # endif 36 37 # if __riscv_xlen == 64 38 # define ILOAD ld 39 # define ISTORE sd 40 # elif __riscv_xlen == 32 41 # define ILOAD lw 42 # define ISTORE sw 43 # else 44 # error "Unsupported __riscv_xlen" 45 # endif 46 47 # if defined(__riscv_flen) 48 # if __riscv_flen == 64 49 # define FLOAD fld 50 # define FSTORE fsd 51 # elif __riscv_flen == 32 52 # define FLOAD flw 53 # define FSTORE fsw 54 # else 55 # error "Unsupported __riscv_flen" 56 # endif 57 # endif 58 # define SEPARATOR ; 59 #else 60 #define SEPARATOR ; 61 #endif 62 63 #if defined(__powerpc64__) && (!defined(_CALL_ELF) || _CALL_ELF == 1) 64 #define PPC64_OPD1 .section .opd,"aw",@progbits SEPARATOR 65 #define PPC64_OPD2 SEPARATOR \ 66 .p2align 3 SEPARATOR \ 67 .quad .Lfunc_begin0 SEPARATOR \ 68 .quad .TOC.@tocbase SEPARATOR \ 69 .quad 0 SEPARATOR \ 70 .text SEPARATOR \ 71 .Lfunc_begin0: 72 #else 73 #define PPC64_OPD1 74 #define PPC64_OPD2 75 #endif 76 77 #if defined(__ARM_FEATURE_BTI_DEFAULT) 78 .pushsection ".note.gnu.property", "a" SEPARATOR \ 79 .balign 8 SEPARATOR \ 80 .long 4 SEPARATOR \ 81 .long 0x10 SEPARATOR \ 82 .long 0x5 SEPARATOR \ 83 .asciz "GNU" SEPARATOR \ 84 .long 0xc0000000 SEPARATOR /* GNU_PROPERTY_AARCH64_FEATURE_1_AND */ \ 85 .long 4 SEPARATOR \ 86 .long 3 SEPARATOR /* GNU_PROPERTY_AARCH64_FEATURE_1_BTI AND */ \ 87 /* GNU_PROPERTY_AARCH64_FEATURE_1_PAC */ \ 88 .long 0 SEPARATOR \ 89 .popsection SEPARATOR 90 #define AARCH64_BTI bti c 91 #else 92 #define AARCH64_BTI 93 #endif 94 95 #define GLUE2(a, b) a ## b 96 #define GLUE(a, b) GLUE2(a, b) 97 #define SYMBOL_NAME(name) GLUE(__USER_LABEL_PREFIX__, name) 98 99 #if defined(__APPLE__) 100 101 #define SYMBOL_IS_FUNC(name) 102 #define HIDDEN_SYMBOL(name) .private_extern name 103 #if defined(_LIBUNWIND_HIDE_SYMBOLS) 104 #define EXPORT_SYMBOL(name) HIDDEN_SYMBOL(name) 105 #else 106 #define EXPORT_SYMBOL(name) 107 #endif 108 #define WEAK_ALIAS(name, aliasname) \ 109 .globl SYMBOL_NAME(aliasname) SEPARATOR \ 110 EXPORT_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \ 111 SYMBOL_NAME(aliasname) = SYMBOL_NAME(name) 112 113 #define NO_EXEC_STACK_DIRECTIVE 114 115 #elif defined(__ELF__) 116 117 #if defined(__arm__) 118 #define SYMBOL_IS_FUNC(name) .type name,%function 119 #else 120 #define SYMBOL_IS_FUNC(name) .type name,@function 121 #endif 122 #define HIDDEN_SYMBOL(name) .hidden name 123 #if defined(_LIBUNWIND_HIDE_SYMBOLS) 124 #define EXPORT_SYMBOL(name) HIDDEN_SYMBOL(name) 125 #else 126 #define EXPORT_SYMBOL(name) 127 #endif 128 #define WEAK_SYMBOL(name) .weak name 129 130 #if defined(__hexagon__) 131 #define WEAK_ALIAS(name, aliasname) \ 132 EXPORT_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \ 133 WEAK_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \ 134 .equiv SYMBOL_NAME(aliasname), SYMBOL_NAME(name) 135 #else 136 #define WEAK_ALIAS(name, aliasname) \ 137 EXPORT_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \ 138 WEAK_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \ 139 SYMBOL_NAME(aliasname) = SYMBOL_NAME(name) 140 #endif 141 142 #if defined(__GNU__) || defined(__FreeBSD__) || defined(__Fuchsia__) || \ 143 defined(__linux__) 144 #define NO_EXEC_STACK_DIRECTIVE .section .note.GNU-stack,"",%progbits 145 #else 146 #define NO_EXEC_STACK_DIRECTIVE 147 #endif 148 149 #elif defined(_WIN32) 150 151 #define SYMBOL_IS_FUNC(name) \ 152 .def name SEPARATOR \ 153 .scl 2 SEPARATOR \ 154 .type 32 SEPARATOR \ 155 .endef 156 #define EXPORT_SYMBOL2(name) \ 157 .section .drectve,"yn" SEPARATOR \ 158 .ascii "-export:", #name, "\0" SEPARATOR \ 159 .text 160 #if defined(_LIBUNWIND_HIDE_SYMBOLS) 161 #define EXPORT_SYMBOL(name) 162 #else 163 #define EXPORT_SYMBOL(name) EXPORT_SYMBOL2(name) 164 #endif 165 #define HIDDEN_SYMBOL(name) 166 167 #if defined(__MINGW32__) 168 #define WEAK_ALIAS(name, aliasname) \ 169 .globl SYMBOL_NAME(aliasname) SEPARATOR \ 170 EXPORT_SYMBOL(aliasname) SEPARATOR \ 171 SYMBOL_NAME(aliasname) = SYMBOL_NAME(name) 172 #else 173 #define WEAK_ALIAS3(name, aliasname) \ 174 .section .drectve,"yn" SEPARATOR \ 175 .ascii "-alternatename:", #aliasname, "=", #name, "\0" SEPARATOR \ 176 .text 177 #define WEAK_ALIAS2(name, aliasname) \ 178 WEAK_ALIAS3(name, aliasname) 179 #define WEAK_ALIAS(name, aliasname) \ 180 EXPORT_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \ 181 WEAK_ALIAS2(SYMBOL_NAME(name), SYMBOL_NAME(aliasname)) 182 #endif 183 184 #define NO_EXEC_STACK_DIRECTIVE 185 186 #elif defined(__sparc__) 187 188 #else 189 190 #error Unsupported target 191 192 #endif 193 194 #define DEFINE_LIBUNWIND_FUNCTION(name) \ 195 .globl SYMBOL_NAME(name) SEPARATOR \ 196 HIDDEN_SYMBOL(SYMBOL_NAME(name)) SEPARATOR \ 197 SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \ 198 PPC64_OPD1 \ 199 SYMBOL_NAME(name): \ 200 PPC64_OPD2 \ 201 AARCH64_BTI 202 203 #if defined(__arm__) 204 #if !defined(__ARM_ARCH) 205 #define __ARM_ARCH 4 206 #endif 207 208 #if defined(__ARM_ARCH_4T__) || __ARM_ARCH >= 5 209 #define ARM_HAS_BX 210 #endif 211 212 #ifdef ARM_HAS_BX 213 #define JMP(r) bx r 214 #else 215 #define JMP(r) mov pc, r 216 #endif 217 #endif /* __arm__ */ 218 219 #if defined(__ppc__) || defined(__powerpc64__) 220 #define PPC_LEFT_SHIFT(index) << (index) 221 #endif 222 223 #endif /* UNWIND_ASSEMBLY_H */ 224