summaryrefslogtreecommitdiff
path: root/src/lj_arch.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_arch.h')
-rw-r--r--src/lj_arch.h440
1 files changed, 360 insertions, 80 deletions
diff --git a/src/lj_arch.h b/src/lj_arch.h
index da53b162..6e22b1b2 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,16 +79,23 @@
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__) && !defined(__PROSPERO__)
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
77#define LUAJIT_OS LUAJIT_OS_POSIX 95#define LUAJIT_OS LUAJIT_OS_POSIX
96#elif defined(__QNX__)
97#define LJ_TARGET_QNX 1
98#define LUAJIT_OS LUAJIT_OS_POSIX
78#else 99#else
79#define LUAJIT_OS LUAJIT_OS_OTHER 100#define LUAJIT_OS LUAJIT_OS_OTHER
80#endif 101#endif
@@ -99,10 +120,16 @@
99#define LJ_TARGET_WINDOWS (LUAJIT_OS == LUAJIT_OS_WINDOWS) 120#define LJ_TARGET_WINDOWS (LUAJIT_OS == LUAJIT_OS_WINDOWS)
100#define LJ_TARGET_LINUX (LUAJIT_OS == LUAJIT_OS_LINUX) 121#define LJ_TARGET_LINUX (LUAJIT_OS == LUAJIT_OS_LINUX)
101#define LJ_TARGET_OSX (LUAJIT_OS == LUAJIT_OS_OSX) 122#define LJ_TARGET_OSX (LUAJIT_OS == LUAJIT_OS_OSX)
102#define LJ_TARGET_IOS (LJ_TARGET_OSX && LUAJIT_TARGET == LUAJIT_ARCH_ARM) 123#define LJ_TARGET_BSD (LUAJIT_OS == LUAJIT_OS_BSD)
103#define LJ_TARGET_POSIX (LUAJIT_OS > LUAJIT_OS_WINDOWS) 124#define LJ_TARGET_POSIX (LUAJIT_OS > LUAJIT_OS_WINDOWS)
104#define LJ_TARGET_DLOPEN LJ_TARGET_POSIX 125#define LJ_TARGET_DLOPEN LJ_TARGET_POSIX
105 126
127#if TARGET_OS_IPHONE
128#define LJ_TARGET_IOS 1
129#else
130#define LJ_TARGET_IOS 0
131#endif
132
106#ifdef __CELLOS_LV2__ 133#ifdef __CELLOS_LV2__
107#define LJ_TARGET_PS3 1 134#define LJ_TARGET_PS3 1
108#define LJ_TARGET_CONSOLE 1 135#define LJ_TARGET_CONSOLE 1
@@ -115,6 +142,13 @@
115#define NULL ((void*)0) 142#define NULL ((void*)0)
116#endif 143#endif
117 144
145#ifdef __PROSPERO__
146#define LJ_TARGET_PS5 1
147#define LJ_TARGET_CONSOLE 1
148#undef NULL
149#define NULL ((void*)0)
150#endif
151
118#ifdef __psp2__ 152#ifdef __psp2__
119#define LJ_TARGET_PSVITA 1 153#define LJ_TARGET_PSVITA 1
120#define LJ_TARGET_CONSOLE 1 154#define LJ_TARGET_CONSOLE 1
@@ -125,10 +159,27 @@
125#define LJ_TARGET_CONSOLE 1 159#define LJ_TARGET_CONSOLE 1
126#endif 160#endif
127 161
128#define LJ_NUMMODE_SINGLE 0 /* Single-number mode only. */ 162#ifdef _DURANGO
129#define LJ_NUMMODE_SINGLE_DUAL 1 /* Default to single-number mode. */ 163#define LJ_TARGET_XBOXONE 1
130#define LJ_NUMMODE_DUAL 2 /* Dual-number mode only. */ 164#define LJ_TARGET_CONSOLE 1
131#define LJ_NUMMODE_DUAL_SINGLE 3 /* Default to dual-number mode. */ 165#define LJ_TARGET_GC64 1
166#endif
167
168#ifdef __NX__
169#define LJ_TARGET_NX 1
170#define LJ_TARGET_CONSOLE 1
171#undef NULL
172#define NULL ((void*)0)
173#endif
174
175#ifdef _UWP
176#define LJ_TARGET_UWP 1
177#if LUAJIT_TARGET == LUAJIT_ARCH_X64
178#define LJ_TARGET_GC64 1
179#endif
180#endif
181
182/* -- Arch-specific settings ---------------------------------------------- */
132 183
133/* Set target architecture properties. */ 184/* Set target architecture properties. */
134#if LUAJIT_TARGET == LUAJIT_ARCH_X86 185#if LUAJIT_TARGET == LUAJIT_ARCH_X86
@@ -136,14 +187,10 @@
136#define LJ_ARCH_NAME "x86" 187#define LJ_ARCH_NAME "x86"
137#define LJ_ARCH_BITS 32 188#define LJ_ARCH_BITS 32
138#define LJ_ARCH_ENDIAN LUAJIT_LE 189#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 190#define LJ_TARGET_X86 1
145#define LJ_TARGET_X86ORX64 1 191#define LJ_TARGET_X86ORX64 1
146#define LJ_TARGET_EHRETREG 0 192#define LJ_TARGET_EHRETREG 0
193#define LJ_TARGET_EHRAREG 8
147#define LJ_TARGET_MASKSHIFT 1 194#define LJ_TARGET_MASKSHIFT 1
148#define LJ_TARGET_MASKROT 1 195#define LJ_TARGET_MASKROT 1
149#define LJ_TARGET_UNALIGNED 1 196#define LJ_TARGET_UNALIGNED 1
@@ -154,19 +201,20 @@
154#define LJ_ARCH_NAME "x64" 201#define LJ_ARCH_NAME "x64"
155#define LJ_ARCH_BITS 64 202#define LJ_ARCH_BITS 64
156#define LJ_ARCH_ENDIAN LUAJIT_LE 203#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 204#define LJ_TARGET_X64 1
163#define LJ_TARGET_X86ORX64 1 205#define LJ_TARGET_X86ORX64 1
164#define LJ_TARGET_EHRETREG 0 206#define LJ_TARGET_EHRETREG 0
207#define LJ_TARGET_EHRAREG 16
165#define LJ_TARGET_JUMPRANGE 31 /* +-2^31 = +-2GB */ 208#define LJ_TARGET_JUMPRANGE 31 /* +-2^31 = +-2GB */
166#define LJ_TARGET_MASKSHIFT 1 209#define LJ_TARGET_MASKSHIFT 1
167#define LJ_TARGET_MASKROT 1 210#define LJ_TARGET_MASKROT 1
168#define LJ_TARGET_UNALIGNED 1 211#define LJ_TARGET_UNALIGNED 1
169#define LJ_ARCH_NUMMODE LJ_NUMMODE_SINGLE_DUAL 212#define LJ_ARCH_NUMMODE LJ_NUMMODE_SINGLE_DUAL
213#ifndef LUAJIT_DISABLE_GC64
214#define LJ_TARGET_GC64 1
215#elif LJ_TARGET_OSX
216#error "macOS requires GC64 -- don't disable it"
217#endif
170 218
171#elif LUAJIT_TARGET == LUAJIT_ARCH_ARM 219#elif LUAJIT_TARGET == LUAJIT_ARCH_ARM
172 220
@@ -182,40 +230,108 @@
182#define LJ_ABI_EABI 1 230#define LJ_ABI_EABI 1
183#define LJ_TARGET_ARM 1 231#define LJ_TARGET_ARM 1
184#define LJ_TARGET_EHRETREG 0 232#define LJ_TARGET_EHRETREG 0
233#define LJ_TARGET_EHRAREG 14
185#define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */ 234#define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */
186#define LJ_TARGET_MASKSHIFT 0 235#define LJ_TARGET_MASKSHIFT 0
187#define LJ_TARGET_MASKROT 1 236#define LJ_TARGET_MASKROT 1
188#define LJ_TARGET_UNIFYROT 2 /* Want only IR_BROR. */ 237#define LJ_TARGET_UNIFYROT 2 /* Want only IR_BROR. */
189#define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL 238#define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL
190 239
191#if __ARM_ARCH____ARM_ARCH_8__ || __ARM_ARCH_8A__ 240#if __ARM_ARCH == 8 || __ARM_ARCH_8__ || __ARM_ARCH_8A__
192#define LJ_ARCH_VERSION 80 241#define LJ_ARCH_VERSION 80
193#elif __ARM_ARCH_7__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH_7S__ || __ARM_ARCH_7VE__ 242#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 243#define LJ_ARCH_VERSION 70
195#elif __ARM_ARCH_6T2__ 244#elif __ARM_ARCH_6T2__
196#define LJ_ARCH_VERSION 61 245#define LJ_ARCH_VERSION 61
197#elif __ARM_ARCH_6__ || __ARM_ARCH_6J__ || __ARM_ARCH_6K__ || __ARM_ARCH_6Z__ || __ARM_ARCH_6ZK__ 246#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 247#define LJ_ARCH_VERSION 60
199#else 248#else
200#define LJ_ARCH_VERSION 50 249#define LJ_ARCH_VERSION 50
201#endif 250#endif
202 251
252#elif LUAJIT_TARGET == LUAJIT_ARCH_ARM64
253
254#define LJ_ARCH_BITS 64
255#if defined(__AARCH64EB__)
256#define LJ_ARCH_NAME "arm64be"
257#define LJ_ARCH_ENDIAN LUAJIT_BE
258#else
259#define LJ_ARCH_NAME "arm64"
260#define LJ_ARCH_ENDIAN LUAJIT_LE
261#endif
262#if !defined(LJ_ABI_PAUTH) && defined(__arm64e__)
263#define LJ_ABI_PAUTH 1
264#endif
265#define LJ_TARGET_ARM64 1
266#define LJ_TARGET_EHRETREG 0
267#define LJ_TARGET_EHRAREG 30
268#define LJ_TARGET_JUMPRANGE 27 /* +-2^27 = +-128MB */
269#define LJ_TARGET_MASKSHIFT 1
270#define LJ_TARGET_MASKROT 1
271#define LJ_TARGET_UNIFYROT 2 /* Want only IR_BROR. */
272#define LJ_TARGET_GC64 1
273#define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL
274
275#define LJ_ARCH_VERSION 80
276
203#elif LUAJIT_TARGET == LUAJIT_ARCH_PPC 277#elif LUAJIT_TARGET == LUAJIT_ARCH_PPC
204 278
205#define LJ_ARCH_NAME "ppc" 279#ifndef LJ_ARCH_ENDIAN
280#if __BYTE_ORDER__ != __ORDER_BIG_ENDIAN__
281#define LJ_ARCH_ENDIAN LUAJIT_LE
282#else
283#define LJ_ARCH_ENDIAN LUAJIT_BE
284#endif
285#endif
286
206#if _LP64 287#if _LP64
207#define LJ_ARCH_BITS 64 288#define LJ_ARCH_BITS 64
289#if LJ_ARCH_ENDIAN == LUAJIT_LE
290#define LJ_ARCH_NAME "ppc64le"
291#else
292#define LJ_ARCH_NAME "ppc64"
293#endif
208#else 294#else
209#define LJ_ARCH_BITS 32 295#define LJ_ARCH_BITS 32
296#define LJ_ARCH_NAME "ppc"
297
298#if !defined(LJ_ARCH_HASFPU)
299#if defined(_SOFT_FLOAT) || defined(_SOFT_DOUBLE)
300#define LJ_ARCH_HASFPU 0
301#else
302#define LJ_ARCH_HASFPU 1
210#endif 303#endif
211#define LJ_ARCH_ENDIAN LUAJIT_BE 304#endif
305
306#if !defined(LJ_ABI_SOFTFP)
307#if defined(_SOFT_FLOAT) || defined(_SOFT_DOUBLE)
308#define LJ_ABI_SOFTFP 1
309#else
310#define LJ_ABI_SOFTFP 0
311#endif
312#endif
313#endif
314
315#if LJ_ABI_SOFTFP
316#define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL
317#else
318#define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL_SINGLE
319#endif
320
212#define LJ_TARGET_PPC 1 321#define LJ_TARGET_PPC 1
213#define LJ_TARGET_EHRETREG 3 322#define LJ_TARGET_EHRETREG 3
323#define LJ_TARGET_EHRAREG 65
214#define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */ 324#define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */
215#define LJ_TARGET_MASKSHIFT 0 325#define LJ_TARGET_MASKSHIFT 0
216#define LJ_TARGET_MASKROT 1 326#define LJ_TARGET_MASKROT 1
217#define LJ_TARGET_UNIFYROT 1 /* Want only IR_BROL. */ 327#define LJ_TARGET_UNIFYROT 1 /* Want only IR_BROL. */
218#define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL_SINGLE 328
329#if LJ_TARGET_CONSOLE
330#define LJ_ARCH_PPC32ON64 1
331#define LJ_ARCH_NOFFI 1
332#elif LJ_ARCH_BITS == 64
333#error "No support for PPC64"
334#endif
219 335
220#if _ARCH_PWR7 336#if _ARCH_PWR7
221#define LJ_ARCH_VERSION 70 337#define LJ_ARCH_VERSION 70
@@ -230,10 +346,6 @@
230#else 346#else
231#define LJ_ARCH_VERSION 0 347#define LJ_ARCH_VERSION 0
232#endif 348#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 349#if _ARCH_PPCSQ
238#define LJ_ARCH_SQRT 1 350#define LJ_ARCH_SQRT 1
239#endif 351#endif
@@ -247,44 +359,80 @@
247#define LJ_ARCH_XENON 1 359#define LJ_ARCH_XENON 1
248#endif 360#endif
249 361
250#elif LUAJIT_TARGET == LUAJIT_ARCH_PPCSPE 362#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 363
271#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) 364#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL)
365#if __mips_isa_rev >= 6
366#define LJ_TARGET_MIPSR6 1
367#define LJ_TARGET_UNALIGNED 1
368#endif
369#if LUAJIT_TARGET == LUAJIT_ARCH_MIPS32
370#if LJ_TARGET_MIPSR6
371#define LJ_ARCH_NAME "mips32r6el"
372#else
272#define LJ_ARCH_NAME "mipsel" 373#define LJ_ARCH_NAME "mipsel"
374#endif
375#else
376#if LJ_TARGET_MIPSR6
377#define LJ_ARCH_NAME "mips64r6el"
378#else
379#define LJ_ARCH_NAME "mips64el"
380#endif
381#endif
273#define LJ_ARCH_ENDIAN LUAJIT_LE 382#define LJ_ARCH_ENDIAN LUAJIT_LE
274#else 383#else
384#if LUAJIT_TARGET == LUAJIT_ARCH_MIPS32
385#if LJ_TARGET_MIPSR6
386#define LJ_ARCH_NAME "mips32r6"
387#else
275#define LJ_ARCH_NAME "mips" 388#define LJ_ARCH_NAME "mips"
389#endif
390#else
391#if LJ_TARGET_MIPSR6
392#define LJ_ARCH_NAME "mips64r6"
393#else
394#define LJ_ARCH_NAME "mips64"
395#endif
396#endif
276#define LJ_ARCH_ENDIAN LUAJIT_BE 397#define LJ_ARCH_ENDIAN LUAJIT_BE
277#endif 398#endif
399
400#if !defined(LJ_ARCH_HASFPU)
401#ifdef __mips_soft_float
402#define LJ_ARCH_HASFPU 0
403#else
404#define LJ_ARCH_HASFPU 1
405#endif
406#endif
407
408#if !defined(LJ_ABI_SOFTFP)
409#ifdef __mips_soft_float
410#define LJ_ABI_SOFTFP 1
411#else
412#define LJ_ABI_SOFTFP 0
413#endif
414#endif
415
416#if LUAJIT_TARGET == LUAJIT_ARCH_MIPS32
278#define LJ_ARCH_BITS 32 417#define LJ_ARCH_BITS 32
418#define LJ_TARGET_MIPS32 1
419#else
420#define LJ_ARCH_BITS 64
421#define LJ_TARGET_MIPS64 1
422#define LJ_TARGET_GC64 1
423#endif
279#define LJ_TARGET_MIPS 1 424#define LJ_TARGET_MIPS 1
280#define LJ_TARGET_EHRETREG 4 425#define LJ_TARGET_EHRETREG 4
426#define LJ_TARGET_EHRAREG 31
281#define LJ_TARGET_JUMPRANGE 27 /* 2*2^27 = 256MB-aligned region */ 427#define LJ_TARGET_JUMPRANGE 27 /* 2*2^27 = 256MB-aligned region */
282#define LJ_TARGET_MASKSHIFT 1 428#define LJ_TARGET_MASKSHIFT 1
283#define LJ_TARGET_MASKROT 1 429#define LJ_TARGET_MASKROT 1
284#define LJ_TARGET_UNIFYROT 2 /* Want only IR_BROR. */ 430#define LJ_TARGET_UNIFYROT 2 /* Want only IR_BROR. */
285#define LJ_ARCH_NUMMODE LJ_NUMMODE_SINGLE 431#define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL
286 432
287#if _MIPS_ARCH_MIPS32R2 433#if LJ_TARGET_MIPSR6
434#define LJ_ARCH_VERSION 60
435#elif _MIPS_ARCH_MIPS32R2 || _MIPS_ARCH_MIPS64R2
288#define LJ_ARCH_VERSION 20 436#define LJ_ARCH_VERSION 20
289#else 437#else
290#define LJ_ARCH_VERSION 10 438#define LJ_ARCH_VERSION 10
@@ -294,9 +442,7 @@
294#error "No target architecture defined" 442#error "No target architecture defined"
295#endif 443#endif
296 444
297#ifndef LJ_PAGESIZE 445/* -- Checks for requirements --------------------------------------------- */
298#define LJ_PAGESIZE 4096
299#endif
300 446
301/* Check for minimum required compiler versions. */ 447/* Check for minimum required compiler versions. */
302#if defined(__GNUC__) 448#if defined(__GNUC__)
@@ -312,12 +458,28 @@
312#if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 2) 458#if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 2)
313#error "Need at least GCC 4.2 or newer" 459#error "Need at least GCC 4.2 or newer"
314#endif 460#endif
461#elif LJ_TARGET_ARM64
462#if __clang__
463#if ((__clang_major__ < 3) || ((__clang_major__ == 3) && __clang_minor__ < 5)) && !defined(__NX_TOOLCHAIN_MAJOR__)
464#error "Need at least Clang 3.5 or newer"
465#endif
466#else
467#if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 8)
468#error "Need at least GCC 4.8 or newer"
469#endif
470#endif
315#elif !LJ_TARGET_PS3 471#elif !LJ_TARGET_PS3
472#if __clang__
473#if ((__clang_major__ < 3) || ((__clang_major__ == 3) && __clang_minor__ < 5))
474#error "Need at least Clang 3.5 or newer"
475#endif
476#else
316#if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 3) 477#if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 3)
317#error "Need at least GCC 4.3 or newer" 478#error "Need at least GCC 4.3 or newer"
318#endif 479#endif
319#endif 480#endif
320#endif 481#endif
482#endif
321 483
322/* Check target-specific constraints. */ 484/* Check target-specific constraints. */
323#ifndef _BUILDVM_H 485#ifndef _BUILDVM_H
@@ -335,25 +497,34 @@
335#if !(__ARM_EABI__ || LJ_TARGET_IOS) 497#if !(__ARM_EABI__ || LJ_TARGET_IOS)
336#error "Only ARM EABI or iOS 3.0+ ABI is supported" 498#error "Only ARM EABI or iOS 3.0+ ABI is supported"
337#endif 499#endif
338#elif LJ_TARGET_PPC || LJ_TARGET_PPCSPE 500#elif LJ_TARGET_ARM64
339#if defined(_SOFT_FLOAT) || defined(_SOFT_DOUBLE) 501#if defined(_ILP32)
340#error "No support for PowerPC CPUs without double-precision FPU" 502#error "No support for ILP32 model on ARM64"
341#endif 503#endif
504#elif LJ_TARGET_PPC
342#if defined(_LITTLE_ENDIAN) && (!defined(_BYTE_ORDER) || (_BYTE_ORDER == _LITTLE_ENDIAN)) 505#if defined(_LITTLE_ENDIAN) && (!defined(_BYTE_ORDER) || (_BYTE_ORDER == _LITTLE_ENDIAN))
343#error "No support for little-endian PowerPC" 506#error "No support for little-endian PPC32"
344#endif 507#endif
345#if defined(_LP64) 508#if defined(__NO_FPRS__) && !defined(_SOFT_FLOAT)
346#error "No support for PowerPC 64 bit mode" 509#error "No support for PPC/e500 anymore (use LuaJIT 2.0)"
347#endif 510#endif
348#elif LJ_TARGET_MIPS 511#elif LJ_TARGET_MIPS32
349#if defined(__mips_soft_float) 512#if !((defined(_MIPS_SIM_ABI32) && _MIPS_SIM == _MIPS_SIM_ABI32) || (defined(_ABIO32) && _MIPS_SIM == _ABIO32))
350#error "No support for MIPS CPUs without FPU" 513#error "Only o32 ABI supported for MIPS32"
351#endif 514#endif
352#if defined(_LP64) 515#if LJ_TARGET_MIPSR6
353#error "No support for MIPS64" 516/* Not that useful, since most available r6 CPUs are 64 bit. */
517#error "No support for MIPS32R6"
354#endif 518#endif
519#elif LJ_TARGET_MIPS64
520#if !((defined(_MIPS_SIM_ABI64) && _MIPS_SIM == _MIPS_SIM_ABI64) || (defined(_ABI64) && _MIPS_SIM == _ABI64))
521/* MIPS32ON64 aka n32 ABI support might be desirable, but difficult. */
522#error "Only n64 ABI supported for MIPS64"
355#endif 523#endif
356#endif 524#endif
525#endif
526
527/* -- Derived defines ----------------------------------------------------- */
357 528
358/* Enable or disable the dual-number mode for the VM. */ 529/* Enable or disable the dual-number mode for the VM. */
359#if (LJ_ARCH_NUMMODE == LJ_NUMMODE_SINGLE && LUAJIT_NUMMODE == 2) || \ 530#if (LJ_ARCH_NUMMODE == LJ_NUMMODE_SINGLE && LUAJIT_NUMMODE == 2) || \
@@ -376,6 +547,20 @@
376#endif 547#endif
377#endif 548#endif
378 549
550/* 64 bit GC references. */
551#if LJ_TARGET_GC64
552#define LJ_GC64 1
553#else
554#define LJ_GC64 0
555#endif
556
557/* 2-slot frame info. */
558#if LJ_GC64
559#define LJ_FR2 1
560#else
561#define LJ_FR2 0
562#endif
563
379/* Disable or enable the JIT compiler. */ 564/* Disable or enable the JIT compiler. */
380#if defined(LUAJIT_DISABLE_JIT) || defined(LJ_ARCH_NOJIT) || defined(LJ_OS_NOJIT) 565#if defined(LUAJIT_DISABLE_JIT) || defined(LJ_ARCH_NOJIT) || defined(LJ_OS_NOJIT)
381#define LJ_HASJIT 0 566#define LJ_HASJIT 0
@@ -390,6 +575,28 @@
390#define LJ_HASFFI 1 575#define LJ_HASFFI 1
391#endif 576#endif
392 577
578/* Disable or enable the string buffer extension. */
579#if defined(LUAJIT_DISABLE_BUFFER)
580#define LJ_HASBUFFER 0
581#else
582#define LJ_HASBUFFER 1
583#endif
584
585#if defined(LUAJIT_DISABLE_PROFILE)
586#define LJ_HASPROFILE 0
587#elif LJ_TARGET_POSIX
588#define LJ_HASPROFILE 1
589#define LJ_PROFILE_SIGPROF 1
590#elif LJ_TARGET_PS3
591#define LJ_HASPROFILE 1
592#define LJ_PROFILE_PTHREAD 1
593#elif LJ_TARGET_WINDOWS || LJ_TARGET_XBOX360
594#define LJ_HASPROFILE 1
595#define LJ_PROFILE_WTHREAD 1
596#else
597#define LJ_HASPROFILE 0
598#endif
599
393#ifndef LJ_ARCH_HASFPU 600#ifndef LJ_ARCH_HASFPU
394#define LJ_ARCH_HASFPU 1 601#define LJ_ARCH_HASFPU 1
395#endif 602#endif
@@ -397,6 +604,11 @@
397#define LJ_ABI_SOFTFP 0 604#define LJ_ABI_SOFTFP 0
398#endif 605#endif
399#define LJ_SOFTFP (!LJ_ARCH_HASFPU) 606#define LJ_SOFTFP (!LJ_ARCH_HASFPU)
607#define LJ_SOFTFP32 (LJ_SOFTFP && LJ_32)
608
609#ifndef LJ_ABI_PAUTH
610#define LJ_ABI_PAUTH 0
611#endif
400 612
401#if LJ_ARCH_ENDIAN == LUAJIT_BE 613#if LJ_ARCH_ENDIAN == LUAJIT_BE
402#define LJ_LE 0 614#define LJ_LE 0
@@ -422,26 +634,52 @@
422#define LJ_TARGET_UNALIGNED 0 634#define LJ_TARGET_UNALIGNED 0
423#endif 635#endif
424 636
425/* Various workarounds for embedded operating systems. */ 637#ifndef LJ_PAGESIZE
426#if (defined(__ANDROID__) && !defined(LJ_TARGET_X86ORX64)) || defined(__symbian__) || LJ_TARGET_XBOX360 638#define LJ_PAGESIZE 4096
427#define LUAJIT_NO_LOG2
428#endif 639#endif
429#if defined(__symbian__) 640
430#define LUAJIT_NO_EXP2 641/* Various workarounds for embedded operating systems or weak C runtimes. */
642#if defined(__ANDROID__) || defined(__symbian__) || LJ_TARGET_XBOX360 || LJ_TARGET_WINDOWS
643#define LUAJIT_NO_LOG2
431#endif 644#endif
432#if LJ_TARGET_CONSOLE || (LJ_TARGET_IOS && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0) 645#if LJ_TARGET_CONSOLE || (LJ_TARGET_IOS && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0)
433#define LJ_NO_SYSTEM 1 646#define LJ_NO_SYSTEM 1
434#endif 647#endif
435 648
436#if !defined(LUAJIT_NO_UNWIND) && __GNU_COMPACT_EH__ 649#if LJ_TARGET_WINDOWS || LJ_TARGET_CYGWIN
437/* NYI: no support for compact unwind specification, yet. */ 650#define LJ_ABI_WIN 1
438#define LUAJIT_NO_UNWIND 1 651#else
652#define LJ_ABI_WIN 0
653#endif
654
655#if LJ_TARGET_WINDOWS
656#if LJ_TARGET_UWP
657#define LJ_WIN_VALLOC VirtualAllocFromApp
658#define LJ_WIN_VPROTECT VirtualProtectFromApp
659extern void *LJ_WIN_LOADLIBA(const char *path);
660#else
661#define LJ_WIN_VALLOC VirtualAlloc
662#define LJ_WIN_VPROTECT VirtualProtect
663#define LJ_WIN_LOADLIBA(path) LoadLibraryExA((path), NULL, 0)
664#endif
439#endif 665#endif
440 666
441#if defined(LUAJIT_NO_UNWIND) || defined(__symbian__) || LJ_TARGET_IOS || LJ_TARGET_PS3 || LJ_TARGET_PS4 667#if defined(LUAJIT_NO_UNWIND) || __GNU_COMPACT_EH__ || defined(__symbian__) || LJ_TARGET_IOS || LJ_TARGET_PS3 || LJ_TARGET_PS4 || LJ_TARGET_PS5
442#define LJ_NO_UNWIND 1 668#define LJ_NO_UNWIND 1
443#endif 669#endif
444 670
671#if !LJ_NO_UNWIND && !defined(LUAJIT_UNWIND_INTERNAL) && (LJ_ABI_WIN || (defined(LUAJIT_UNWIND_EXTERNAL) && (defined(__GNUC__) || defined(__clang__))))
672#define LJ_UNWIND_EXT 1
673#else
674#define LJ_UNWIND_EXT 0
675#endif
676
677#if LJ_UNWIND_EXT && LJ_HASJIT && !LJ_TARGET_ARM && !(LJ_ABI_WIN && LJ_TARGET_X86)
678#define LJ_UNWIND_JIT 1
679#else
680#define LJ_UNWIND_JIT 0
681#endif
682
445/* Compatibility with Lua 5.1 vs. 5.2. */ 683/* Compatibility with Lua 5.1 vs. 5.2. */
446#ifdef LUAJIT_ENABLE_LUA52COMPAT 684#ifdef LUAJIT_ENABLE_LUA52COMPAT
447#define LJ_52 1 685#define LJ_52 1
@@ -449,4 +687,46 @@
449#define LJ_52 0 687#define LJ_52 0
450#endif 688#endif
451 689
690/* -- VM security --------------------------------------------------------- */
691
692/* Don't make any changes here. Instead build with:
693** make "XCFLAGS=-DLUAJIT_SECURITY_flag=value"
694**
695** Important note to distro maintainers: DO NOT change the defaults for a
696** regular distro build -- neither upwards, nor downwards!
697** These build-time configurable security flags are intended for embedders
698** who may have specific needs wrt. security vs. performance.
699*/
700
701/* Security defaults. */
702#ifndef LUAJIT_SECURITY_PRNG
703/* PRNG init: 0 = fixed/insecure, 1 = secure from OS. */
704#define LUAJIT_SECURITY_PRNG 1
705#endif
706
707#ifndef LUAJIT_SECURITY_STRHASH
708/* String hash: 0 = sparse only, 1 = sparse + dense. */
709#define LUAJIT_SECURITY_STRHASH 1
710#endif
711
712#ifndef LUAJIT_SECURITY_STRID
713/* String IDs: 0 = linear, 1 = reseed < 255, 2 = reseed < 15, 3 = random. */
714#define LUAJIT_SECURITY_STRID 1
715#endif
716
717#ifndef LUAJIT_SECURITY_MCODE
718/* Machine code page protection: 0 = insecure RWX, 1 = secure RW^X. */
719#define LUAJIT_SECURITY_MCODE 1
720#endif
721
722#define LJ_SECURITY_MODE \
723 ( 0u \
724 | ((LUAJIT_SECURITY_PRNG & 3) << 0) \
725 | ((LUAJIT_SECURITY_STRHASH & 3) << 2) \
726 | ((LUAJIT_SECURITY_STRID & 3) << 4) \
727 | ((LUAJIT_SECURITY_MCODE & 3) << 6) \
728 )
729#define LJ_SECURITY_MODESTRING \
730 "\004prng\007strhash\005strid\005mcode"
731
452#endif 732#endif