]>
Commit | Line | Data |
---|---|---|
10189819 MO |
1 | /* ===-- assembly.h - compiler-rt assembler support macros -----------------=== |
2 | * | |
3 | * The LLVM Compiler Infrastructure | |
4 | * | |
5 | * This file is dual licensed under the MIT and the University of Illinois Open | |
6 | * Source Licenses. See LICENSE.TXT for details. | |
7 | * | |
8 | * ===----------------------------------------------------------------------=== | |
9 | * | |
10 | * This file defines macros for use in compiler-rt assembler source. | |
11 | * This file is not part of the interface of this library. | |
12 | * | |
13 | * ===----------------------------------------------------------------------=== | |
14 | */ | |
15 | ||
16 | #ifndef COMPILERRT_ASSEMBLY_H | |
17 | #define COMPILERRT_ASSEMBLY_H | |
18 | ||
19 | #if defined(__POWERPC__) || defined(__powerpc__) || defined(__ppc__) | |
20 | #define SEPARATOR @ | |
21 | #else | |
22 | #define SEPARATOR ; | |
23 | #endif | |
24 | ||
25 | #if defined(__APPLE__) | |
26 | #define HIDDEN(name) .private_extern name | |
27 | #define LOCAL_LABEL(name) L_##name | |
28 | // tell linker it can break up file at label boundaries | |
29 | #define FILE_LEVEL_DIRECTIVE .subsections_via_symbols | |
30 | #define SYMBOL_IS_FUNC(name) | |
31 | #define CONST_SECTION .const | |
32 | ||
33 | #define NO_EXEC_STACK_DIRECTIVE | |
34 | ||
35 | #elif defined(__ELF__) | |
36 | ||
37 | #define HIDDEN(name) .hidden name | |
38 | #define LOCAL_LABEL(name) .L_##name | |
39 | #define FILE_LEVEL_DIRECTIVE | |
40 | #if defined(__arm__) | |
41 | #define SYMBOL_IS_FUNC(name) .type name,%function | |
42 | #else | |
43 | #define SYMBOL_IS_FUNC(name) .type name,@function | |
44 | #endif | |
45 | #define CONST_SECTION .section .rodata | |
46 | ||
5d3805fc JJ |
47 | #if defined(__GNU__) || defined(__FreeBSD__) || defined(__Fuchsia__) || \ |
48 | defined(__linux__) | |
10189819 MO |
49 | #define NO_EXEC_STACK_DIRECTIVE .section .note.GNU-stack,"",%progbits |
50 | #else | |
51 | #define NO_EXEC_STACK_DIRECTIVE | |
52 | #endif | |
53 | ||
54 | #else // !__APPLE__ && !__ELF__ | |
55 | ||
56 | #define HIDDEN(name) | |
57 | #define LOCAL_LABEL(name) .L ## name | |
58 | #define FILE_LEVEL_DIRECTIVE | |
59 | #define SYMBOL_IS_FUNC(name) \ | |
60 | .def name SEPARATOR \ | |
61 | .scl 2 SEPARATOR \ | |
62 | .type 32 SEPARATOR \ | |
63 | .endef | |
64 | #define CONST_SECTION .section .rdata,"rd" | |
65 | ||
66 | #define NO_EXEC_STACK_DIRECTIVE | |
67 | ||
68 | #endif | |
69 | ||
70 | #if defined(__arm__) | |
5d3805fc JJ |
71 | |
72 | /* | |
73 | * Determine actual [ARM][THUMB[1][2]] ISA using compiler predefined macros: | |
74 | * - for '-mthumb -march=armv6' compiler defines '__thumb__' | |
75 | * - for '-mthumb -march=armv7' compiler defines '__thumb__' and '__thumb2__' | |
76 | */ | |
77 | #if defined(__thumb2__) || defined(__thumb__) | |
78 | #define DEFINE_CODE_STATE .thumb SEPARATOR | |
79 | #define DECLARE_FUNC_ENCODING .thumb_func SEPARATOR | |
80 | #if defined(__thumb2__) | |
81 | #define USE_THUMB_2 | |
82 | #define IT(cond) it cond | |
83 | #define ITT(cond) itt cond | |
84 | #define ITE(cond) ite cond | |
85 | #else | |
86 | #define USE_THUMB_1 | |
87 | #define IT(cond) | |
88 | #define ITT(cond) | |
89 | #define ITE(cond) | |
90 | #endif // defined(__thumb__2) | |
91 | #else // !defined(__thumb2__) && !defined(__thumb__) | |
92 | #define DEFINE_CODE_STATE .arm SEPARATOR | |
93 | #define DECLARE_FUNC_ENCODING | |
94 | #define IT(cond) | |
95 | #define ITT(cond) | |
96 | #define ITE(cond) | |
97 | #endif | |
98 | ||
99 | #if defined(USE_THUMB_1) && defined(USE_THUMB_2) | |
100 | #error "USE_THUMB_1 and USE_THUMB_2 can't be defined together." | |
101 | #endif | |
102 | ||
10189819 MO |
103 | #if defined(__ARM_ARCH_4T__) || __ARM_ARCH >= 5 |
104 | #define ARM_HAS_BX | |
105 | #endif | |
5d3805fc | 106 | #if !defined(__ARM_FEATURE_CLZ) && !defined(USE_THUMB_1) && \ |
10189819 MO |
107 | (__ARM_ARCH >= 6 || (__ARM_ARCH == 5 && !defined(__ARM_ARCH_5__))) |
108 | #define __ARM_FEATURE_CLZ | |
109 | #endif | |
110 | ||
111 | #ifdef ARM_HAS_BX | |
112 | #define JMP(r) bx r | |
113 | #define JMPc(r, c) bx##c r | |
114 | #else | |
115 | #define JMP(r) mov pc, r | |
116 | #define JMPc(r, c) mov##c pc, r | |
117 | #endif | |
118 | ||
119 | // pop {pc} can't switch Thumb mode on ARMv4T | |
120 | #if __ARM_ARCH >= 5 | |
121 | #define POP_PC() pop {pc} | |
122 | #else | |
123 | #define POP_PC() \ | |
124 | pop {ip}; \ | |
125 | JMP(ip) | |
126 | #endif | |
127 | ||
5d3805fc | 128 | #if defined(USE_THUMB_2) |
10189819 MO |
129 | #define WIDE(op) op.w |
130 | #else | |
131 | #define WIDE(op) op | |
132 | #endif | |
5d3805fc JJ |
133 | #else // !defined(__arm) |
134 | #define DECLARE_FUNC_ENCODING | |
135 | #define DEFINE_CODE_STATE | |
10189819 MO |
136 | #endif |
137 | ||
138 | #define GLUE2(a, b) a##b | |
139 | #define GLUE(a, b) GLUE2(a, b) | |
140 | #define SYMBOL_NAME(name) GLUE(__USER_LABEL_PREFIX__, name) | |
141 | ||
142 | #ifdef VISIBILITY_HIDDEN | |
143 | #define DECLARE_SYMBOL_VISIBILITY(name) \ | |
144 | HIDDEN(SYMBOL_NAME(name)) SEPARATOR | |
145 | #else | |
146 | #define DECLARE_SYMBOL_VISIBILITY(name) | |
147 | #endif | |
148 | ||
149 | #define DEFINE_COMPILERRT_FUNCTION(name) \ | |
5d3805fc | 150 | DEFINE_CODE_STATE \ |
10189819 MO |
151 | FILE_LEVEL_DIRECTIVE SEPARATOR \ |
152 | .globl SYMBOL_NAME(name) SEPARATOR \ | |
153 | SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \ | |
154 | DECLARE_SYMBOL_VISIBILITY(name) \ | |
5d3805fc | 155 | DECLARE_FUNC_ENCODING \ |
10189819 MO |
156 | SYMBOL_NAME(name): |
157 | ||
158 | #define DEFINE_COMPILERRT_THUMB_FUNCTION(name) \ | |
5d3805fc | 159 | DEFINE_CODE_STATE \ |
10189819 MO |
160 | FILE_LEVEL_DIRECTIVE SEPARATOR \ |
161 | .globl SYMBOL_NAME(name) SEPARATOR \ | |
162 | SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \ | |
163 | DECLARE_SYMBOL_VISIBILITY(name) SEPARATOR \ | |
164 | .thumb_func SEPARATOR \ | |
165 | SYMBOL_NAME(name): | |
166 | ||
167 | #define DEFINE_COMPILERRT_PRIVATE_FUNCTION(name) \ | |
5d3805fc | 168 | DEFINE_CODE_STATE \ |
10189819 MO |
169 | FILE_LEVEL_DIRECTIVE SEPARATOR \ |
170 | .globl SYMBOL_NAME(name) SEPARATOR \ | |
171 | SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \ | |
172 | HIDDEN(SYMBOL_NAME(name)) SEPARATOR \ | |
5d3805fc | 173 | DECLARE_FUNC_ENCODING \ |
10189819 MO |
174 | SYMBOL_NAME(name): |
175 | ||
176 | #define DEFINE_COMPILERRT_PRIVATE_FUNCTION_UNMANGLED(name) \ | |
5d3805fc | 177 | DEFINE_CODE_STATE \ |
10189819 MO |
178 | .globl name SEPARATOR \ |
179 | SYMBOL_IS_FUNC(name) SEPARATOR \ | |
180 | HIDDEN(name) SEPARATOR \ | |
5d3805fc | 181 | DECLARE_FUNC_ENCODING \ |
10189819 MO |
182 | name: |
183 | ||
184 | #define DEFINE_COMPILERRT_FUNCTION_ALIAS(name, target) \ | |
185 | .globl SYMBOL_NAME(name) SEPARATOR \ | |
186 | SYMBOL_IS_FUNC(SYMBOL_NAME(name)) SEPARATOR \ | |
187 | DECLARE_SYMBOL_VISIBILITY(SYMBOL_NAME(name)) SEPARATOR \ | |
188 | .set SYMBOL_NAME(name), SYMBOL_NAME(target) SEPARATOR | |
189 | ||
190 | #if defined(__ARM_EABI__) | |
191 | #define DEFINE_AEABI_FUNCTION_ALIAS(aeabi_name, name) \ | |
192 | DEFINE_COMPILERRT_FUNCTION_ALIAS(aeabi_name, name) | |
193 | #else | |
194 | #define DEFINE_AEABI_FUNCTION_ALIAS(aeabi_name, name) | |
195 | #endif | |
196 | ||
197 | #ifdef __ELF__ | |
198 | #define END_COMPILERRT_FUNCTION(name) \ | |
199 | .size SYMBOL_NAME(name), . - SYMBOL_NAME(name) | |
200 | #else | |
201 | #define END_COMPILERRT_FUNCTION(name) | |
202 | #endif | |
203 | ||
204 | #endif /* COMPILERRT_ASSEMBLY_H */ |