blob: dcd38198501cf537de6e306723c33e0c0d5f84be [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
Fangrui Song1b5cb742020-04-09 14:09:43 -070028#elif defined(__APPLE__) && defined(__aarch64__)
Saleem Abdulrasool17552662015-04-24 19:39:17 +000029#define SEPARATOR %%
30#else
31#define SEPARATOR ;
32#endif
33
Martin Storsjo8a6fc692019-05-16 06:49:13 +000034#if defined(__powerpc64__) && (!defined(_CALL_ELF) || _CALL_ELF == 1)
35#define PPC64_OPD1 .section .opd,"aw",@progbits SEPARATOR
36#define PPC64_OPD2 SEPARATOR \
37 .p2align 3 SEPARATOR \
38 .quad .Lfunc_begin0 SEPARATOR \
39 .quad .TOC.@tocbase SEPARATOR \
40 .quad 0 SEPARATOR \
41 .text SEPARATOR \
42.Lfunc_begin0:
43#else
44#define PPC64_OPD1
45#define PPC64_OPD2
46#endif
47
Daniel Kissb4416852020-09-29 15:50:19 +020048#if defined(__ARM_FEATURE_BTI_DEFAULT)
49 .pushsection ".note.gnu.property", "a" SEPARATOR \
50 .balign 8 SEPARATOR \
51 .long 4 SEPARATOR \
52 .long 0x10 SEPARATOR \
53 .long 0x5 SEPARATOR \
54 .asciz "GNU" SEPARATOR \
55 .long 0xc0000000 SEPARATOR /* GNU_PROPERTY_AARCH64_FEATURE_1_AND */ \
56 .long 4 SEPARATOR \
57 .long 3 SEPARATOR /* GNU_PROPERTY_AARCH64_FEATURE_1_BTI AND */ \
58 /* GNU_PROPERTY_AARCH64_FEATURE_1_PAC */ \
59 .long 0 SEPARATOR \
60 .popsection SEPARATOR
61#define AARCH64_BTI bti c
62#else
63#define AARCH64_BTI
64#endif
65
Saleem Abdulrasool17552662015-04-24 19:39:17 +000066#define GLUE2(a, b) a ## b
67#define GLUE(a, b) GLUE2(a, b)
68#define SYMBOL_NAME(name) GLUE(__USER_LABEL_PREFIX__, name)
69
70#if defined(__APPLE__)
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +000071
Saleem Abdulrasool17552662015-04-24 19:39:17 +000072#define SYMBOL_IS_FUNC(name)
Martin Storsjo6038ed32017-10-22 19:39:26 +000073#define HIDDEN_SYMBOL(name) .private_extern name
Ryan Prichard8d5fb6f2021-02-22 16:35:38 -080074#if defined(_LIBUNWIND_HIDE_SYMBOLS)
75#define EXPORT_SYMBOL(name) HIDDEN_SYMBOL(name)
76#else
77#define EXPORT_SYMBOL(name)
78#endif
Petr Hosek9bbfad52019-04-03 21:50:03 +000079#define WEAK_ALIAS(name, aliasname) \
Petr Hosek2ec9ffc2019-04-04 03:36:35 +000080 .globl SYMBOL_NAME(aliasname) SEPARATOR \
Ryan Prichard8d5fb6f2021-02-22 16:35:38 -080081 EXPORT_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \
Petr Hosek9bbfad52019-04-03 21:50:03 +000082 SYMBOL_NAME(aliasname) = SYMBOL_NAME(name)
83
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +000084#define NO_EXEC_STACK_DIRECTIVE
85
Saleem Abdulrasool17552662015-04-24 19:39:17 +000086#elif defined(__ELF__)
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +000087
Saleem Abdulrasool17552662015-04-24 19:39:17 +000088#if defined(__arm__)
89#define SYMBOL_IS_FUNC(name) .type name,%function
90#else
91#define SYMBOL_IS_FUNC(name) .type name,@function
92#endif
Martin Storsjo6038ed32017-10-22 19:39:26 +000093#define HIDDEN_SYMBOL(name) .hidden name
Ryan Prichard8d5fb6f2021-02-22 16:35:38 -080094#if defined(_LIBUNWIND_HIDE_SYMBOLS)
95#define EXPORT_SYMBOL(name) HIDDEN_SYMBOL(name)
96#else
97#define EXPORT_SYMBOL(name)
98#endif
Petr Hosek9bbfad52019-04-03 21:50:03 +000099#define WEAK_SYMBOL(name) .weak name
Brian Cainb432c472020-04-09 00:14:02 -0500100
101#if defined(__hexagon__)
Ryan Prichard8d5fb6f2021-02-22 16:35:38 -0800102#define WEAK_ALIAS(name, aliasname) \
103 EXPORT_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \
104 WEAK_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \
Brian Cainb432c472020-04-09 00:14:02 -0500105 .equiv SYMBOL_NAME(aliasname), SYMBOL_NAME(name)
106#else
Petr Hosek9bbfad52019-04-03 21:50:03 +0000107#define WEAK_ALIAS(name, aliasname) \
Ryan Prichard8d5fb6f2021-02-22 16:35:38 -0800108 EXPORT_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \
109 WEAK_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \
Petr Hosek9bbfad52019-04-03 21:50:03 +0000110 SYMBOL_NAME(aliasname) = SYMBOL_NAME(name)
Brian Cainb432c472020-04-09 00:14:02 -0500111#endif
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +0000112
Manoj Guptad8b79152017-05-16 20:18:57 +0000113#if defined(__GNU__) || defined(__FreeBSD__) || defined(__Fuchsia__) || \
114 defined(__linux__)
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +0000115#define NO_EXEC_STACK_DIRECTIVE .section .note.GNU-stack,"",%progbits
Saleem Abdulrasool17552662015-04-24 19:39:17 +0000116#else
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +0000117#define NO_EXEC_STACK_DIRECTIVE
118#endif
119
Martin Storsjo6038ed32017-10-22 19:39:26 +0000120#elif defined(_WIN32)
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +0000121
Saleem Abdulrasool17552662015-04-24 19:39:17 +0000122#define SYMBOL_IS_FUNC(name) \
123 .def name SEPARATOR \
124 .scl 2 SEPARATOR \
125 .type 32 SEPARATOR \
126 .endef
Petr Hosek9bbfad52019-04-03 21:50:03 +0000127#define EXPORT_SYMBOL2(name) \
128 .section .drectve,"yn" SEPARATOR \
129 .ascii "-export:", #name, "\0" SEPARATOR \
Charles Davisc5094702018-08-31 18:11:48 +0000130 .text
Ryan Prichard8d5fb6f2021-02-22 16:35:38 -0800131#if defined(_LIBUNWIND_HIDE_SYMBOLS)
Martin Storsjocf47ba62018-12-11 07:34:14 +0000132#define EXPORT_SYMBOL(name)
133#else
Charles Davisc5094702018-08-31 18:11:48 +0000134#define EXPORT_SYMBOL(name) EXPORT_SYMBOL2(name)
Martin Storsjocf47ba62018-12-11 07:34:14 +0000135#endif
Martin Storsjo6038ed32017-10-22 19:39:26 +0000136#define HIDDEN_SYMBOL(name)
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +0000137
Petr Hosek9bbfad52019-04-03 21:50:03 +0000138#if defined(__MINGW32__)
139#define WEAK_ALIAS(name, aliasname) \
140 .globl SYMBOL_NAME(aliasname) SEPARATOR \
141 EXPORT_SYMBOL(aliasname) SEPARATOR \
142 SYMBOL_NAME(aliasname) = SYMBOL_NAME(name)
143#else
144#define WEAK_ALIAS3(name, aliasname) \
145 .section .drectve,"yn" SEPARATOR \
146 .ascii "-alternatename:", #aliasname, "=", #name, "\0" SEPARATOR \
147 .text
148#define WEAK_ALIAS2(name, aliasname) \
149 WEAK_ALIAS3(name, aliasname)
150#define WEAK_ALIAS(name, aliasname) \
151 EXPORT_SYMBOL(SYMBOL_NAME(aliasname)) SEPARATOR \
152 WEAK_ALIAS2(SYMBOL_NAME(name), SYMBOL_NAME(aliasname))
153#endif
154
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +0000155#define NO_EXEC_STACK_DIRECTIVE
156
Daniel Cederman9f2f07a2019-01-14 10:15:20 +0000157#elif defined(__sparc__)
158
Martin Storsjo6038ed32017-10-22 19:39:26 +0000159#else
160
161#error Unsupported target
162
Saleem Abdulrasool17552662015-04-24 19:39:17 +0000163#endif
164
Petr Hosek9bbfad52019-04-03 21:50:03 +0000165#define DEFINE_LIBUNWIND_FUNCTION(name) \
166 .globl SYMBOL_NAME(name) SEPARATOR \
167 HIDDEN_SYMBOL(SYMBOL_NAME(name)) SEPARATOR \
168 SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \
Martin Storsjo8a6fc692019-05-16 06:49:13 +0000169 PPC64_OPD1 \
170 SYMBOL_NAME(name): \
Daniel Kissb4416852020-09-29 15:50:19 +0200171 PPC64_OPD2 \
172 AARCH64_BTI
Saleem Abdulrasool17552662015-04-24 19:39:17 +0000173
174#if defined(__arm__)
175#if !defined(__ARM_ARCH)
176#define __ARM_ARCH 4
177#endif
178
179#if defined(__ARM_ARCH_4T__) || __ARM_ARCH >= 5
180#define ARM_HAS_BX
181#endif
182
183#ifdef ARM_HAS_BX
184#define JMP(r) bx r
185#else
186#define JMP(r) mov pc, r
187#endif
188#endif /* __arm__ */
189
190#endif /* UNWIND_ASSEMBLY_H */