1288149Semaste/* ===-- assembly.h - libUnwind assembler support macros -------------------=== 2288149Semaste * 3353358Sdim * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim * See https://llvm.org/LICENSE.txt for license information. 5353358Sdim * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6288149Semaste * 7288149Semaste * ===----------------------------------------------------------------------=== 8288149Semaste * 9288149Semaste * This file defines macros for use in libUnwind assembler source. 10288149Semaste * This file is not part of the interface of this library. 11288149Semaste * 12288149Semaste * ===----------------------------------------------------------------------=== 13288149Semaste */ 14288149Semaste 15288149Semaste#ifndef UNWIND_ASSEMBLY_H 16288149Semaste#define UNWIND_ASSEMBLY_H 17288149Semaste 18345018Sdim#if defined(__powerpc64__) 19345018Sdim#define SEPARATOR ; 20345018Sdim#define PPC64_OFFS_SRR0 0 21345018Sdim#define PPC64_OFFS_CR 272 22345018Sdim#define PPC64_OFFS_XER 280 23345018Sdim#define PPC64_OFFS_LR 288 24345018Sdim#define PPC64_OFFS_CTR 296 25345018Sdim#define PPC64_OFFS_VRSAVE 304 26345018Sdim#define PPC64_OFFS_FP 312 27345018Sdim#define PPC64_OFFS_V 824 28345018Sdim#ifdef _ARCH_PWR8 29345018Sdim#define PPC64_HAS_VMX 30345018Sdim#endif 31288149Semaste#elif defined(__arm64__) 32288149Semaste#define SEPARATOR %% 33288149Semaste#else 34288149Semaste#define SEPARATOR ; 35288149Semaste#endif 36288149Semaste 37349793Sdim#if defined(__powerpc64__) && (!defined(_CALL_ELF) || _CALL_ELF == 1) 38349793Sdim#define PPC64_OPD1 .section .opd,"aw",@progbits SEPARATOR 39349793Sdim#define PPC64_OPD2 SEPARATOR \ 40349793Sdim .p2align 3 SEPARATOR \ 41349793Sdim .quad .Lfunc_begin0 SEPARATOR \ 42349793Sdim .quad .TOC.@tocbase SEPARATOR \ 43349793Sdim .quad 0 SEPARATOR \ 44349793Sdim .text SEPARATOR \ 45349793Sdim.Lfunc_begin0: 46349793Sdim#else 47349793Sdim#define PPC64_OPD1 48349793Sdim#define PPC64_OPD2 49349793Sdim#endif 50349793Sdim 51288149Semaste#define GLUE2(a, b) a ## b 52288149Semaste#define GLUE(a, b) GLUE2(a, b) 53288149Semaste#define SYMBOL_NAME(name) GLUE(__USER_LABEL_PREFIX__, name) 54288149Semaste 55288149Semaste#if defined(__APPLE__) 56324536Semaste 57288149Semaste#define SYMBOL_IS_FUNC(name) 58345018Sdim#define EXPORT_SYMBOL(name) 59345018Sdim#define HIDDEN_SYMBOL(name) .private_extern name 60353358Sdim#define WEAK_SYMBOL(name) .weak_reference name 61353358Sdim#define WEAK_ALIAS(name, aliasname) \ 62353358Sdim .globl SYMBOL_NAME(aliasname) SEPARATOR \ 63353358Sdim WEAK_SYMBOL(aliasname) SEPARATOR \ 64353358Sdim SYMBOL_NAME(aliasname) = SYMBOL_NAME(name) 65353358Sdim 66324536Semaste#define NO_EXEC_STACK_DIRECTIVE 67324536Semaste 68288149Semaste#elif defined(__ELF__) 69324536Semaste 70288149Semaste#if defined(__arm__) 71288149Semaste#define SYMBOL_IS_FUNC(name) .type name,%function 72288149Semaste#else 73288149Semaste#define SYMBOL_IS_FUNC(name) .type name,@function 74288149Semaste#endif 75345018Sdim#define EXPORT_SYMBOL(name) 76345018Sdim#define HIDDEN_SYMBOL(name) .hidden name 77353358Sdim#define WEAK_SYMBOL(name) .weak name 78353358Sdim#define WEAK_ALIAS(name, aliasname) \ 79353358Sdim WEAK_SYMBOL(aliasname) SEPARATOR \ 80353358Sdim SYMBOL_NAME(aliasname) = SYMBOL_NAME(name) 81324536Semaste 82345018Sdim#if defined(__GNU__) || defined(__FreeBSD__) || defined(__Fuchsia__) || \ 83345018Sdim defined(__linux__) 84324536Semaste#define NO_EXEC_STACK_DIRECTIVE .section .note.GNU-stack,"",%progbits 85288149Semaste#else 86324536Semaste#define NO_EXEC_STACK_DIRECTIVE 87324536Semaste#endif 88324536Semaste 89345018Sdim#elif defined(_WIN32) 90324536Semaste 91288149Semaste#define SYMBOL_IS_FUNC(name) \ 92288149Semaste .def name SEPARATOR \ 93288149Semaste .scl 2 SEPARATOR \ 94288149Semaste .type 32 SEPARATOR \ 95288149Semaste .endef 96353358Sdim#define EXPORT_SYMBOL2(name) \ 97353358Sdim .section .drectve,"yn" SEPARATOR \ 98353358Sdim .ascii "-export:", #name, "\0" SEPARATOR \ 99345018Sdim .text 100345018Sdim#if defined(_LIBUNWIND_DISABLE_VISIBILITY_ANNOTATIONS) 101345018Sdim#define EXPORT_SYMBOL(name) 102345018Sdim#else 103345018Sdim#define EXPORT_SYMBOL(name) EXPORT_SYMBOL2(name) 104345018Sdim#endif 105345018Sdim#define HIDDEN_SYMBOL(name) 106324536Semaste 107353358Sdim#if defined(__MINGW32__) 108353358Sdim#define WEAK_ALIAS(name, aliasname) \ 109353358Sdim .globl SYMBOL_NAME(aliasname) SEPARATOR \ 110353358Sdim EXPORT_SYMBOL(aliasname) SEPARATOR \ 111353358Sdim SYMBOL_NAME(aliasname) = SYMBOL_NAME(name) 112353358Sdim#else 113353358Sdim#define WEAK_ALIAS3(name, aliasname) \ 114353358Sdim .section .drectve,"yn" SEPARATOR \ 115353358Sdim .ascii "-alternatename:", #aliasname, "=", #name, "\0" SEPARATOR \ 116353358Sdim .text 117353358Sdim#define WEAK_ALIAS2(name, aliasname) \ 118353358Sdim WEAK_ALIAS3(name, aliasname) 119353358Sdim#define WEAK_ALIAS(name, aliasname) \ 120353358Sdim EXPORT_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \ 121353358Sdim WEAK_ALIAS2(SYMBOL_NAME(name), SYMBOL_NAME(aliasname)) 122353358Sdim#endif 123353358Sdim 124324536Semaste#define NO_EXEC_STACK_DIRECTIVE 125324536Semaste 126345018Sdim#elif defined(__sparc__) 127345018Sdim 128345018Sdim#else 129345018Sdim 130345018Sdim#error Unsupported target 131345018Sdim 132288149Semaste#endif 133288149Semaste 134353358Sdim#define DEFINE_LIBUNWIND_FUNCTION(name) \ 135353358Sdim .globl SYMBOL_NAME(name) SEPARATOR \ 136353358Sdim HIDDEN_SYMBOL(SYMBOL_NAME(name)) SEPARATOR \ 137353358Sdim SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \ 138353358Sdim PPC64_OPD1 \ 139353358Sdim SYMBOL_NAME(name): \ 140349793Sdim PPC64_OPD2 141288149Semaste 142288149Semaste#if defined(__arm__) 143288149Semaste#if !defined(__ARM_ARCH) 144288149Semaste#define __ARM_ARCH 4 145288149Semaste#endif 146288149Semaste 147288149Semaste#if defined(__ARM_ARCH_4T__) || __ARM_ARCH >= 5 148288149Semaste#define ARM_HAS_BX 149288149Semaste#endif 150288149Semaste 151288149Semaste#ifdef ARM_HAS_BX 152288149Semaste#define JMP(r) bx r 153288149Semaste#else 154288149Semaste#define JMP(r) mov pc, r 155288149Semaste#endif 156288149Semaste#endif /* __arm__ */ 157288149Semaste 158288149Semaste#endif /* UNWIND_ASSEMBLY_H */ 159