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