]> git.ipfire.org Git - thirdparty/LuaJIT.git/commitdiff
x64: Allow building without external unwinder.
authorMike Pall <mike>
Tue, 9 Jun 2015 19:56:58 +0000 (21:56 +0200)
committerMike Pall <mike>
Tue, 9 Jun 2015 20:08:40 +0000 (22:08 +0200)
Required for PS4 SDK 2.5. Thanks to James Park.

src/Makefile
src/lj_arch.h
src/lj_err.c
src/lj_frame.h
src/ps4build.bat
src/vm_x86.dasc

index 1d38fa2516b0532bbfa5d7b8ed2c32712c2c6111..5021e479ab63f0c8b7f8a1f0afdcb21f2b53f946 100644 (file)
@@ -243,9 +243,6 @@ ifneq (,$(findstring LJ_TARGET_PS3 1,$(TARGET_TESTARCH)))
   TARGET_ARCH+= -D__CELLOS_LV2__
   TARGET_XCFLAGS+= -DLUAJIT_USE_SYSMALLOC
 endif
-ifneq (,$(findstring LJ_NO_UNWIND 1,$(TARGET_TESTARCH)))
-  TARGET_ARCH+= -DLUAJIT_NO_UNWIND
-endif
 
 TARGET_XCFLAGS+= $(CCOPT_$(TARGET_LJARCH))
 TARGET_ARCH+= $(patsubst %,-DLUAJIT_TARGET=LUAJIT_ARCH_%,$(TARGET_LJARCH))
@@ -397,6 +394,10 @@ ifeq (,$(findstring LJ_ABI_SOFTFP 1,$(TARGET_TESTARCH)))
 else
   TARGET_ARCH+= -DLJ_ABI_SOFTFP=1
 endif
+ifneq (,$(findstring LJ_NO_UNWIND 1,$(TARGET_TESTARCH)))
+  DASM_AFLAGS+= -D NO_UNWIND
+  TARGET_ARCH+= -DLUAJIT_NO_UNWIND
+endif
 DASM_AFLAGS+= -D VER=$(subst LJ_ARCH_VERSION_,,$(filter LJ_ARCH_VERSION_%,$(subst LJ_ARCH_VERSION ,LJ_ARCH_VERSION_,$(TARGET_TESTARCH))))
 ifeq (Windows,$(TARGET_SYS))
   DASM_AFLAGS+= -D WIN
index d3a9d57d70198571e15a45f30bed13e10b154016..d89d1169baeb4dc79b533460348878d1fb6623c5 100644 (file)
 #define LUAJIT_NO_EXP2
 #endif
 
-#if defined(LUAJIT_NO_UNWIND) || defined(__symbian__) || LJ_TARGET_IOS || LJ_TARGET_PS3
+#if defined(LUAJIT_NO_UNWIND) || defined(__symbian__) || LJ_TARGET_IOS || LJ_TARGET_PS3 || LJ_TARGET_PS4
 #define LJ_NO_UNWIND           1
 #endif
 
index 081bfde4af5e5f6e347981af9dfae192c1f57876..11b07b5624b2245d56b0a33faa2b376d923972d0 100644 (file)
 ** EXT cannot be enabled on WIN32 since system exceptions use code-driven SEH.
 ** EXT is mandatory on WIN64 since the calling convention has an abundance
 ** of callee-saved registers (rbx, rbp, rsi, rdi, r12-r15, xmm6-xmm15).
-** EXT is mandatory on POSIX/x64 since the interpreter doesn't save r12/r13.
+** The POSIX/x64 interpreter only saves r12/r13 for INT (e.g. PS4).
 */
 
-#if defined(__GNUC__) && (LJ_TARGET_X64 || defined(LUAJIT_UNWIND_EXTERNAL))
+#if defined(__GNUC__) && (LJ_TARGET_X64 || defined(LUAJIT_UNWIND_EXTERNAL)) && !LJ_NO_UNWIND
 #define LJ_UNWIND_EXT  1
 #elif LJ_TARGET_X64 && LJ_TARGET_WINDOWS
 #define LJ_UNWIND_EXT  1
