blob: 978f6bd619bd3f02f4bc2dd8cb64c85cfb9db0a0 [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
gejin7f493162021-08-26 16:20:38 +080018#if (defined(__i386__) || defined(__x86_64__)) && defined(__linux__)
19#include <cet.h>
20#define _LIBUNWIND_CET_ENDBR _CET_ENDBR
21#else
22#define _LIBUNWIND_CET_ENDBR
23#endif
24
Martin Storsjo8338b0a2018-01-02 22:11:30 +000025#if defined(__powerpc64__)
26#define SEPARATOR ;
Martin Storsjo6518fcb2018-01-16 20:54:10 +000027#define PPC64_OFFS_SRR0 0
28#define PPC64_OFFS_CR 272
29#define PPC64_OFFS_XER 280
30#define PPC64_OFFS_LR 288
31#define PPC64_OFFS_CTR 296
32#define PPC64_OFFS_VRSAVE 304
33#define PPC64_OFFS_FP 312
34#define PPC64_OFFS_V 824
Fangrui Song1b5cb742020-04-09 14:09:43 -070035#elif defined(__APPLE__) && defined(__aarch64__)
Saleem Abdulrasool17552662015-04-24 19:39:17 +000036#define SEPARATOR %%
Kamlesh Kumarf6ac3de2021-03-02 06:57:54 +053037#elif defined(__riscv)
38# define RISCV_ISIZE (__riscv_xlen / 8)
39# define RISCV_FOFFSET (RISCV_ISIZE * 32)
40# if defined(__riscv_flen)
41# define RISCV_FSIZE (__riscv_flen / 8)
42# endif
43
44# if __riscv_xlen == 64
45# define ILOAD ld
46# define ISTORE sd
47# elif __riscv_xlen == 32
48# define ILOAD lw
49# define ISTORE sw
50# else
51# error "Unsupported __riscv_xlen"
52# endif
53
54# if defined(__riscv_flen)
55# if __riscv_flen == 64
56# define FLOAD fld
57# define FSTORE fsd
58# elif __riscv_flen == 32
59# define FLOAD flw
60# define FSTORE fsw
61# else
62# error "Unsupported __riscv_flen"
63# endif
64# endif
65# define SEPARATOR ;
Saleem Abdulrasool17552662015-04-24 19:39:17 +000066#else
67#define SEPARATOR ;
68#endif
69
Martin Storsjo8a6fc692019-05-16 06:49:13 +000070#if defined(__powerpc64__) && (!defined(_CALL_ELF) || _CALL_ELF == 1)
71#define PPC64_OPD1 .section .opd,"aw",@progbits SEPARATOR
72#define PPC64_OPD2 SEPARATOR \
73 .p2align 3 SEPARATOR \
74 .quad .Lfunc_begin0 SEPARATOR \
75 .quad .TOC.@tocbase SEPARATOR \
76 .quad 0 SEPARATOR \
77 .text SEPARATOR \
78.Lfunc_begin0:
79#else
80#define PPC64_OPD1
81#define PPC64_OPD2
82#endif
83
Ties Stuijc8c0ec92021-12-08 09:44:45 +000084#if defined(__aarch64__) && defined(__ARM_FEATURE_BTI_DEFAULT)
Daniel Kissb4416852020-09-29 15:50:19 +020085 .pushsection ".note.gnu.property", "a" SEPARATOR \
86 .balign 8 SEPARATOR \
87 .long 4 SEPARATOR \
88 .long 0x10 SEPARATOR \
89 .long 0x5 SEPARATOR \
90 .asciz "GNU" SEPARATOR \
91 .long 0xc0000000 SEPARATOR /* GNU_PROPERTY_AARCH64_FEATURE_1_AND */ \
92 .long 4 SEPARATOR \
93 .long 3 SEPARATOR /* GNU_PROPERTY_AARCH64_FEATURE_1_BTI AND */ \
94 /* GNU_PROPERTY_AARCH64_FEATURE_1_PAC */ \
95 .long 0 SEPARATOR \
96 .popsection SEPARATOR
97#define AARCH64_BTI bti c
98#else
99#define AARCH64_BTI
100#endif
101
Ties Stuijc8c0ec92021-12-08 09:44:45 +0000102#if !defined(__aarch64__)
103#ifdef __ARM_FEATURE_PAC_DEFAULT
104 .eabi_attribute Tag_PAC_extension, 2
105 .eabi_attribute Tag_PACRET_use, 1
106#endif
107#ifdef __ARM_FEATURE_BTI_DEFAULT
108 .eabi_attribute Tag_BTI_extension, 1
109 .eabi_attribute Tag_BTI_use, 1
110#endif
111#endif
112
Saleem Abdulrasool17552662015-04-24 19:39:17 +0000113#define GLUE2(a, b) a ## b
114#define GLUE(a, b) GLUE2(a, b)
115#define SYMBOL_NAME(name) GLUE(__USER_LABEL_PREFIX__, name)
116
117#if defined(__APPLE__)
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +0000118
Saleem Abdulrasool17552662015-04-24 19:39:17 +0000119#define SYMBOL_IS_FUNC(name)
Martin Storsjo6038ed32017-10-22 19:39:26 +0000120#define HIDDEN_SYMBOL(name) .private_extern name
Ryan Prichard8d5fb6f2021-02-22 16:35:38 -0800121#if defined(_LIBUNWIND_HIDE_SYMBOLS)
122#define EXPORT_SYMBOL(name) HIDDEN_SYMBOL(name)
123#else
124#define EXPORT_SYMBOL(name)
125#endif
Petr Hosek9bbfad52019-04-03 21:50:03 +0000126#define WEAK_ALIAS(name, aliasname) \
Petr Hosek2ec9ffc2019-04-04 03:36:35 +0000127 .globl SYMBOL_NAME(aliasname) SEPARATOR \
Ryan Prichard8d5fb6f2021-02-22 16:35:38 -0800128 EXPORT_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \
Petr Hosek9bbfad52019-04-03 21:50:03 +0000129 SYMBOL_NAME(aliasname) = SYMBOL_NAME(name)
130
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +0000131#define NO_EXEC_STACK_DIRECTIVE
132
Saleem Abdulrasool17552662015-04-24 19:39:17 +0000133#elif defined(__ELF__)
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +0000134
Saleem Abdulrasool17552662015-04-24 19:39:17 +0000135#if defined(__arm__)
136#define SYMBOL_IS_FUNC(name) .type name,%function
137#else
138#define SYMBOL_IS_FUNC(name) .type name,@function
139#endif
Martin Storsjo6038ed32017-10-22 19:39:26 +0000140#define HIDDEN_SYMBOL(name) .hidden name
Ryan Prichard8d5fb6f2021-02-22 16:35:38 -0800141#if defined(_LIBUNWIND_HIDE_SYMBOLS)
142#define EXPORT_SYMBOL(name) HIDDEN_SYMBOL(name)
143#else
144#define EXPORT_SYMBOL(name)
145#endif
Petr Hosek9bbfad52019-04-03 21:50:03 +0000146#define WEAK_SYMBOL(name) .weak name
Brian Cainb432c472020-04-09 00:14:02 -0500147
148#if defined(__hexagon__)
Ryan Prichard8d5fb6f2021-02-22 16:35:38 -0800149#define WEAK_ALIAS(name, aliasname) \
150 EXPORT_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \
151 WEAK_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \
Brian Cainb432c472020-04-09 00:14:02 -0500152 .equiv SYMBOL_NAME(aliasname), SYMBOL_NAME(name)
153#else
Petr Hosek9bbfad52019-04-03 21:50:03 +0000154#define WEAK_ALIAS(name, aliasname) \
Ryan Prichard8d5fb6f2021-02-22 16:35:38 -0800155 EXPORT_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \
156 WEAK_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \
Petr Hosek9bbfad52019-04-03 21:50:03 +0000157 SYMBOL_NAME(aliasname) = SYMBOL_NAME(name)
Brian Cainb432c472020-04-09 00:14:02 -0500158#endif
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +0000159
Manoj Guptad8b79152017-05-16 20:18:57 +0000160#if defined(__GNU__) || defined(__FreeBSD__) || defined(__Fuchsia__) || \
161 defined(__linux__)
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +0000162#define NO_EXEC_STACK_DIRECTIVE .section .note.GNU-stack,"",%progbits
Saleem Abdulrasool17552662015-04-24 19:39:17 +0000163#else
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +0000164#define NO_EXEC_STACK_DIRECTIVE
165#endif
166
Martin Storsjo6038ed32017-10-22 19:39:26 +0000167#elif defined(_WIN32)
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +0000168
Saleem Abdulrasool17552662015-04-24 19:39:17 +0000169#define SYMBOL_IS_FUNC(name) \
170 .def name SEPARATOR \
171 .scl 2 SEPARATOR \
172 .type 32 SEPARATOR \
173 .endef
Petr Hosek9bbfad52019-04-03 21:50:03 +0000174#define EXPORT_SYMBOL2(name) \
175 .section .drectve,"yn" SEPARATOR \
176 .ascii "-export:", #name, "\0" SEPARATOR \
Charles Davisc5094702018-08-31 18:11:48 +0000177 .text
Ryan Prichard8d5fb6f2021-02-22 16:35:38 -0800178#if defined(_LIBUNWIND_HIDE_SYMBOLS)
Martin Storsjocf47ba62018-12-11 07:34:14 +0000179#define EXPORT_SYMBOL(name)
180#else
Charles Davisc5094702018-08-31 18:11:48 +0000181#define EXPORT_SYMBOL(name) EXPORT_SYMBOL2(name)
Martin Storsjocf47ba62018-12-11 07:34:14 +0000182#endif
Martin Storsjo6038ed32017-10-22 19:39:26 +0000183#define HIDDEN_SYMBOL(name)
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +0000184
Petr Hosek9bbfad52019-04-03 21:50:03 +0000185#if defined(__MINGW32__)
186#define WEAK_ALIAS(name, aliasname) \
187 .globl SYMBOL_NAME(aliasname) SEPARATOR \
188 EXPORT_SYMBOL(aliasname) SEPARATOR \
189 SYMBOL_NAME(aliasname) = SYMBOL_NAME(name)
190#else
191#define WEAK_ALIAS3(name, aliasname) \
192 .section .drectve,"yn" SEPARATOR \
193 .ascii "-alternatename:", #aliasname, "=", #name, "\0" SEPARATOR \
194 .text
195#define WEAK_ALIAS2(name, aliasname) \
196 WEAK_ALIAS3(name, aliasname)
197#define WEAK_ALIAS(name, aliasname) \
198 EXPORT_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \
199 WEAK_ALIAS2(SYMBOL_NAME(name), SYMBOL_NAME(aliasname))
200#endif
201
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +0000202#define NO_EXEC_STACK_DIRECTIVE
203
Daniel Cederman9f2f07a2019-01-14 10:15:20 +0000204#elif defined(__sparc__)
205
Martin Storsjo6038ed32017-10-22 19:39:26 +0000206#else
207
208#error Unsupported target
209
Saleem Abdulrasool17552662015-04-24 19:39:17 +0000210#endif
211
Petr Hosek9bbfad52019-04-03 21:50:03 +0000212#define DEFINE_LIBUNWIND_FUNCTION(name) \
213 .globl SYMBOL_NAME(name) SEPARATOR \
214 HIDDEN_SYMBOL(SYMBOL_NAME(name)) SEPARATOR \
215 SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \
Martin Storsjo8a6fc692019-05-16 06:49:13 +0000216 PPC64_OPD1 \
217 SYMBOL_NAME(name): \
Daniel Kissb4416852020-09-29 15:50:19 +0200218 PPC64_OPD2 \
219 AARCH64_BTI
Saleem Abdulrasool17552662015-04-24 19:39:17 +0000220
221#if defined(__arm__)
222#if !defined(__ARM_ARCH)
223#define __ARM_ARCH 4
224#endif
225
226#if defined(__ARM_ARCH_4T__) || __ARM_ARCH >= 5
227#define ARM_HAS_BX
228#endif
229
230#ifdef ARM_HAS_BX
231#define JMP(r) bx r
232#else
233#define JMP(r) mov pc, r
234#endif
235#endif /* __arm__ */
236
Sam James72464132022-01-27 21:48:38 +0000237#if defined(__powerpc__)
Xing Xued6f21e02021-05-06 14:33:38 -0400238#define PPC_LEFT_SHIFT(index) << (index)
239#endif
240
Saleem Abdulrasool17552662015-04-24 19:39:17 +0000241#endif /* UNWIND_ASSEMBLY_H */