Mercurial
comparison third_party/luajit/src/lj_arch.h @ 178:94705b5986b3
[ThirdParty] Added WRK and luajit for load testing.
| author | MrJuneJune <me@mrjunejune.com> |
|---|---|
| date | Thu, 22 Jan 2026 20:10:30 -0800 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 177:24fe8ff94056 | 178:94705b5986b3 |
|---|---|
| 1 /* | |
| 2 ** Target architecture selection. | |
| 3 ** Copyright (C) 2005-2023 Mike Pall. See Copyright Notice in luajit.h | |
| 4 */ | |
| 5 | |
| 6 #ifndef _LJ_ARCH_H | |
| 7 #define _LJ_ARCH_H | |
| 8 | |
| 9 #include "lua.h" | |
| 10 | |
| 11 /* -- Target definitions -------------------------------------------------- */ | |
| 12 | |
| 13 /* Target endianess. */ | |
| 14 #define LUAJIT_LE 0 | |
| 15 #define LUAJIT_BE 1 | |
| 16 | |
| 17 /* Target architectures. */ | |
| 18 #define LUAJIT_ARCH_X86 1 | |
| 19 #define LUAJIT_ARCH_x86 1 | |
| 20 #define LUAJIT_ARCH_X64 2 | |
| 21 #define LUAJIT_ARCH_x64 2 | |
| 22 #define LUAJIT_ARCH_ARM 3 | |
| 23 #define LUAJIT_ARCH_arm 3 | |
| 24 #define LUAJIT_ARCH_ARM64 4 | |
| 25 #define LUAJIT_ARCH_arm64 4 | |
| 26 #define LUAJIT_ARCH_PPC 5 | |
| 27 #define LUAJIT_ARCH_ppc 5 | |
| 28 #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 | |
| 34 | |
| 35 /* Target OS. */ | |
| 36 #define LUAJIT_OS_OTHER 0 | |
| 37 #define LUAJIT_OS_WINDOWS 1 | |
| 38 #define LUAJIT_OS_LINUX 2 | |
| 39 #define LUAJIT_OS_OSX 3 | |
| 40 #define LUAJIT_OS_BSD 4 | |
| 41 #define LUAJIT_OS_POSIX 5 | |
| 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 | |
| 51 /* Select native target if no target defined. */ | |
| 52 #ifndef LUAJIT_TARGET | |
| 53 | |
| 54 #if defined(__i386) || defined(__i386__) || defined(_M_IX86) | |
| 55 #define LUAJIT_TARGET LUAJIT_ARCH_X86 | |
| 56 #elif defined(__x86_64__) || defined(__x86_64) || defined(_M_X64) || defined(_M_AMD64) | |
| 57 #define LUAJIT_TARGET LUAJIT_ARCH_X64 | |
| 58 #elif defined(__arm__) || defined(__arm) || defined(__ARM__) || defined(__ARM) | |
| 59 #define LUAJIT_TARGET LUAJIT_ARCH_ARM | |
| 60 #elif defined(__aarch64__) | |
| 61 #define LUAJIT_TARGET LUAJIT_ARCH_ARM64 | |
| 62 #elif defined(__ppc__) || defined(__ppc) || defined(__PPC__) || defined(__PPC) || defined(__powerpc__) || defined(__powerpc) || defined(__POWERPC__) || defined(__POWERPC) || defined(_M_PPC) | |
| 63 #define LUAJIT_TARGET LUAJIT_ARCH_PPC | |
| 64 #elif defined(__mips64__) || defined(__mips64) || defined(__MIPS64__) || defined(__MIPS64) | |
| 65 #define LUAJIT_TARGET LUAJIT_ARCH_MIPS64 | |
| 66 #elif defined(__mips__) || defined(__mips) || defined(__MIPS__) || defined(__MIPS) | |
| 67 #define LUAJIT_TARGET LUAJIT_ARCH_MIPS32 | |
| 68 #else | |
| 69 #error "No support for this architecture (yet)" | |
| 70 #endif | |
| 71 | |
| 72 #endif | |
| 73 | |
| 74 /* Select native OS if no target OS defined. */ | |
| 75 #ifndef LUAJIT_OS | |
| 76 | |
| 77 #if defined(_WIN32) && !defined(_XBOX_VER) | |
| 78 #define LUAJIT_OS LUAJIT_OS_WINDOWS | |
| 79 #elif defined(__linux__) | |
| 80 #define LUAJIT_OS LUAJIT_OS_LINUX | |
| 81 #elif defined(__MACH__) && defined(__APPLE__) | |
| 82 #include "TargetConditionals.h" | |
| 83 #define LUAJIT_OS LUAJIT_OS_OSX | |
| 84 #elif (defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || \ | |
| 85 defined(__NetBSD__) || defined(__OpenBSD__) || \ | |
| 86 defined(__DragonFly__)) && !defined(__ORBIS__) && !defined(__PROSPERO__) | |
| 87 #define LUAJIT_OS LUAJIT_OS_BSD | |
| 88 #elif (defined(__sun__) && defined(__svr4__)) | |
| 89 #define LJ_TARGET_SOLARIS 1 | |
| 90 #define LUAJIT_OS LUAJIT_OS_POSIX | |
| 91 #elif defined(__HAIKU__) | |
| 92 #define LUAJIT_OS LUAJIT_OS_POSIX | |
| 93 #elif defined(__CYGWIN__) | |
| 94 #define LJ_TARGET_CYGWIN 1 | |
| 95 #define LUAJIT_OS LUAJIT_OS_POSIX | |
| 96 #elif defined(__QNX__) | |
| 97 #define LJ_TARGET_QNX 1 | |
| 98 #define LUAJIT_OS LUAJIT_OS_POSIX | |
| 99 #else | |
| 100 #define LUAJIT_OS LUAJIT_OS_OTHER | |
| 101 #endif | |
| 102 | |
| 103 #endif | |
| 104 | |
| 105 /* Set target OS properties. */ | |
| 106 #if LUAJIT_OS == LUAJIT_OS_WINDOWS | |
| 107 #define LJ_OS_NAME "Windows" | |
| 108 #elif LUAJIT_OS == LUAJIT_OS_LINUX | |
| 109 #define LJ_OS_NAME "Linux" | |
| 110 #elif LUAJIT_OS == LUAJIT_OS_OSX | |
| 111 #define LJ_OS_NAME "OSX" | |
| 112 #elif LUAJIT_OS == LUAJIT_OS_BSD | |
| 113 #define LJ_OS_NAME "BSD" | |
| 114 #elif LUAJIT_OS == LUAJIT_OS_POSIX | |
| 115 #define LJ_OS_NAME "POSIX" | |
| 116 #else | |
| 117 #define LJ_OS_NAME "Other" | |
| 118 #endif | |
| 119 | |
| 120 #define LJ_TARGET_WINDOWS (LUAJIT_OS == LUAJIT_OS_WINDOWS) | |
| 121 #define LJ_TARGET_LINUX (LUAJIT_OS == LUAJIT_OS_LINUX) | |
| 122 #define LJ_TARGET_OSX (LUAJIT_OS == LUAJIT_OS_OSX) | |
| 123 #define LJ_TARGET_BSD (LUAJIT_OS == LUAJIT_OS_BSD) | |
| 124 #define LJ_TARGET_POSIX (LUAJIT_OS > LUAJIT_OS_WINDOWS) | |
| 125 #define LJ_TARGET_DLOPEN LJ_TARGET_POSIX | |
| 126 | |
| 127 #if TARGET_OS_IPHONE | |
| 128 #define LJ_TARGET_IOS 1 | |
| 129 #else | |
| 130 #define LJ_TARGET_IOS 0 | |
| 131 #endif | |
| 132 | |
| 133 #ifdef __CELLOS_LV2__ | |
| 134 #define LJ_TARGET_PS3 1 | |
| 135 #define LJ_TARGET_CONSOLE 1 | |
| 136 #endif | |
| 137 | |
| 138 #ifdef __ORBIS__ | |
| 139 #define LJ_TARGET_PS4 1 | |
| 140 #define LJ_TARGET_CONSOLE 1 | |
| 141 #undef NULL | |
| 142 #define NULL ((void*)0) | |
| 143 #endif | |
| 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 | |
| 152 #ifdef __psp2__ | |
| 153 #define LJ_TARGET_PSVITA 1 | |
| 154 #define LJ_TARGET_CONSOLE 1 | |
| 155 #endif | |
| 156 | |
| 157 #if _XBOX_VER >= 200 | |
| 158 #define LJ_TARGET_XBOX360 1 | |
| 159 #define LJ_TARGET_CONSOLE 1 | |
| 160 #endif | |
| 161 | |
| 162 #ifdef _DURANGO | |
| 163 #define LJ_TARGET_XBOXONE 1 | |
| 164 #define LJ_TARGET_CONSOLE 1 | |
| 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 ---------------------------------------------- */ | |
| 183 | |
| 184 /* Set target architecture properties. */ | |
| 185 #if LUAJIT_TARGET == LUAJIT_ARCH_X86 | |
| 186 | |
| 187 #define LJ_ARCH_NAME "x86" | |
| 188 #define LJ_ARCH_BITS 32 | |
| 189 #define LJ_ARCH_ENDIAN LUAJIT_LE | |
| 190 #define LJ_TARGET_X86 1 | |
| 191 #define LJ_TARGET_X86ORX64 1 | |
| 192 #define LJ_TARGET_EHRETREG 0 | |
| 193 #define LJ_TARGET_EHRAREG 8 | |
| 194 #define LJ_TARGET_MASKSHIFT 1 | |
| 195 #define LJ_TARGET_MASKROT 1 | |
| 196 #define LJ_TARGET_UNALIGNED 1 | |
| 197 #define LJ_ARCH_NUMMODE LJ_NUMMODE_SINGLE_DUAL | |
| 198 | |
| 199 #elif LUAJIT_TARGET == LUAJIT_ARCH_X64 | |
| 200 | |
| 201 #define LJ_ARCH_NAME "x64" | |
| 202 #define LJ_ARCH_BITS 64 | |
| 203 #define LJ_ARCH_ENDIAN LUAJIT_LE | |
| 204 #define LJ_TARGET_X64 1 | |
| 205 #define LJ_TARGET_X86ORX64 1 | |
| 206 #define LJ_TARGET_EHRETREG 0 | |
| 207 #define LJ_TARGET_EHRAREG 16 | |
| 208 #define LJ_TARGET_JUMPRANGE 31 /* +-2^31 = +-2GB */ | |
| 209 #define LJ_TARGET_MASKSHIFT 1 | |
| 210 #define LJ_TARGET_MASKROT 1 | |
| 211 #define LJ_TARGET_UNALIGNED 1 | |
| 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 | |
| 218 | |
| 219 #elif LUAJIT_TARGET == LUAJIT_ARCH_ARM | |
| 220 | |
| 221 #define LJ_ARCH_NAME "arm" | |
| 222 #define LJ_ARCH_BITS 32 | |
| 223 #define LJ_ARCH_ENDIAN LUAJIT_LE | |
| 224 #if !defined(LJ_ARCH_HASFPU) && __SOFTFP__ | |
| 225 #define LJ_ARCH_HASFPU 0 | |
| 226 #endif | |
| 227 #if !defined(LJ_ABI_SOFTFP) && !__ARM_PCS_VFP | |
| 228 #define LJ_ABI_SOFTFP 1 | |
| 229 #endif | |
| 230 #define LJ_ABI_EABI 1 | |
| 231 #define LJ_TARGET_ARM 1 | |
| 232 #define LJ_TARGET_EHRETREG 0 | |
| 233 #define LJ_TARGET_EHRAREG 14 | |
| 234 #define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */ | |
| 235 #define LJ_TARGET_MASKSHIFT 0 | |
| 236 #define LJ_TARGET_MASKROT 1 | |
| 237 #define LJ_TARGET_UNIFYROT 2 /* Want only IR_BROR. */ | |
| 238 #define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL | |
| 239 | |
| 240 #if __ARM_ARCH == 8 || __ARM_ARCH_8__ || __ARM_ARCH_8A__ | |
| 241 #define LJ_ARCH_VERSION 80 | |
| 242 #elif __ARM_ARCH == 7 || __ARM_ARCH_7__ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ || __ARM_ARCH_7S__ || __ARM_ARCH_7VE__ | |
| 243 #define LJ_ARCH_VERSION 70 | |
| 244 #elif __ARM_ARCH_6T2__ | |
| 245 #define LJ_ARCH_VERSION 61 | |
| 246 #elif __ARM_ARCH == 6 || __ARM_ARCH_6__ || __ARM_ARCH_6J__ || __ARM_ARCH_6K__ || __ARM_ARCH_6Z__ || __ARM_ARCH_6ZK__ | |
| 247 #define LJ_ARCH_VERSION 60 | |
| 248 #else | |
| 249 #define LJ_ARCH_VERSION 50 | |
| 250 #endif | |
| 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 | |
| 277 #elif LUAJIT_TARGET == LUAJIT_ARCH_PPC | |
| 278 | |
| 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 | |
| 287 #if _LP64 | |
| 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 | |
| 294 #else | |
| 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 | |
| 303 #endif | |
| 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 | |
| 321 #define LJ_TARGET_PPC 1 | |
| 322 #define LJ_TARGET_EHRETREG 3 | |
| 323 #define LJ_TARGET_EHRAREG 65 | |
| 324 #define LJ_TARGET_JUMPRANGE 25 /* +-2^25 = +-32MB */ | |
| 325 #define LJ_TARGET_MASKSHIFT 0 | |
| 326 #define LJ_TARGET_MASKROT 1 | |
| 327 #define LJ_TARGET_UNIFYROT 1 /* Want only IR_BROL. */ | |
| 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 | |
| 335 | |
| 336 #if _ARCH_PWR7 | |
| 337 #define LJ_ARCH_VERSION 70 | |
| 338 #elif _ARCH_PWR6 | |
| 339 #define LJ_ARCH_VERSION 60 | |
| 340 #elif _ARCH_PWR5X | |
| 341 #define LJ_ARCH_VERSION 51 | |
| 342 #elif _ARCH_PWR5 | |
| 343 #define LJ_ARCH_VERSION 50 | |
| 344 #elif _ARCH_PWR4 | |
| 345 #define LJ_ARCH_VERSION 40 | |
| 346 #else | |
| 347 #define LJ_ARCH_VERSION 0 | |
| 348 #endif | |
| 349 #if _ARCH_PPCSQ | |
| 350 #define LJ_ARCH_SQRT 1 | |
| 351 #endif | |
| 352 #if _ARCH_PWR5X | |
| 353 #define LJ_ARCH_ROUND 1 | |
| 354 #endif | |
| 355 #if __PPU__ | |
| 356 #define LJ_ARCH_CELL 1 | |
| 357 #endif | |
| 358 #if LJ_TARGET_XBOX360 | |
| 359 #define LJ_ARCH_XENON 1 | |
| 360 #endif | |
| 361 | |
| 362 #elif LUAJIT_TARGET == LUAJIT_ARCH_MIPS32 || LUAJIT_TARGET == LUAJIT_ARCH_MIPS64 | |
| 363 | |
| 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 | |
| 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 | |
| 382 #define LJ_ARCH_ENDIAN LUAJIT_LE | |
| 383 #else | |
| 384 #if LUAJIT_TARGET == LUAJIT_ARCH_MIPS32 | |
| 385 #if LJ_TARGET_MIPSR6 | |
| 386 #define LJ_ARCH_NAME "mips32r6" | |
| 387 #else | |
| 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 | |
| 397 #define LJ_ARCH_ENDIAN LUAJIT_BE | |
| 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 | |
| 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 | |
| 424 #define LJ_TARGET_MIPS 1 | |
| 425 #define LJ_TARGET_EHRETREG 4 | |
| 426 #define LJ_TARGET_EHRAREG 31 | |
| 427 #define LJ_TARGET_JUMPRANGE 27 /* 2*2^27 = 256MB-aligned region */ | |
| 428 #define LJ_TARGET_MASKSHIFT 1 | |
| 429 #define LJ_TARGET_MASKROT 1 | |
| 430 #define LJ_TARGET_UNIFYROT 2 /* Want only IR_BROR. */ | |
| 431 #define LJ_ARCH_NUMMODE LJ_NUMMODE_DUAL | |
| 432 | |
| 433 #if LJ_TARGET_MIPSR6 | |
| 434 #define LJ_ARCH_VERSION 60 | |
| 435 #elif _MIPS_ARCH_MIPS32R2 || _MIPS_ARCH_MIPS64R2 | |
| 436 #define LJ_ARCH_VERSION 20 | |
| 437 #else | |
| 438 #define LJ_ARCH_VERSION 10 | |
| 439 #endif | |
| 440 | |
| 441 #else | |
| 442 #error "No target architecture defined" | |
| 443 #endif | |
| 444 | |
| 445 /* -- Checks for requirements --------------------------------------------- */ | |
| 446 | |
| 447 /* Check for minimum required compiler versions. */ | |
| 448 #if defined(__GNUC__) | |
| 449 #if LJ_TARGET_X86 | |
| 450 #if (__GNUC__ < 3) || ((__GNUC__ == 3) && __GNUC_MINOR__ < 4) | |
| 451 #error "Need at least GCC 3.4 or newer" | |
| 452 #endif | |
| 453 #elif LJ_TARGET_X64 | |
| 454 #if __GNUC__ < 4 | |
| 455 #error "Need at least GCC 4.0 or newer" | |
| 456 #endif | |
| 457 #elif LJ_TARGET_ARM | |
| 458 #if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 2) | |
| 459 #error "Need at least GCC 4.2 or newer" | |
| 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 | |
| 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 | |
| 477 #if (__GNUC__ < 4) || ((__GNUC__ == 4) && __GNUC_MINOR__ < 3) | |
| 478 #error "Need at least GCC 4.3 or newer" | |
| 479 #endif | |
| 480 #endif | |
| 481 #endif | |
| 482 #endif | |
| 483 | |
| 484 /* Check target-specific constraints. */ | |
| 485 #ifndef _BUILDVM_H | |
| 486 #if LJ_TARGET_X64 | |
| 487 #if __USING_SJLJ_EXCEPTIONS__ | |
| 488 #error "Need a C compiler with native exception handling on x64" | |
| 489 #endif | |
| 490 #elif LJ_TARGET_ARM | |
| 491 #if defined(__ARMEB__) | |
| 492 #error "No support for big-endian ARM" | |
| 493 #endif | |
| 494 #if __ARM_ARCH_6M__ || __ARM_ARCH_7M__ || __ARM_ARCH_7EM__ | |
| 495 #error "No support for Cortex-M CPUs" | |
| 496 #endif | |
| 497 #if !(__ARM_EABI__ || LJ_TARGET_IOS) | |
| 498 #error "Only ARM EABI or iOS 3.0+ ABI is supported" | |
| 499 #endif | |
| 500 #elif LJ_TARGET_ARM64 | |
| 501 #if defined(_ILP32) | |
| 502 #error "No support for ILP32 model on ARM64" | |
| 503 #endif | |
| 504 #elif LJ_TARGET_PPC | |
| 505 #if defined(_LITTLE_ENDIAN) && (!defined(_BYTE_ORDER) || (_BYTE_ORDER == _LITTLE_ENDIAN)) | |
| 506 #error "No support for little-endian PPC32" | |
| 507 #endif | |
| 508 #if defined(__NO_FPRS__) && !defined(_SOFT_FLOAT) | |
| 509 #error "No support for PPC/e500 anymore (use LuaJIT 2.0)" | |
| 510 #endif | |
| 511 #elif LJ_TARGET_MIPS32 | |
| 512 #if !((defined(_MIPS_SIM_ABI32) && _MIPS_SIM == _MIPS_SIM_ABI32) || (defined(_ABIO32) && _MIPS_SIM == _ABIO32)) | |
| 513 #error "Only o32 ABI supported for MIPS32" | |
| 514 #endif | |
| 515 #if LJ_TARGET_MIPSR6 | |
| 516 /* Not that useful, since most available r6 CPUs are 64 bit. */ | |
| 517 #error "No support for MIPS32R6" | |
| 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" | |
| 523 #endif | |
| 524 #endif | |
| 525 #endif | |
| 526 | |
| 527 /* -- Derived defines ----------------------------------------------------- */ | |
| 528 | |
| 529 /* Enable or disable the dual-number mode for the VM. */ | |
| 530 #if (LJ_ARCH_NUMMODE == LJ_NUMMODE_SINGLE && LUAJIT_NUMMODE == 2) || \ | |
| 531 (LJ_ARCH_NUMMODE == LJ_NUMMODE_DUAL && LUAJIT_NUMMODE == 1) | |
| 532 #error "No support for this number mode on this architecture" | |
| 533 #endif | |
| 534 #if LJ_ARCH_NUMMODE == LJ_NUMMODE_DUAL || \ | |
| 535 (LJ_ARCH_NUMMODE == LJ_NUMMODE_DUAL_SINGLE && LUAJIT_NUMMODE != 1) || \ | |
| 536 (LJ_ARCH_NUMMODE == LJ_NUMMODE_SINGLE_DUAL && LUAJIT_NUMMODE == 2) | |
| 537 #define LJ_DUALNUM 1 | |
| 538 #else | |
| 539 #define LJ_DUALNUM 0 | |
| 540 #endif | |
| 541 | |
| 542 #if LJ_TARGET_IOS || LJ_TARGET_CONSOLE | |
| 543 /* Runtime code generation is restricted on iOS. Complain to Apple, not me. */ | |
| 544 /* Ditto for the consoles. Complain to Sony or MS, not me. */ | |
| 545 #ifndef LUAJIT_ENABLE_JIT | |
| 546 #define LJ_OS_NOJIT 1 | |
| 547 #endif | |
| 548 #endif | |
| 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 | |
| 564 /* Disable or enable the JIT compiler. */ | |
| 565 #if defined(LUAJIT_DISABLE_JIT) || defined(LJ_ARCH_NOJIT) || defined(LJ_OS_NOJIT) | |
| 566 #define LJ_HASJIT 0 | |
| 567 #else | |
| 568 #define LJ_HASJIT 1 | |
| 569 #endif | |
| 570 | |
| 571 /* Disable or enable the FFI extension. */ | |
| 572 #if defined(LUAJIT_DISABLE_FFI) || defined(LJ_ARCH_NOFFI) | |
| 573 #define LJ_HASFFI 0 | |
| 574 #else | |
| 575 #define LJ_HASFFI 1 | |
| 576 #endif | |
| 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 | |
| 600 #ifndef LJ_ARCH_HASFPU | |
| 601 #define LJ_ARCH_HASFPU 1 | |
| 602 #endif | |
| 603 #ifndef LJ_ABI_SOFTFP | |
| 604 #define LJ_ABI_SOFTFP 0 | |
| 605 #endif | |
| 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 | |
| 612 | |
| 613 #if LJ_ARCH_ENDIAN == LUAJIT_BE | |
| 614 #define LJ_LE 0 | |
| 615 #define LJ_BE 1 | |
| 616 #define LJ_ENDIAN_SELECT(le, be) be | |
| 617 #define LJ_ENDIAN_LOHI(lo, hi) hi lo | |
| 618 #else | |
| 619 #define LJ_LE 1 | |
| 620 #define LJ_BE 0 | |
| 621 #define LJ_ENDIAN_SELECT(le, be) le | |
| 622 #define LJ_ENDIAN_LOHI(lo, hi) lo hi | |
| 623 #endif | |
| 624 | |
| 625 #if LJ_ARCH_BITS == 32 | |
| 626 #define LJ_32 1 | |
| 627 #define LJ_64 0 | |
| 628 #else | |
| 629 #define LJ_32 0 | |
| 630 #define LJ_64 1 | |
| 631 #endif | |
| 632 | |
| 633 #ifndef LJ_TARGET_UNALIGNED | |
| 634 #define LJ_TARGET_UNALIGNED 0 | |
| 635 #endif | |
| 636 | |
| 637 #ifndef LJ_PAGESIZE | |
| 638 #define LJ_PAGESIZE 4096 | |
| 639 #endif | |
| 640 | |
| 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 | |
| 644 #endif | |
| 645 #if LJ_TARGET_CONSOLE || (LJ_TARGET_IOS && __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0) | |
| 646 #define LJ_NO_SYSTEM 1 | |
| 647 #endif | |
| 648 | |
| 649 #if LJ_TARGET_WINDOWS || LJ_TARGET_CYGWIN | |
| 650 #define LJ_ABI_WIN 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 | |
| 659 extern 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 | |
| 665 #endif | |
| 666 | |
| 667 #if defined(LUAJIT_NO_UNWIND) || __GNU_COMPACT_EH__ || defined(__symbian__) || LJ_TARGET_IOS || LJ_TARGET_PS3 || LJ_TARGET_PS4 || LJ_TARGET_PS5 | |
| 668 #define LJ_NO_UNWIND 1 | |
| 669 #endif | |
| 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 | |
| 683 /* Compatibility with Lua 5.1 vs. 5.2. */ | |
| 684 #ifdef LUAJIT_ENABLE_LUA52COMPAT | |
| 685 #define LJ_52 1 | |
| 686 #else | |
| 687 #define LJ_52 0 | |
| 688 #endif | |
| 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 | |
| 732 #endif |