aboutsummaryrefslogtreecommitdiff
path: root/src/lj_arch.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_arch.h')
-rw-r--r--src/lj_arch.h408
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
629extern 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