blob: a15b89ff66d9b20260079ca2f92743b9918661b6 [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
Martin Storsjo8338b0a2018-01-02 22:11:30 +000031#elif defined(__POWERPC__) || defined(__powerpc__) || defined(__ppc__)
Saleem Abdulrasool17552662015-04-24 19:39:17 +000032#define SEPARATOR @
33#elif defined(__arm64__)
34#define SEPARATOR %%
35#else
36#define SEPARATOR ;
37#endif
38
Saleem Abdulrasool17552662015-04-24 19:39:17 +000039#define GLUE2(a, b) a ## b
40#define GLUE(a, b) GLUE2(a, b)
41#define SYMBOL_NAME(name) GLUE(__USER_LABEL_PREFIX__, name)
42
43#if defined(__APPLE__)
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +000044
Saleem Abdulrasool17552662015-04-24 19:39:17 +000045#define SYMBOL_IS_FUNC(name)
Charles Davisc5094702018-08-31 18:11:48 +000046#define EXPORT_SYMBOL(name)
Martin Storsjo6038ed32017-10-22 19:39:26 +000047#define HIDDEN_SYMBOL(name) .private_extern name
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +000048#define NO_EXEC_STACK_DIRECTIVE
49
Saleem Abdulrasool17552662015-04-24 19:39:17 +000050#elif defined(__ELF__)
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +000051
Saleem Abdulrasool17552662015-04-24 19:39:17 +000052#if defined(__arm__)
53#define SYMBOL_IS_FUNC(name) .type name,%function
54#else
55#define SYMBOL_IS_FUNC(name) .type name,@function
56#endif
Charles Davisc5094702018-08-31 18:11:48 +000057#define EXPORT_SYMBOL(name)
Martin Storsjo6038ed32017-10-22 19:39:26 +000058#define HIDDEN_SYMBOL(name) .hidden name
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +000059
Manoj Guptad8b79152017-05-16 20:18:57 +000060#if defined(__GNU__) || defined(__FreeBSD__) || defined(__Fuchsia__) || \
61 defined(__linux__)
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +000062#define NO_EXEC_STACK_DIRECTIVE .section .note.GNU-stack,"",%progbits
Saleem Abdulrasool17552662015-04-24 19:39:17 +000063#else
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +000064#define NO_EXEC_STACK_DIRECTIVE
65#endif
66
Martin Storsjo6038ed32017-10-22 19:39:26 +000067#elif defined(_WIN32)
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +000068
Saleem Abdulrasool17552662015-04-24 19:39:17 +000069#define SYMBOL_IS_FUNC(name) \
70 .def name SEPARATOR \
71 .scl 2 SEPARATOR \
72 .type 32 SEPARATOR \
73 .endef
Charles Davisc5094702018-08-31 18:11:48 +000074#define EXPORT_SYMBOL2(name) \
75 .section .drectve,"yn" SEPARATOR \
76 .ascii "-export:", #name, "\0" SEPARATOR \
77 .text
Martin Storsjocf47ba62018-12-11 07:34:14 +000078#if defined(_LIBUNWIND_DISABLE_VISIBILITY_ANNOTATIONS)
79#define EXPORT_SYMBOL(name)
80#else
Charles Davisc5094702018-08-31 18:11:48 +000081#define EXPORT_SYMBOL(name) EXPORT_SYMBOL2(name)
Martin Storsjocf47ba62018-12-11 07:34:14 +000082#endif
Martin Storsjo6038ed32017-10-22 19:39:26 +000083#define HIDDEN_SYMBOL(name)
Saleem Abdulrasool85e5b232016-08-05 21:35:28 +000084
85#define NO_EXEC_STACK_DIRECTIVE
86
Daniel Cederman9f2f07a2019-01-14 10:15:20 +000087#elif defined(__sparc__)
88
Martin Storsjo6038ed32017-10-22 19:39:26 +000089#else
90
91#error Unsupported target
92
Saleem Abdulrasool17552662015-04-24 19:39:17 +000093#endif
94
95#define DEFINE_LIBUNWIND_FUNCTION(name) \
96 .globl SYMBOL_NAME(name) SEPARATOR \
Charles Davisc5094702018-08-31 18:11:48 +000097 EXPORT_SYMBOL(name) SEPARATOR \
Saleem Abdulrasool17552662015-04-24 19:39:17 +000098 SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \
99 SYMBOL_NAME(name):
100
101#define DEFINE_LIBUNWIND_PRIVATE_FUNCTION(name) \
102 .globl SYMBOL_NAME(name) SEPARATOR \
Martin Storsjo6038ed32017-10-22 19:39:26 +0000103 HIDDEN_SYMBOL(SYMBOL_NAME(name)) SEPARATOR \
Saleem Abdulrasool17552662015-04-24 19:39:17 +0000104 SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \
105 SYMBOL_NAME(name):
106
107#if defined(__arm__)
108#if !defined(__ARM_ARCH)
109#define __ARM_ARCH 4
110#endif
111
112#if defined(__ARM_ARCH_4T__) || __ARM_ARCH >= 5
113#define ARM_HAS_BX
114#endif
115
116#ifdef ARM_HAS_BX
117#define JMP(r) bx r
118#else
119#define JMP(r) mov pc, r
120#endif
121#endif /* __arm__ */
122
123#endif /* UNWIND_ASSEMBLY_H */