index cd57be223fc25f9cdc05debf36c4fdd63e8be3a6..f981098496edbcf43a2fb95655ae7e7961cd8d0a 100644 (file)
@@ -86,7 +86,11 @@ enum {
 #define CFRAME_OFS_ERRF                (5*4)
 #define CFRAME_OFS_NRES                (4*4)
 #define CFRAME_OFS_MULTRES     (1*4)
+#if LJ_NO_UNWIND
+#define CFRAME_SIZE            (12*8)
+#else
 #define CFRAME_SIZE            (10*8)
+#endif
 #define CFRAME_SIZE_JIT                (CFRAME_SIZE + 16)
 #define CFRAME_SHIFT_MULTRES   0
 #endif
index 42fc9a64a99b815790ef947756ab67873d2d568e..337a44fa72d44f11819339c643c3217ab222b14a 100644 (file)
@@ -27,11 +27,11 @@ if exist minilua.exe.manifest^
 @minilua\r
 @if not errorlevel 8 goto :FAIL\r
 \r
-@set DASMFLAGS=-D P64\r
+@set DASMFLAGS=-D P64 -D NO_UNWIND\r
 minilua %DASM% -LN %DASMFLAGS% -o host\buildvm_arch.h vm_x86.dasc\r
 @if errorlevel 1 goto :BAD\r
 \r
-%LJCOMPILE% /I "." /I %DASMDIR% -DLUAJIT_TARGET=LUAJIT_ARCH_X64 -DLUAJIT_OS=LUAJIT_OS_OTHER -DLUAJIT_DISABLE_JIT -DLUAJIT_DISABLE_FFI host\buildvm*.c\r
+%LJCOMPILE% /I "." /I %DASMDIR% -DLUAJIT_TARGET=LUAJIT_ARCH_X64 -DLUAJIT_OS=LUAJIT_OS_OTHER -DLUAJIT_DISABLE_JIT -DLUAJIT_DISABLE_FFI -DLUAJIT_NO_UNWIND host\buildvm*.c\r
 @if errorlevel 1 goto :BAD\r
 %LJLINK% /out:buildvm.exe buildvm*.obj\r
 @if errorlevel 1 goto :BAD\r
index 6cdb8cbd2731812b7ddf817f3756125355d7d17f..129ab0003e3f22e1298d89abdacc5bc972833f73 100644 (file)
 |.define CFRAME_SPACE, aword*5                 // Delta for rsp (see <--).
 |.macro saveregs_
 |  push rbx; push r15; push r14
+|.if NO_UNWIND
+|  push r13; push r12
+|.endif
 |  sub rsp, CFRAME_SPACE
 |.endmacro
 |.macro saveregs
 |.endmacro
 |.macro restoreregs
 |  add rsp, CFRAME_SPACE
+|.if NO_UNWIND
+|  pop r12; pop r13
+|.endif
 |  pop r14; pop r15; pop rbx; pop rbp
 |.endmacro
 |
 |//----- 16 byte aligned,
+|.if NO_UNWIND
+|.define SAVE_RET,     aword [rsp+aword*11]    //<-- rsp entering interpreter.
+|.define SAVE_R4,      aword [rsp+aword*10]
+|.define SAVE_R3,      aword [rsp+aword*9]
+|.define SAVE_R2,      aword [rsp+aword*8]
+|.define SAVE_R1,      aword [rsp+aword*7]
+|.define SAVE_RU2,     aword [rsp+aword*6]
+|.define SAVE_RU1,     aword [rsp+aword*5]     //<-- rsp after register saves.
+|.else
 |.define SAVE_RET,     aword [rsp+aword*9]     //<-- rsp entering interpreter.
 |.define SAVE_R4,      aword [rsp+aword*8]
 |.define SAVE_R3,      aword [rsp+aword*7]
 |.define SAVE_R2,      aword [rsp+aword*6]
 |.define SAVE_R1,      aword [rsp+aword*5]     //<-- rsp after register saves.
+|.endif
 |.define SAVE_CFRAME,  aword [rsp+aword*4]
 |.define SAVE_PC,      dword [rsp+dword*7]
 |.define SAVE_L,       dword [rsp+dword*6]
@@ -6119,6 +6135,10 @@ static void emit_asm_debug(BuildCtx *ctx)
        "\t.byte 0x83\n\t.uleb128 0x3\n"        /* offset rbx */
        "\t.byte 0x8f\n\t.uleb128 0x4\n"        /* offset r15 */
        "\t.byte 0x8e\n\t.uleb128 0x5\n"        /* offset r14 */
+#if LJ_NO_UNWIND
+       "\t.byte 0x8d\n\t.uleb128 0x6\n"        /* offset r13 */
+       "\t.byte 0x8c\n\t.uleb128 0x7\n"        /* offset r12 */
+#endif
 #else
        "\t.long .Lbegin\n"
        "\t.long %d\n"
@@ -6154,6 +6174,7 @@ static void emit_asm_debug(BuildCtx *ctx)
        "\t.align " SZPTR "\n"
        ".LEFDE1:\n\n", (int)ctx->codesz - fcofs);
 #endif
+#if !LJ_NO_UNWIND
 #if (defined(__sun__) && defined(__svr4__))
 #if LJ_64
     fprintf(ctx->fp, "\t.section .eh_frame,\"a\",@unwind\n");
@@ -6241,8 +6262,10 @@ static void emit_asm_debug(BuildCtx *ctx)
 #endif
        "\t.align " SZPTR "\n"
        ".LEFDE3:\n\n", (int)ctx->codesz - fcofs);
+#endif
 #endif
     break;
+#if !LJ_NO_UNWIND
   /* Mental note: never let Apple design an assembler.
   ** Or a linker. Or a plastic case. But I digress.
   */
@@ -6370,6 +6393,7 @@ static void emit_asm_debug(BuildCtx *ctx)
 #endif
     }
     break;
+#endif
   default:  /* Difficult for other modes. */
     break;
   }