blob: 4cf179e13edc2729f4beed7ea091fb2780e4da02 [file] [log] [blame]
Saleem Abdulrasool17552662015-04-24 19:39:17 +00001/* ===-- assembly.h - libUnwind assembler support macros -------------------===
2 *
Chandler Carruth61860a52019-01-19 10:56:40 +00003 * 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
Saleem Abdulrasool17552662015-04-24 19:39:17 +00006 *
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
Martin Storsjo8338b0a2018-01-02 22:11:30 +000018#if defined(__powerpc64__)
19#define SEPARATOR ;
Martin Storsjo6518fcb2018-01-16 20:54:10 +000020#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#ifdef _ARCH_PWR8
29#define PPC64_HAS_VMX
30#endif
Fangrui Song1b5cb742020-04-09 14:09:43 -070031#elif defined(__APPLE__) && defined(__aarch64__)
Saleem Abdulrasool17552662015-04-24 19:39:17 +000032#define SEPARATOR %%
33#else
34#define SEPARATOR ;
35#endif
36
Martin Storsjo8a6fc692019-05-16 06:49:13 +000037#if defined(__powerpc64__) && (!defined(_CALL_ELF) || _CALL_ELF == 1)
38#define PPC64_OPD1 .section .opd,"aw",@progbits SEPARATOR
39#define PPC64_OPD2 SEPARATOR \
40 .p2align 3 SEPARATOR \
41 .quad .Lfunc_begin0 SEPARATOR \
42 .quad .TOC.@tocbase SEPARATOR \
43 .quad 0 SEPARATOR \
44 .text SEPARATOR \
45.Lfunc_begin0:
46#else
47#define PPC64_OPD1
48#define PPC64_OPD2
49#endif
50
Saleem Abdulrasool17552662015-04-24 19:39:17 +000051#define GLUE2(a, b) a ## b
52#define GLUE(a, b) GLUE2(a, b)
53#define SYMBOL_NAME(name) GLUE(__USER_LABEL_PREFIX__, name)
54
55#if defined(__APPLE__)
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +000056
Saleem Abdulrasool17552662015-04-24 19:39:17 +000057#define SYMBOL_IS_FUNC(name)
Charles Davisc5094702018-08-31 18:11:48 +000058#define EXPORT_SYMBOL(name)
Martin Storsjo6038ed32017-10-22 19:39:26 +000059#define HIDDEN_SYMBOL(name) .private_extern name
Petr Hosek9bbfad52019-04-03 21:50:03 +000060#define WEAK_SYMBOL(name) .weak_reference name
61#define WEAK_ALIAS(name, aliasname) \
Petr Hosek2ec9ffc2019-04-04 03:36:35 +000062 .globl SYMBOL_NAME(aliasname) SEPARATOR \
Petr Hosek9bbfad52019-04-03 21:50:03 +000063 WEAK_SYMBOL(aliasname) SEPARATOR \
64 SYMBOL_NAME(aliasname) = SYMBOL_NAME(name)
65
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +000066#define NO_EXEC_STACK_DIRECTIVE
67
Saleem Abdulrasool17552662015-04-24 19:39:17 +000068#elif defined(__ELF__)
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +000069
Saleem Abdulrasool17552662015-04-24 19:39:17 +000070#if defined(__arm__)
71#define SYMBOL_IS_FUNC(name) .type name,%function
72#else
73#define SYMBOL_IS_FUNC(name) .type name,@function
74#endif
Charles Davisc5094702018-08-31 18:11:48 +000075#define EXPORT_SYMBOL(name)
Martin Storsjo6038ed32017-10-22 19:39:26 +000076#define HIDDEN_SYMBOL(name) .hidden name
Petr Hosek9bbfad52019-04-03 21:50:03 +000077#define WEAK_SYMBOL(name) .weak name
Brian Cainb432c472020-04-09 00:14:02 -050078
79#if defined(__hexagon__)
80#define WEAK_ALIAS(name, aliasname) \
81 WEAK_SYMBOL(aliasname) SEPARATOR \
82 .equiv SYMBOL_NAME(aliasname), SYMBOL_NAME(name)
83#else
Petr Hosek9bbfad52019-04-03 21:50:03 +000084#define WEAK_ALIAS(name, aliasname) \
85 WEAK_SYMBOL(aliasname) SEPARATOR \
86 SYMBOL_NAME(aliasname) = SYMBOL_NAME(name)
Brian Cainb432c472020-04-09 00:14:02 -050087#endif
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +000088
Manoj Guptad8b79152017-05-16 20:18:57 +000089#if defined(__GNU__) || defined(__FreeBSD__) || defined(__Fuchsia__) || \
90 defined(__linux__)
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +000091#define NO_EXEC_STACK_DIRECTIVE .section .note.GNU-stack,"",%progbits
Saleem Abdulrasool17552662015-04-24 19:39:17 +000092#else
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +000093#define NO_EXEC_STACK_DIRECTIVE
94#endif
95
Martin Storsjo6038ed32017-10-22 19:39:26 +000096#elif defined(_WIN32)
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +000097
Saleem Abdulrasool17552662015-04-24 19:39:17 +000098#define SYMBOL_IS_FUNC(name) \
99 .def name SEPARATOR \
100 .scl 2 SEPARATOR \
101 .type 32 SEPARATOR \
102 .endef
Petr Hosek9bbfad52019-04-03 21:50:03 +0000103#define EXPORT_SYMBOL2(name) \
104 .section .drectve,"yn" SEPARATOR \
105 .ascii "-export:", #name, "\0" SEPARATOR \
Charles Davisc5094702018-08-31 18:11:48 +0000106 .text
Martin Storsjocf47ba62018-12-11 07:34:14 +0000107#if defined(_LIBUNWIND_DISABLE_VISIBILITY_ANNOTATIONS)
108#define EXPORT_SYMBOL(name)
109#else
Charles Davisc5094702018-08-31 18:11:48 +0000110#define EXPORT_SYMBOL(name) EXPORT_SYMBOL2(name)
Martin Storsjocf47ba62018-12-11 07:34:14 +0000111#endif
Martin Storsjo6038ed32017-10-22 19:39:26 +0000112#define HIDDEN_SYMBOL(name)
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +0000113
Petr Hosek9bbfad52019-04-03 21:50:03 +0000114#if defined(__MINGW32__)
115#define WEAK_ALIAS(name, aliasname) \
116 .globl SYMBOL_NAME(aliasname) SEPARATOR \
117 EXPORT_SYMBOL(aliasname) SEPARATOR \
118 SYMBOL_NAME(aliasname) = SYMBOL_NAME(name)
119#else
120#define WEAK_ALIAS3(name, aliasname) \
121 .section .drectve,"yn" SEPARATOR \
122 .ascii "-alternatename:", #aliasname, "=", #name, "\0" SEPARATOR \
123 .text
124#define WEAK_ALIAS2(name, aliasname) \
125 WEAK_ALIAS3(name, aliasname)
126#define WEAK_ALIAS(name, aliasname) \
127 EXPORT_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \
128 WEAK_ALIAS2(SYMBOL_NAME(name), SYMBOL_NAME(aliasname))
129#endif
130
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +0000131#define NO_EXEC_STACK_DIRECTIVE
132
Daniel Cederman9f2f07a2019-01-14 10:15:20 +0000133#elif defined(__sparc__)
134
Martin Storsjo6038ed32017-10-22 19:39:26 +0000135#else
136
137#error Unsupported target
138
Saleem Abdulrasool17552662015-04-24 19:39:17 +0000139#endif
140
Petr Hosek9bbfad52019-04-03 21:50:03 +0000141#define DEFINE_LIBUNWIND_FUNCTION(name) \
142 .globl SYMBOL_NAME(name) SEPARATOR \
143 HIDDEN_SYMBOL(SYMBOL_NAME(name)) SEPARATOR \
144 SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \
Martin Storsjo8a6fc692019-05-16 06:49:13 +0000145 PPC64_OPD1 \
146 SYMBOL_NAME(name): \
147 PPC64_OPD2
Saleem Abdulrasool17552662015-04-24 19:39:17 +0000148
149#if defined(__arm__)
150#if !defined(__ARM_ARCH)
151#define __ARM_ARCH 4
152#endif
153
154#if defined(__ARM_ARCH_4T__) || __ARM_ARCH >= 5
155#define ARM_HAS_BX
156#endif
157
158#ifdef ARM_HAS_BX
159#define JMP(r) bx r
160#else
161#define JMP(r) mov pc, r
162#endif
163#endif /* __arm__ */
164
165#endif /* UNWIND_ASSEMBLY_H */