1 /* ===-- assembly.h - libUnwind assembler support macros -------------------=== 2 * 3 * The LLVM Compiler Infrastructure 4 * 5 * This file is dual licensed under the MIT and the University of Illinois Open 6 * Source Licenses. See LICENSE.TXT for details. 7 * 8 * ===----------------------------------------------------------------------=== 9 * 10 * This file defines macros for use in libUnwind assembler source. 11 * This file is not part of the interface of this library. 12 * 13 * ===----------------------------------------------------------------------=== 14 */ 15 16 #ifndef UNWIND_ASSEMBLY_H 17 #define UNWIND_ASSEMBLY_H 18 19 #if defined(__powerpc64__) 20 #define SEPARATOR ; 21 #define PPC64_OFFS_SRR0 0 22 #define PPC64_OFFS_CR 272 23 #define PPC64_OFFS_XER 280 24 #define PPC64_OFFS_LR 288 25 #define PPC64_OFFS_CTR 296 26 #define PPC64_OFFS_VRSAVE 304 27 #define PPC64_OFFS_FP 312 28 #define PPC64_OFFS_V 824 29 #ifdef _ARCH_PWR8 30 #define PPC64_HAS_VMX 31 #endif 32 #elif defined(__POWERPC__) || defined(__powerpc__) || defined(__ppc__) 33 #define SEPARATOR @ 34 #elif defined(__arm64__) 35 #define SEPARATOR %% 36 #else 37 #define SEPARATOR ; 38 #endif 39 40 #define GLUE2(a, b) a ## b 41 #define GLUE(a, b) GLUE2(a, b) 42 #define SYMBOL_NAME(name) GLUE(__USER_LABEL_PREFIX__, name) 43 44 #if defined(__APPLE__) 45 46 #define SYMBOL_IS_FUNC(name) 47 #define EXPORT_SYMBOL(name) 48 #define HIDDEN_SYMBOL(name) .private_extern name 49 #define NO_EXEC_STACK_DIRECTIVE 50 51 #elif defined(__ELF__) 52 53 #if defined(__arm__) 54 #define SYMBOL_IS_FUNC(name) .type name,%function 55 #else 56 #define SYMBOL_IS_FUNC(name) .type name,@function 57 #endif 58 #define EXPORT_SYMBOL(name) 59 #define HIDDEN_SYMBOL(name) .hidden name 60 61 #if defined(__GNU__) || defined(__FreeBSD__) || defined(__Fuchsia__) || \ 62 defined(__linux__) 63 #define NO_EXEC_STACK_DIRECTIVE .section .note.GNU-stack,"",%progbits 64 #else 65 #define NO_EXEC_STACK_DIRECTIVE 66 #endif 67 68 #elif defined(_WIN32) 69 70 #define SYMBOL_IS_FUNC(name) \ 71 .def name SEPARATOR \ 72 .scl 2 SEPARATOR \ 73 .type 32 SEPARATOR \ 74 .endef 75 #define EXPORT_SYMBOL2(name) \ 76 .section .drectve,"yn" SEPARATOR \ 77 .ascii "-export:", #name, "\0" SEPARATOR \ 78 .text 79 #if defined(_LIBUNWIND_DISABLE_VISIBILITY_ANNOTATIONS) 80 #define EXPORT_SYMBOL(name) 81 #else 82 #define EXPORT_SYMBOL(name) EXPORT_SYMBOL2(name) 83 #endif 84 #define HIDDEN_SYMBOL(name) 85 86 #define NO_EXEC_STACK_DIRECTIVE 87 88 #elif defined(__sparc__) 89 90 #else 91 92 #error Unsupported target 93 94 #endif 95 96 #define DEFINE_LIBUNWIND_FUNCTION(name) \ 97 .globl SYMBOL_NAME(name) SEPARATOR \ 98 EXPORT_SYMBOL(name) SEPARATOR \ 99 SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \ 100 SYMBOL_NAME(name): 101 102 #define DEFINE_LIBUNWIND_PRIVATE_FUNCTION(name) \ 103 .globl SYMBOL_NAME(name) SEPARATOR \ 104 HIDDEN_SYMBOL(SYMBOL_NAME(name)) SEPARATOR \ 105 SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \ 106 SYMBOL_NAME(name): 107 108 #if defined(__arm__) 109 #if !defined(__ARM_ARCH) 110 #define __ARM_ARCH 4 111 #endif 112 113 #if defined(__ARM_ARCH_4T__) || __ARM_ARCH >= 5 114 #define ARM_HAS_BX 115 #endif 116 117 #ifdef ARM_HAS_BX 118 #define JMP(r) bx r 119 #else 120 #define JMP(r) mov pc, r 121 #endif 122 #endif /* __arm__ */ 123 124 #endif /* UNWIND_ASSEMBLY_H */ 125