assembly.h revision 345018
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