diff options
Diffstat (limited to 'src/lj_arch.h')
-rw-r--r-- | src/lj_arch.h | 408 |
1 files changed, 329 insertions, 79 deletions
diff --git a/src/lj_arch.h b/src/lj_arch.h index db46f886..cc4eae72 100644 --- a/src/lj_arch.h +++ b/src/lj_arch.h | |||
@@ -8,6 +8,8 @@ | |||
8 | 8 | ||
9 | #include "lua.h" | 9 | #include "lua.h" |
10 | 10 | ||
11 | /* -- Target definitions -------------------------------------------------- */ | ||
12 | |||
11 | /* Target endianess. */ | 13 | /* Target endianess. */ |
12 | #define LUAJIT_LE 0 | 14 | #define LUAJIT_LE 0 |
13 | #define LUAJIT_BE 1 | 15 | #define LUAJIT_BE 1 |
@@ -19,12 +21,16 @@ | |||
19 | #define LUAJIT_ARCH_x64 2 | 21 | #define LUAJIT_ARCH_x64 2 |
20 | #define LUAJIT_ARCH_ARM 3 | 22 | #define LUAJIT_ARCH_ARM 3 |
21 | #define LUAJIT_ARCH_arm 3 | 23 | #define LUAJIT_ARCH_arm 3 |
22 | #define LUAJIT_ARCH_PPC 4 | 24 | #define LUAJIT_ARCH_ARM64 4 |
23 | #define LUAJIT_ARCH_ppc 4 | 25 | #define LUAJIT_ARCH_arm64 4 |
24 | #define LUAJIT_ARCH_PPCSPE 5 | 26 | #define LUAJIT_ARCH_PPC 5 |
25 | #define LUAJIT_ARCH_ppcspe 5 | 27 | #define LUAJIT_ARCH_ppc 5 |
26 | #define LUAJIT_ARCH_MIPS 6 | 28 | #define LUAJIT_ARCH_MIPS 6 |
27 | #define LUAJIT_ARCH_mips 6 | 29 | #define LUAJIT_ARCH_mips 6 |
30 | #define LUAJIT_ARCH_MIPS32 6 | ||
31 | #define LUAJIT_ARCH_mips32 6 | ||
32 | #define LUAJIT_ARCH_MIPS64 7 | ||
33 | #define LUAJIT_ARCH_mips64 7 | ||
28 | 34 | ||
29 | /* Target OS. */ | 35 | /* Target OS. */ |
30 | #define LUAJIT_OS_OTHER 0 | 36 | #define LUAJIT_OS_OTHER 0 |
@@ -34,6 +40,14 @@ | |||
34 | #define LUAJIT_OS_BSD 4 | 40 | #define LUAJIT_OS_BSD 4 |
35 | #define LUAJIT_OS_POSIX 5 | 41 | #define LUAJIT_OS_POSIX 5 |
36 | 42 | ||
43 | /* Number mode. */ | ||
44 | #define LJ_NUMMODE_SINGLE 0 /* Single-number mode only. */ | ||
45 | #define LJ_NUMMODE_SINGLE_DUAL 1 /* Default to single-number mode. */ | ||
46 | #define LJ_NUMMODE_DUAL 2 /* Dual-number mode only. */ | ||
47 | #define LJ_NUMMODE_DUAL_SINGLE 3 /* Default to dual-number mode. */ | ||
48 | |||
49 | /* -- Target detection ---------------------------------------------------- */ | ||
50 | |||
37 | /* Select native target if no target defined. */ | 51 | /* Select native target if no target defined. */ |
38 | #ifndef LUAJIT_TARGET | 52 | #ifndef LUAJIT_TARGET |
39 | 53 | ||
@@ -43,14 +57,14 @@ | |||
43 | #define LUAJIT_TARGET LUAJIT_ARCH_X64 | 57 | #define LUAJIT_TARGET LUAJIT_ARCH_X64 |
44 | #elif defined(__arm__) || defined(__arm) || defined(__ARM__) || defined(__ARM) | 58 | #elif defined(__arm__) || defined(__arm) || defined(__ARM__) || defined(__ARM) |
45 | #define LUAJIT_TARGET LUAJIT_ARCH_ARM | 59 | #define LUAJIT_TARGET LUAJIT_ARCH_ARM |
60 | #elif defined(__aarch64__) | ||
61 | #define LUAJIT_TARGET LUAJIT_ARCH_ARM64 | ||
46 | #elif defined(__ppc__) || defined(__ppc) || defined(__PPC__) || defined(__PPC) || defined(__powerpc__) || defined(__powerpc) || defined(__POWERPC__) || defined(__POWERPC) || defined(_M_PPC) | 62 | #elif defined(__ppc__) || defined(__ppc) || defined(__PPC__) || defined(__PPC) || defined(__powerpc__) || defined(__powerpc) || defined(__POWERPC__) || defined(__POWERPC) || defined(_M_PPC) |
47 | #ifdef __NO_FPRS__ | ||
48 | #define LUAJIT_TARGET LUAJIT_ARCH_PPCSPE | ||
49 | #else | ||
50 | #define LUAJIT_TARGET LUAJIT_ARCH_PPC | 63 | #define LUAJIT_TARGET LUAJIT_ARCH_PPC |
51 | #endif | 64 | #elif defined(__mips64__) || defined(__mips64) || defined(__MIPS64__) || defined(__MIPS64) |
65 | #define LUAJIT_TARGET LUAJIT_ARCH_MIPS64 | ||
52 | #elif defined(__mips__) || defined(__mips) || defined(__MIPS__) || defined(__MIPS) | 66 | #elif defined(__mips__) || defined(__mips) || defined(__MIPS__) || defined(__MIPS) |
53 | #define LUAJIT_TARGET LUAJIT_ARCH_MIPS | 67 | #define LUAJIT_TARGET LUAJIT_ARCH_MIPS32 |
54 | #else | 68 | #else |
55 | #error "No support for this architecture (yet)" | 69 | #error "No support for this architecture (yet)" |
56 | #endif | 70 | #endif |
@@ -65,12 +79,16 @@ | |||
65 | #elif defined(__linux__) | 79 | #elif defined(__linux__) |
66 | #define LUAJIT_OS LUAJIT_OS_LINUX | 80 | #define LUAJIT_OS LUAJIT_OS_LINUX |
67 | #elif defined(__MACH__) && defined(__APPLE__) | 81 | #elif defined(__MACH__) && defined(__APPLE__) |
82 | #include "TargetConditionals.h" | ||
68 | #define LUAJIT_OS LUAJIT_OS_OSX | 83 | #define LUAJIT_OS LUAJIT_OS_OSX |
69 | #elif (defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \ | 84 | #elif (defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \ |
70 | defined(__NetBSD__) || defined(__OpenBSD__) || \ | 85 | defined(__NetBSD__) || defined(__OpenBSD__) || \ |
71 | defined(__DragonFly__)) && !defined(__ORBIS__) | 86 | defined(__DragonFly__)) && !defined(__ORBIS__) |
72 | #define LUAJIT_OS LUAJIT_OS_BSD | 87 | #define LUAJIT_OS LUAJIT_OS_BSD |
73 | #elif (defined(__sun__) && defined(__svr4__)) | 88 | #elif (defined(__sun__) && defined(__svr4__)) |
89 | #define LJ_TARGET_SOLARIS 1 | ||
90 | #define LUAJIT_OS LUAJIT_OS_POSIX | ||
91 | #elif defined(__HAIKU__) | ||
74 | #define LUAJIT_OS LUAJIT_OS_POSIX | 92 | #define LUAJIT_OS LUAJIT_OS_POSIX |
75 | #elif defined(__CYGWIN__) | 93 | #elif defined(__CYGWIN__) |
76 | #define LJ_TARGET_CYGWIN 1 | 94 | #define LJ_TARGET_CYGWIN 1 |
@@ -99,10 +117,16 @@ | |||
99 | #define LJ_TARGET_WINDOWS (LUAJIT_OS == LUAJIT_OS_WINDOWS) | 117 | #define LJ_TARGET_WINDOWS (LUAJIT_OS == LUAJIT_OS_WINDOWS) |
100 | #define LJ_TARGET_LINUX (LUAJIT_OS == LUAJIT_OS_LINUX) | 118 | #define LJ_TARGET_LINUX (LUAJIT_OS == LUAJIT_OS_LINUX) |
101 | #define LJ_TARGET_OSX (LUAJIT_OS == LUAJIT_OS_OSX) | 119 | #define LJ_TARGET_OSX (LUAJIT_OS == LUAJIT_OS_OSX) |
102 | #define LJ_TARGET_IOS (LJ_TARGET_OSX && LUAJIT_TARGET == LUAJIT_ARCH_ARM) | 120 | #define LJ_TARGET_BSD (LUAJIT_OS == LUAJIT_OS_BSD) |
103 | #define LJ_TARGET_POSIX (LUAJIT_OS > LUAJIT_OS_WINDOWS) | 121 | #define LJ_TARGET_POSIX (LUAJIT_OS > LUAJIT_OS_WINDOWS) |
104 | #define LJ_TARGET_DLOPEN LJ_TARGET_POSIX | 122 | #define LJ_TARGET_DLOPEN LJ_TARGET_POSIX |
105 | 123 | ||
124 | #if TARGET_OS_IPHONE | ||
125 | #define LJ_TARGET_IOS 1 | ||
126 | #else | ||
127 | #define LJ_TARGET_IOS 0 | ||
128 | #endif | ||
129 | |||
106 | #ifdef __CELLOS_LV2__ | 130 | #ifdef __CELLOS_LV2__ |
107 | #define LJ_TARGET_PS3 1 | 131 | #define LJ_TARGET_PS3 1 |
108 | #define LJ_TARGET_CONSOLE 1 | 132 | #define LJ_TARGET_CONSOLE 1 |
@@ -125,10 +149,20 @@ | |||
125 | #define LJ_TARGET_CONSOLE 1 | 149 | #define LJ_TARGET_CONSOLE 1 |
126 | #endif | 150 | #endif |
127 | 151 | ||
128 | #define LJ_NUMMODE_SINGLE 0 /* Single-number mode only. */ | 152 | #ifdef _DURANGO |
129 | #define LJ_NUMMODE_SINGLE_DUAL 1 /* Default to single-number mode. */ | 153 | #define LJ_TARGET_XBOXONE 1 |
130 | #define LJ_NUMMODE_DUAL 2 /* Dual-number mode only. */ | 154 | #define LJ_TARGET_CONSOLE 1 |
131 | #define LJ_NUMMODE_DUAL_SINGLE 3 /* Default to dual-number mode. */ | 155 | #define LJ_TARGET_GC64 1 |
156 | #endif | ||
157 | |||
158 | #ifdef _UWP | ||
159 | #define LJ_TARGET_UWP 1 | ||
160 | #if LUAJIT_TARGET == LUAJIT_ARCH_X64 | ||
161 | #define LJ_TARGET_GC64 1 | ||
162 | #endif | ||
163 | #endif | ||
164 | |||
165 | /* -- Arch-specific settings ---------------------------------------------- */ | ||
132 | 166 | ||
133 | /* Set target architecture properties. */ | 167 | /* Set target architecture properties. */ |
134 | #if LUAJIT_TARGET == LUAJIT_ARCH_X86 | 168 | #if LUAJIT_TARGET == LUAJIT_ARCH_X86 |
@@ -136,14 +170,10 @@ | |||
136 | #define LJ_ARCH_NAME "x86" | 170 | #define LJ_ARCH_NAME "x86" |
137 | #define LJ_ARCH_BITS 32 | 171 | #define LJ_ARCH_BITS 32 |
138 | #define LJ_ARCH_ENDIAN LUAJIT_LE | 172 | #define LJ_ARCH_ENDIAN LUAJIT_LE |
139 | #if LJ_TARGET_WINDOWS || LJ_TARGET_CYGWIN | ||
140 | #define LJ_ABI_WIN 1 | ||
141 | #else | ||
142 | #define LJ_ABI_WIN 0 | ||
143 | #endif | ||
144 | #define LJ_TARGET_X86 1 | 173 | #define LJ_TARGET_X86 1 |
145 | #define LJ_TARGET_X86ORX64 1 | 174 | #define LJ_TARGET_X86ORX64 1 |
146 | #define LJ_TARGET_EHRETREG 0 | 175 | #define LJ_TARGET_EHRETREG 0 |
176 | #define LJ_TARGET_EHRAREG 8 | ||
147 | #define LJ_TARGET_MASKSHIFT 1 | 177 | #define LJ_TARGET_MASKSHIFT 1 |
148 | #define LJ_TARGET_MASKROT 1 | 178 | #define LJ_TARGET_MASKROT 1 |
149 | #define LJ_TARGET_UNALIGNED 1 | 179 | #define LJ_TARGET_UNALIGNED 1 |
@@ -154,19 +184,20 @@ | |||
154 | #define LJ_ARCH_NAME "x64" | 184 | #define LJ_ARCH_NAME "x64" |
155 | #define LJ_ARCH_BITS 64 | 185 | #define LJ_ARCH_BITS 64 |
156 | #define LJ_ARCH_ENDIAN LUAJIT_LE | 186 | #define LJ_ARCH_ENDIAN LUAJIT_LE |
157 | #if LJ_TARGET_WINDOWS || LJ_TARGET_CYGWIN | ||
158 | #define LJ_ABI_WIN 1 | ||
159 | #else | ||
160 | #define LJ_ABI_WIN 0 | ||
161 | #endif | ||
162 | #define LJ_TARGET_X64 1 | 187 | #define LJ_TARGET_X64 1 |
163 | #define LJ_TARGET_X86ORX64 1 | 188 | #define LJ_TARGET_X86ORX64 1 |
164 | #define LJ_TARGET_EHRETREG 0 | 189 | #define LJ_TARGET_EHRETREG 0 |
190 | #define LJ_TARGET_EHRAREG 16 | ||
165 | #define LJ_TARGET_JUMPRANGE 31 /* +-2^31 = +-2GB */ | 191 | #define LJ_TARGET_JUMPRANGE 31 /* +-2^31 = +-2GB */ |
166 | #define LJ_TARGET_MASKSHIFT 1 | 192 | #define LJ_TARGET_MASKSHIFT 1 |
167 | #define LJ_TARGET_MASKROT 1 | 193 | #define LJ_TARGET_MASKROT 1 |
168 | #define LJ_TARGET_UNALIGNED 1 | 194 | #define LJ_TARGET_UNALIGNED 1 |
169 | #define LJ_ARCH_NUMMODE LJ_NUMMODE_SINGLE_DUAL | 195 | #define LJ_ARCH_NUMMODE LJ_NUMMODE_SINGLE_DUAL |
196 | #ifndef LUAJIT_DISABLE_GC64 | ||
197 | #define LJ_TARGET_GC64 1 | ||
198 | #elif LJ_TARGET_OSX | ||
199 | #error "macOS requires GC64 -- don't disable it" | ||
200 | #endif | ||
170 | 201 | ||
171 | #elif LUAJIT_TARGET == LUAJIT_ARCH_ARM | 202 | #elif LUAJIT_TARGET == LUAJIT_ARCH_ARM |
172 | 203 | ||
@@ -182,40 +213,105 @@ | |||
182 | #define LJ_ABI_EABI 1 | 213 | #define LJ_ABI_EABI 1 |
183 | #define LJ_TARGET_ARM 1 | 214 | #define LJ_TARGET_ARM 1 |
184 | #define LJ_TARGET_EHRETREG 0 | 215 | #define LJ_TARGET_EHRETREG 0 |
216 | #define LJ_TARGET_EHRAREG 14 | ||
185 | #define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */ | 217 | #define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */ |
186 | #define LJ_TARGET_MASKSHIFT 0 | 218 | #define LJ_TARGET_MASKSHIFT 0 |
187 | #define LJ_TARGET_MASKROT 1 | 219 | #define LJ_TARGET_MASKROT 1 |
188 | #define LJ_TARGET_UNIFYROT 2 /* Want only IR_BROR. */ | 220 | #define LJ_TARGET_UNIFYROT 2 /* Want only IR_BROR. */ |
189 | #define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL | 221 | #define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL |
190 | 222 | ||
191 | #if __ARM_ARCH____ARM_ARCH_8__ || __ARM_ARCH_8A__ | 223 | #if __ARM_ARCH == 8 || __ARM_ARCH_8__ || __ARM_ARCH_8A__ |
192 | #define LJ_ARCH_VERSION 80 | 224 | #define LJ_ARCH_VERSION 80 |
193 | #elif __ARM_ARCH_7__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH_7S__ || __ARM_ARCH_7VE__ | 225 | #elif __ARM_ARCH == 7 || __ARM_ARCH_7__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH_7S__ || __ARM_ARCH_7VE__ |
194 | #define LJ_ARCH_VERSION 70 | 226 | #define LJ_ARCH_VERSION 70 |
195 | #elif __ARM_ARCH_6T2__ | 227 | #elif __ARM_ARCH_6T2__ |
196 | #define LJ_ARCH_VERSION 61 | 228 | #define LJ_ARCH_VERSION 61 |
197 | #elif __ARM_ARCH_6__ || __ARM_ARCH_6J__ || __ARM_ARCH_6K__ || __ARM_ARCH_6Z__ || __ARM_ARCH_6ZK__ | 229 | #elif __ARM_ARCH == 6 || __ARM_ARCH_6__ || __ARM_ARCH_6J__ || __ARM_ARCH_6K__ || __ARM_ARCH_6Z__ || __ARM_ARCH_6ZK__ |
198 | #define LJ_ARCH_VERSION 60 | 230 | #define LJ_ARCH_VERSION 60 |
199 | #else | 231 | #else |
200 | #define LJ_ARCH_VERSION 50 | 232 | #define LJ_ARCH_VERSION 50 |
201 | #endif | 233 | #endif |
202 | 234 | ||
235 | #elif LUAJIT_TARGET == LUAJIT_ARCH_ARM64 | ||
236 | |||
237 | #define LJ_ARCH_BITS 64 | ||
238 | #if defined(__AARCH64EB__) | ||
239 | #define LJ_ARCH_NAME "arm64be" | ||
240 | #define LJ_ARCH_ENDIAN LUAJIT_BE | ||
241 | #else | ||
242 | #define LJ_ARCH_NAME "arm64" | ||
243 | #define LJ_ARCH_ENDIAN LUAJIT_LE | ||
244 | #endif | ||
245 | #define LJ_TARGET_ARM64 1 | ||
246 | #define LJ_TARGET_EHRETREG 0 | ||
247 | #define LJ_TARGET_EHRAREG 30 | ||
248 | #define LJ_TARGET_JUMPRANGE 27 /* +-2^27 = +-128MB */ | ||
249 | #define LJ_TARGET_MASKSHIFT 1 | ||
250 | #define LJ_TARGET_MASKROT 1 | ||
251 | #define LJ_TARGET_UNIFYROT 2 /* Want only IR_BROR. */ | ||
252 | #define LJ_TARGET_GC64 1 | ||
253 | #define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL | ||
254 | |||
255 | #define LJ_ARCH_VERSION 80 | ||
256 | |||
203 | #elif LUAJIT_TARGET == LUAJIT_ARCH_PPC | 257 | #elif LUAJIT_TARGET == LUAJIT_ARCH_PPC |
204 | 258 | ||
205 | #define LJ_ARCH_NAME "ppc" | 259 | #ifndef LJ_ARCH_ENDIAN |
260 | #if __BYTE_ORDER__ != __ORDER_BIG_ENDIAN__ | ||
261 | #define LJ_ARCH_ENDIAN LUAJIT_LE | ||
262 | #else | ||
263 | #define LJ_ARCH_ENDIAN LUAJIT_BE | ||
264 | #endif | ||
265 | #endif | ||
266 | |||
206 | #if _LP64 | 267 | #if _LP64 |
207 | #define LJ_ARCH_BITS 64 | 268 | #define LJ_ARCH_BITS 64 |
269 | #if LJ_ARCH_ENDIAN == LUAJIT_LE | ||
270 | #define LJ_ARCH_NAME "ppc64le" | ||
271 | #else | ||
272 | #define LJ_ARCH_NAME "ppc64" | ||
273 | #endif | ||
208 | #else | 274 | #else |
209 | #define LJ_ARCH_BITS 32 | 275 | #define LJ_ARCH_BITS 32 |
276 | #define LJ_ARCH_NAME "ppc" | ||
277 | |||
278 | #if !defined(LJ_ARCH_HASFPU) | ||
279 | #if defined(_SOFT_FLOAT) || defined(_SOFT_DOUBLE) | ||
280 | #define LJ_ARCH_HASFPU 0 | ||
281 | #else | ||
282 | #define LJ_ARCH_HASFPU 1 | ||
210 | #endif | 283 | #endif |
211 | #define LJ_ARCH_ENDIAN LUAJIT_BE | 284 | #endif |
285 | |||
286 | #if !defined(LJ_ABI_SOFTFP) | ||
287 | #if defined(_SOFT_FLOAT) || defined(_SOFT_DOUBLE) | ||
288 | #define LJ_ABI_SOFTFP 1 | ||
289 | #else | ||
290 | #define LJ_ABI_SOFTFP 0 | ||
291 | #endif | ||
292 | #endif | ||
293 | #endif | ||
294 | |||
295 | #if LJ_ABI_SOFTFP | ||
296 | #define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL | ||
297 | #else | ||
298 | #define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL_SINGLE | ||
299 | #endif | ||
300 | |||
212 | #define LJ_TARGET_PPC 1 | 301 | #define LJ_TARGET_PPC 1 |
213 | #define LJ_TARGET_EHRETREG 3 | 302 | #define LJ_TARGET_EHRETREG 3 |
303 | #define LJ_TARGET_EHRAREG 65 | ||
214 | #define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */ | 304 | #define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */ |
215 | #define LJ_TARGET_MASKSHIFT 0 | 305 | #define LJ_TARGET_MASKSHIFT 0 |
216 | #define LJ_TARGET_MASKROT 1 | 306 | #define LJ_TARGET_MASKROT 1 |
217 | #define LJ_TARGET_UNIFYROT 1 /* Want only IR_BROL. */ | 307 | #define LJ_TARGET_UNIFYROT 1 /* Want only IR_BROL. */ |
218 | #define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL_SINGLE | 308 | |
309 | #if LJ_TARGET_CONSOLE | ||
310 | #define LJ_ARCH_PPC32ON64 1 | ||
311 | #define LJ_ARCH_NOFFI 1 | ||
312 | #elif LJ_ARCH_BITS == 64 | ||
313 | #error "No support for PPC64" | ||
314 | #endif | ||
219 | 315 | ||
220 | #if _ARCH_PWR7 | 316 | #if _ARCH_PWR7 |
221 | #define LJ_ARCH_VERSION 70 | 317 | #define LJ_ARCH_VERSION 70 |
@@ -230,10 +326,6 @@ | |||
230 | #else | 326 | #else |
231 | #define LJ_ARCH_VERSION 0 | 327 | #define LJ_ARCH_VERSION 0 |
232 | #endif | 328 | #endif |
233 | #if __PPC64__ || __powerpc64__ || LJ_TARGET_CONSOLE | ||
234 | #define LJ_ARCH_PPC64 1 | ||
235 | #define LJ_ARCH_NOFFI 1 | ||
236 | #endif | ||
237 | #if _ARCH_PPCSQ | 329 | #if _ARCH_PPCSQ |
238 | #define LJ_ARCH_SQRT 1 | 330 | #define LJ_ARCH_SQRT 1 |
239 | #endif | 331 | #endif |
@@ -247,44 +339,80 @@ | |||
247 | #define LJ_ARCH_XENON 1 | 339 | #define LJ_ARCH_XENON 1 |
248 | #endif | 340 | #endif |
249 | 341 | ||
250 | #elif LUAJIT_TARGET == LUAJIT_ARCH_PPCSPE | 342 | #elif LUAJIT_TARGET == LUAJIT_ARCH_MIPS32 || LUAJIT_TARGET == LUAJIT_ARCH_MIPS64 |
251 | |||
252 | #define LJ_ARCH_NAME "ppcspe" | ||
253 | #define LJ_ARCH_BITS 32 | ||
254 | #define LJ_ARCH_ENDIAN LUAJIT_BE | ||
255 | #ifndef LJ_ABI_SOFTFP | ||
256 | #define LJ_ABI_SOFTFP 1 | ||
257 | #endif | ||
258 | #define LJ_ABI_EABI 1 | ||
259 | #define LJ_TARGET_PPCSPE 1 | ||
260 | #define LJ_TARGET_EHRETREG 3 | ||
261 | #define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */ | ||
262 | #define LJ_TARGET_MASKSHIFT 0 | ||
263 | #define LJ_TARGET_MASKROT 1 | ||
264 | #define LJ_TARGET_UNIFYROT 1 /* Want only IR_BROL. */ | ||
265 | #define LJ_ARCH_NUMMODE LJ_NUMMODE_SINGLE | ||
266 | #define LJ_ARCH_NOFFI 1 /* NYI: comparisons, calls. */ | ||
267 | #define LJ_ARCH_NOJIT 1 | ||
268 | |||
269 | #elif LUAJIT_TARGET == LUAJIT_ARCH_MIPS | ||
270 | 343 | ||
271 | #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) | 344 | #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) |
345 | #if __mips_isa_rev >= 6 | ||
346 | #define LJ_TARGET_MIPSR6 1 | ||
347 | #define LJ_TARGET_UNALIGNED 1 | ||
348 | #endif | ||
349 | #if LUAJIT_TARGET == LUAJIT_ARCH_MIPS32 | ||
350 | #if LJ_TARGET_MIPSR6 | ||
351 | #define LJ_ARCH_NAME "mips32r6el" | ||
352 | #else | ||
272 | #define LJ_ARCH_NAME "mipsel" | 353 | #define LJ_ARCH_NAME "mipsel" |
354 | #endif | ||
355 | #else | ||
356 | #if LJ_TARGET_MIPSR6 | ||
357 | #define LJ_ARCH_NAME "mips64r6el" | ||
358 | #else | ||
359 | #define LJ_ARCH_NAME "mips64el" | ||
360 | #endif | ||
361 | #endif | ||
273 | #define LJ_ARCH_ENDIAN LUAJIT_LE | 362 | #define LJ_ARCH_ENDIAN LUAJIT_LE |
274 | #else | 363 | #else |
364 | #if LUAJIT_TARGET == LUAJIT_ARCH_MIPS32 | ||
365 | #if LJ_TARGET_MIPSR6 | ||
366 | #define LJ_ARCH_NAME "mips32r6" | ||
367 | #else | ||
275 | #define LJ_ARCH_NAME "mips" | 368 | #define LJ_ARCH_NAME "mips" |
369 | #endif | ||
370 | #else | ||
371 | #if LJ_TARGET_MIPSR6 | ||
372 | #define LJ_ARCH_NAME "mips64r6" | ||
373 | #else | ||
374 | #define LJ_ARCH_NAME "mips64" | ||
375 | #endif | ||
376 | #endif | ||
276 | #define LJ_ARCH_ENDIAN LUAJIT_BE | 377 | #define LJ_ARCH_ENDIAN LUAJIT_BE |
277 | #endif | 378 | #endif |
379 | |||
380 | #if !defined(LJ_ARCH_HASFPU) | ||
381 | #ifdef __mips_soft_float | ||
382 | #define LJ_ARCH_HASFPU 0 | ||
383 | #else | ||
384 | #define LJ_ARCH_HASFPU 1 | ||
385 | #endif | ||
386 | #endif | ||
387 | |||
388 | #if !defined(LJ_ABI_SOFTFP) | ||
389 | #ifdef __mips_soft_float | ||
390 | #define LJ_ABI_SOFTFP 1 | ||
391 | #else | ||
392 | #define LJ_ABI_SOFTFP 0 | ||
393 | #endif | ||
394 | #endif | ||
395 | |||
396 | #if LUAJIT_TARGET == LUAJIT_ARCH_MIPS32 | ||
278 | #define LJ_ARCH_BITS 32 | 397 | #define LJ_ARCH_BITS 32 |
398 | #define LJ_TARGET_MIPS32 1 | ||
399 | #else | ||
400 | #define LJ_ARCH_BITS 64 | ||
401 | #define LJ_TARGET_MIPS64 1 | ||
402 | #define LJ_TARGET_GC64 1 | ||
403 | #endif | ||
279 | #define LJ_TARGET_MIPS 1 | 404 | #define LJ_TARGET_MIPS 1 |
280 | #define LJ_TARGET_EHRETREG 4 | 405 | #define LJ_TARGET_EHRETREG 4 |
406 | #define LJ_TARGET_EHRAREG 31 | ||
281 | #define LJ_TARGET_JUMPRANGE 27 /* 2*2^27 = 256MB-aligned region */ | 407 | #define LJ_TARGET_JUMPRANGE 27 /* 2*2^27 = 256MB-aligned region */ |
282 | #define LJ_TARGET_MASKSHIFT 1 | 408 | #define LJ_TARGET_MASKSHIFT 1 |
283 | #define LJ_TARGET_MASKROT 1 | 409 | #define LJ_TARGET_MASKROT 1 |
284 | #define LJ_TARGET_UNIFYROT 2 /* Want only IR_BROR. */ | 410 | #define LJ_TARGET_UNIFYROT 2 /* Want only IR_BROR. */ |
285 | #define LJ_ARCH_NUMMODE LJ_NUMMODE_SINGLE | 411 | #define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL |
286 | 412 | ||
287 | #if _MIPS_ARCH_MIPS32R2 | 413 | #if LJ_TARGET_MIPSR6 |
414 | #define LJ_ARCH_VERSION 60 | ||
415 | #elif _MIPS_ARCH_MIPS32R2 || _MIPS_ARCH_MIPS64R2 | ||
288 | #define LJ_ARCH_VERSION 20 | 416 | #define LJ_ARCH_VERSION 20 |
289 | #else | 417 | #else |
290 | #define LJ_ARCH_VERSION 10 | 418 | #define LJ_ARCH_VERSION 10 |
@@ -294,9 +422,7 @@ | |||
294 | #error "No target architecture defined" | 422 | #error "No target architecture defined" |
295 | #endif | 423 | #endif |
296 | 424 | ||
297 | #ifndef LJ_PAGESIZE | 425 | /* -- Checks for requirements --------------------------------------------- */ |
298 | #define LJ_PAGESIZE 4096 | ||
299 | #endif | ||
300 | 426 | ||
301 | /* Check for minimum required compiler versions. */ | 427 | /* Check for minimum required compiler versions. */ |
302 | #if defined(__GNUC__) | 428 | #if defined(__GNUC__) |
@@ -312,6 +438,16 @@ | |||
312 | #if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 2) | 438 | #if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 2) |
313 | #error "Need at least GCC 4.2 or newer" | 439 | #error "Need at least GCC 4.2 or newer" |
314 | #endif | 440 | #endif |
441 | #elif LJ_TARGET_ARM64 | ||
442 | #if __clang__ | ||
443 | #if ((__clang_major__ < 3) || ((__clang_major__ == 3) && __clang_minor__ < 5)) && !defined(__NX_TOOLCHAIN_MAJOR__) | ||
444 | #error "Need at least Clang 3.5 or newer" | ||
445 | #endif | ||
446 | #else | ||
447 | #if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 8) | ||
448 | #error "Need at least GCC 4.8 or newer" | ||
449 | #endif | ||
450 | #endif | ||
315 | #elif !LJ_TARGET_PS3 | 451 | #elif !LJ_TARGET_PS3 |
316 | #if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 3) | 452 | #if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 3) |
317 | #error "Need at least GCC 4.3 or newer" | 453 | #error "Need at least GCC 4.3 or newer" |
@@ -335,26 +471,35 @@ | |||
335 | #if !(__ARM_EABI__ || LJ_TARGET_IOS) | 471 | #if !(__ARM_EABI__ || LJ_TARGET_IOS) |
336 | #error "Only ARM EABI or iOS 3.0+ ABI is supported" | 472 | #error "Only ARM EABI or iOS 3.0+ ABI is supported" |
337 | #endif | 473 | #endif |
338 | #elif LJ_TARGET_PPC || LJ_TARGET_PPCSPE | 474 | #elif LJ_TARGET_ARM64 |
339 | #if defined(_SOFT_FLOAT) || defined(_SOFT_DOUBLE) | 475 | #if defined(_ILP32) |
340 | #error "No support for PowerPC CPUs without double-precision FPU" | 476 | #error "No support for ILP32 model on ARM64" |
341 | #endif | 477 | #endif |
478 | #elif LJ_TARGET_PPC | ||
342 | #if defined(_LITTLE_ENDIAN) && (!defined(_BYTE_ORDER) || (_BYTE_ORDER == _LITTLE_ENDIAN)) | 479 | #if defined(_LITTLE_ENDIAN) && (!defined(_BYTE_ORDER) || (_BYTE_ORDER == _LITTLE_ENDIAN)) |
343 | #error "No support for little-endian PowerPC" | 480 | #error "No support for little-endian PPC32" |
481 | #endif | ||
482 | #if defined(__NO_FPRS__) && !defined(_SOFT_FLOAT) | ||
483 | #error "No support for PPC/e500 anymore (use LuaJIT 2.0)" | ||
344 | #endif | 484 | #endif |
345 | #if defined(_LP64) | 485 | #elif LJ_TARGET_MIPS32 |
346 | #error "No support for PowerPC 64 bit mode" | 486 | #if !((defined(_MIPS_SIM_ABI32) && _MIPS_SIM == _MIPS_SIM_ABI32) || (defined(_ABIO32) && _MIPS_SIM == _ABIO32)) |
487 | #error "Only o32 ABI supported for MIPS32" | ||
347 | #endif | 488 | #endif |
348 | #elif LJ_TARGET_MIPS | 489 | #if LJ_TARGET_MIPSR6 |
349 | #if defined(__mips_soft_float) | 490 | /* Not that useful, since most available r6 CPUs are 64 bit. */ |
350 | #error "No support for MIPS CPUs without FPU" | 491 | #error "No support for MIPS32R6" |
351 | #endif | 492 | #endif |
352 | #if defined(_LP64) | 493 | #elif LJ_TARGET_MIPS64 |
353 | #error "No support for MIPS64" | 494 | #if !((defined(_MIPS_SIM_ABI64) && _MIPS_SIM == _MIPS_SIM_ABI64) || (defined(_ABI64) && _MIPS_SIM == _ABI64)) |
495 | /* MIPS32ON64 aka n32 ABI support might be desirable, but difficult. */ | ||
496 | #error "Only n64 ABI supported for MIPS64" | ||
354 | #endif | 497 | #endif |
355 | #endif | 498 | #endif |
356 | #endif | 499 | #endif |
357 | 500 | ||
501 | /* -- Derived defines ----------------------------------------------------- */ | ||
502 | |||
358 | /* Enable or disable the dual-number mode for the VM. */ | 503 | /* Enable or disable the dual-number mode for the VM. */ |
359 | #if (LJ_ARCH_NUMMODE == LJ_NUMMODE_SINGLE && LUAJIT_NUMMODE == 2) || \ | 504 | #if (LJ_ARCH_NUMMODE == LJ_NUMMODE_SINGLE && LUAJIT_NUMMODE == 2) || \ |
360 | (LJ_ARCH_NUMMODE == LJ_NUMMODE_DUAL && LUAJIT_NUMMODE == 1) | 505 | (LJ_ARCH_NUMMODE == LJ_NUMMODE_DUAL && LUAJIT_NUMMODE == 1) |
@@ -376,6 +521,20 @@ | |||
376 | #endif | 521 | #endif |
377 | #endif | 522 | #endif |
378 | 523 | ||
524 | /* 64 bit GC references. */ | ||
525 | #if LJ_TARGET_GC64 | ||
526 | #define LJ_GC64 1 | ||
527 | #else | ||
528 | #define LJ_GC64 0 | ||
529 | #endif | ||
530 | |||
531 | /* 2-slot frame info. */ | ||
532 | #if LJ_GC64 | ||
533 | #define LJ_FR2 1 | ||
534 | #else | ||
535 | #define LJ_FR2 0 | ||
536 | #endif | ||
537 | |||
379 | /* Disable or enable the JIT compiler. */ | 538 | /* Disable or enable the JIT compiler. */ |
380 | #if defined(LUAJIT_DISABLE_JIT) || defined(LJ_ARCH_NOJIT) || defined(LJ_OS_NOJIT) | 539 | #if defined(LUAJIT_DISABLE_JIT) || defined(LJ_ARCH_NOJIT) || defined(LJ_OS_NOJIT) |
381 | #define LJ_HASJIT 0 | 540 | #define LJ_HASJIT 0 |
@@ -390,6 +549,28 @@ | |||
390 | #define LJ_HASFFI 1 | 549 | #define LJ_HASFFI 1 |
391 | #endif | 550 | #endif |
392 | 551 | ||
552 | /* Disable or enable the string buffer extension. */ | ||
553 | #if defined(LUAJIT_DISABLE_BUFFER) | ||
554 | #define LJ_HASBUFFER 0 | ||
555 | #else | ||
556 | #define LJ_HASBUFFER 1 | ||
557 | #endif | ||
558 | |||
559 | #if defined(LUAJIT_DISABLE_PROFILE) | ||
560 | #define LJ_HASPROFILE 0 | ||
561 | #elif LJ_TARGET_POSIX | ||
562 | #define LJ_HASPROFILE 1 | ||
563 | #define LJ_PROFILE_SIGPROF 1 | ||
564 | #elif LJ_TARGET_PS3 | ||
565 | #define LJ_HASPROFILE 1 | ||
566 | #define LJ_PROFILE_PTHREAD 1 | ||
567 | #elif LJ_TARGET_WINDOWS || LJ_TARGET_XBOX360 | ||
568 | #define LJ_HASPROFILE 1 | ||
569 | #define LJ_PROFILE_WTHREAD 1 | ||
570 | #else | ||
571 | #define LJ_HASPROFILE 0 | ||
572 | #endif | ||
573 | |||
393 | #ifndef LJ_ARCH_HASFPU | 574 | #ifndef LJ_ARCH_HASFPU |
394 | #define LJ_ARCH_HASFPU 1 | 575 | #define LJ_ARCH_HASFPU 1 |
395 | #endif | 576 | #endif |
@@ -397,6 +578,7 @@ | |||
397 | #define LJ_ABI_SOFTFP 0 | 578 | #define LJ_ABI_SOFTFP 0 |
398 | #endif | 579 | #endif |
399 | #define LJ_SOFTFP (!LJ_ARCH_HASFPU) | 580 | #define LJ_SOFTFP (!LJ_ARCH_HASFPU) |
581 | #define LJ_SOFTFP32 (LJ_SOFTFP && LJ_32) | ||
400 | 582 | ||
401 | #if LJ_ARCH_ENDIAN == LUAJIT_BE | 583 | #if LJ_ARCH_ENDIAN == LUAJIT_BE |
402 | #define LJ_LE 0 | 584 | #define LJ_LE 0 |
@@ -422,26 +604,52 @@ | |||
422 | #define LJ_TARGET_UNALIGNED 0 | 604 | #define LJ_TARGET_UNALIGNED 0 |
423 | #endif | 605 | #endif |
424 | 606 | ||
425 | /* Various workarounds for embedded operating systems. */ | 607 | #ifndef LJ_PAGESIZE |
426 | #if (defined(__ANDROID__) && !defined(LJ_TARGET_X86ORX64)) || defined(__symbian__) || LJ_TARGET_XBOX360 | 608 | #define LJ_PAGESIZE 4096 |
427 | #define LUAJIT_NO_LOG2 | ||
428 | #endif | 609 | #endif |
429 | #if defined(__symbian__) | 610 | |
430 | #define LUAJIT_NO_EXP2 | 611 | /* Various workarounds for embedded operating systems or weak C runtimes. */ |
612 | #if defined(__ANDROID__) || defined(__symbian__) || LJ_TARGET_XBOX360 || LJ_TARGET_WINDOWS | ||
613 | #define LUAJIT_NO_LOG2 | ||
431 | #endif | 614 | #endif |
432 | #if LJ_TARGET_CONSOLE || (LJ_TARGET_IOS && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0) | 615 | #if LJ_TARGET_CONSOLE || (LJ_TARGET_IOS && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0) |
433 | #define LJ_NO_SYSTEM 1 | 616 | #define LJ_NO_SYSTEM 1 |
434 | #endif | 617 | #endif |
435 | 618 | ||
436 | #if !defined(LUAJIT_NO_UNWIND) && __GNU_COMPACT_EH__ | 619 | #if LJ_TARGET_WINDOWS || LJ_TARGET_CYGWIN |
437 | /* NYI: no support for compact unwind specification, yet. */ | 620 | #define LJ_ABI_WIN 1 |
438 | #define LUAJIT_NO_UNWIND 1 | 621 | #else |
622 | #define LJ_ABI_WIN 0 | ||
439 | #endif | 623 | #endif |
440 | 624 | ||
441 | #if defined(LUAJIT_NO_UNWIND) || defined(__symbian__) || LJ_TARGET_IOS || LJ_TARGET_PS3 || LJ_TARGET_PS4 | 625 | #if LJ_TARGET_WINDOWS |
626 | #if LJ_TARGET_UWP | ||
627 | #define LJ_WIN_VALLOC VirtualAllocFromApp | ||
628 | #define LJ_WIN_VPROTECT VirtualProtectFromApp | ||
629 | extern void *LJ_WIN_LOADLIBA(const char *path); | ||
630 | #else | ||
631 | #define LJ_WIN_VALLOC VirtualAlloc | ||
632 | #define LJ_WIN_VPROTECT VirtualProtect | ||
633 | #define LJ_WIN_LOADLIBA(path) LoadLibraryExA((path), NULL, 0) | ||
634 | #endif | ||
635 | #endif | ||
636 | |||
637 | #if defined(LUAJIT_NO_UNWIND) || __GNU_COMPACT_EH__ || defined(__symbian__) || LJ_TARGET_IOS || LJ_TARGET_PS3 || LJ_TARGET_PS4 | ||
442 | #define LJ_NO_UNWIND 1 | 638 | #define LJ_NO_UNWIND 1 |
443 | #endif | 639 | #endif |
444 | 640 | ||
641 | #if !LJ_NO_UNWIND && !defined(LUAJIT_UNWIND_INTERNAL) && (LJ_ABI_WIN || (defined(LUAJIT_UNWIND_EXTERNAL) && (defined(__GNUC__) || defined(__clang__)))) | ||
642 | #define LJ_UNWIND_EXT 1 | ||
643 | #else | ||
644 | #define LJ_UNWIND_EXT 0 | ||
645 | #endif | ||
646 | |||
647 | #if LJ_UNWIND_EXT && LJ_HASJIT && !LJ_TARGET_ARM && !(LJ_ABI_WIN && LJ_TARGET_X86) | ||
648 | #define LJ_UNWIND_JIT 1 | ||
649 | #else | ||
650 | #define LJ_UNWIND_JIT 0 | ||
651 | #endif | ||
652 | |||
445 | /* Compatibility with Lua 5.1 vs. 5.2. */ | 653 | /* Compatibility with Lua 5.1 vs. 5.2. */ |
446 | #ifdef LUAJIT_ENABLE_LUA52COMPAT | 654 | #ifdef LUAJIT_ENABLE_LUA52COMPAT |
447 | #define LJ_52 1 | 655 | #define LJ_52 1 |
@@ -449,4 +657,46 @@ | |||
449 | #define LJ_52 0 | 657 | #define LJ_52 0 |
450 | #endif | 658 | #endif |
451 | 659 | ||
660 | /* -- VM security --------------------------------------------------------- */ | ||
661 | |||
662 | /* Don't make any changes here. Instead build with: | ||
663 | ** make "XCFLAGS=-DLUAJIT_SECURITY_flag=value" | ||
664 | ** | ||
665 | ** Important note to distro maintainers: DO NOT change the defaults for a | ||
666 | ** regular distro build -- neither upwards, nor downwards! | ||
667 | ** These build-time configurable security flags are intended for embedders | ||
668 | ** who may have specific needs wrt. security vs. performance. | ||
669 | */ | ||
670 | |||
671 | /* Security defaults. */ | ||
672 | #ifndef LUAJIT_SECURITY_PRNG | ||
673 | /* PRNG init: 0 = fixed/insecure, 1 = secure from OS. */ | ||
674 | #define LUAJIT_SECURITY_PRNG 1 | ||
675 | #endif | ||
676 | |||
677 | #ifndef LUAJIT_SECURITY_STRHASH | ||
678 | /* String hash: 0 = sparse only, 1 = sparse + dense. */ | ||
679 | #define LUAJIT_SECURITY_STRHASH 1 | ||
680 | #endif | ||
681 | |||
682 | #ifndef LUAJIT_SECURITY_STRID | ||
683 | /* String IDs: 0 = linear, 1 = reseed < 255, 2 = reseed < 15, 3 = random. */ | ||
684 | #define LUAJIT_SECURITY_STRID 1 | ||
685 | #endif | ||
686 | |||
687 | #ifndef LUAJIT_SECURITY_MCODE | ||
688 | /* Machine code page protection: 0 = insecure RWX, 1 = secure RW^X. */ | ||
689 | #define LUAJIT_SECURITY_MCODE 1 | ||
690 | #endif | ||
691 | |||
692 | #define LJ_SECURITY_MODE \ | ||
693 | ( 0u \ | ||
694 | | ((LUAJIT_SECURITY_PRNG & 3) << 0) \ | ||
695 | | ((LUAJIT_SECURITY_STRHASH & 3) << 2) \ | ||
696 | | ((LUAJIT_SECURITY_STRID & 3) << 4) \ | ||
697 | | ((LUAJIT_SECURITY_MCODE & 3) << 6) \ | ||
698 | ) | ||
699 | #define LJ_SECURITY_MODESTRING \ | ||
700 | "\004prng\007strhash\005strid\005mcode" | ||
701 | |||
452 | #endif | 702 | #endif |