diff options
-rw-r--r-- | src/lj_asm_arm.h | 7 | ||||
-rw-r--r-- | src/lj_asm_mips.h | 5 | ||||
-rw-r--r-- | src/lj_asm_ppc.h | 5 | ||||
-rw-r--r-- | src/lj_asm_x86.h | 5 | ||||
-rw-r--r-- | src/lj_cparse.c | 2 | ||||
-rw-r--r-- | src/lj_record.c | 2 | ||||
-rw-r--r-- | src/xedkbuild.bat | 4 |
7 files changed, 18 insertions, 12 deletions
diff --git a/src/lj_asm_arm.h b/src/lj_asm_arm.h index 420f0ed2..8339367b 100644 --- a/src/lj_asm_arm.h +++ b/src/lj_asm_arm.h | |||
@@ -484,6 +484,7 @@ static void asm_retf(ASMState *as, IRIns *ir) | |||
484 | int32_t delta = 1+bc_a(*((const BCIns *)pc - 1)); | 484 | int32_t delta = 1+bc_a(*((const BCIns *)pc - 1)); |
485 | as->topslot -= (BCReg)delta; | 485 | as->topslot -= (BCReg)delta; |
486 | if ((int32_t)as->topslot < 0) as->topslot = 0; | 486 | if ((int32_t)as->topslot < 0) as->topslot = 0; |
487 | irt_setmark(IR(REF_BASE)->t); /* Children must not coalesce with BASE reg. */ | ||
487 | /* Need to force a spill on REF_BASE now to update the stack slot. */ | 488 | /* Need to force a spill on REF_BASE now to update the stack slot. */ |
488 | emit_lso(as, ARMI_STR, base, RID_SP, ra_spill(as, IR(REF_BASE))); | 489 | emit_lso(as, ARMI_STR, base, RID_SP, ra_spill(as, IR(REF_BASE))); |
489 | emit_setgl(as, base, jit_base); | 490 | emit_setgl(as, base, jit_base); |
@@ -2088,7 +2089,8 @@ static void asm_head_root_base(ASMState *as) | |||
2088 | IRIns *ir; | 2089 | IRIns *ir; |
2089 | asm_head_lreg(as); | 2090 | asm_head_lreg(as); |
2090 | ir = IR(REF_BASE); | 2091 | ir = IR(REF_BASE); |
2091 | if (ra_hasreg(ir->r) && rset_test(as->modset, ir->r)) ra_spill(as, ir); | 2092 | if (ra_hasreg(ir->r) && (rset_test(as->modset, ir->r) || irt_ismarked(ir->t))) |
2093 | ra_spill(as, ir); | ||
2092 | ra_destreg(as, ir, RID_BASE); | 2094 | ra_destreg(as, ir, RID_BASE); |
2093 | } | 2095 | } |
2094 | 2096 | ||
@@ -2098,7 +2100,8 @@ static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow) | |||
2098 | IRIns *ir; | 2100 | IRIns *ir; |
2099 | asm_head_lreg(as); | 2101 | asm_head_lreg(as); |
2100 | ir = IR(REF_BASE); | 2102 | ir = IR(REF_BASE); |
2101 | if (ra_hasreg(ir->r) && rset_test(as->modset, ir->r)) ra_spill(as, ir); | 2103 | if (ra_hasreg(ir->r) && (rset_test(as->modset, ir->r) || irt_ismarked(ir->t))) |
2104 | ra_spill(as, ir); | ||
2102 | if (ra_hasspill(irp->s)) { | 2105 | if (ra_hasspill(irp->s)) { |
2103 | rset_clear(allow, ra_dest(as, ir, allow)); | 2106 | rset_clear(allow, ra_dest(as, ir, allow)); |
2104 | } else { | 2107 | } else { |
diff --git a/src/lj_asm_mips.h b/src/lj_asm_mips.h index b45776d4..bc521596 100644 --- a/src/lj_asm_mips.h +++ b/src/lj_asm_mips.h | |||
@@ -375,6 +375,7 @@ static void asm_retf(ASMState *as, IRIns *ir) | |||
375 | int32_t delta = 1+bc_a(*((const BCIns *)pc - 1)); | 375 | int32_t delta = 1+bc_a(*((const BCIns *)pc - 1)); |
376 | as->topslot -= (BCReg)delta; | 376 | as->topslot -= (BCReg)delta; |
377 | if ((int32_t)as->topslot < 0) as->topslot = 0; | 377 | if ((int32_t)as->topslot < 0) as->topslot = 0; |
378 | irt_setmark(IR(REF_BASE)->t); /* Children must not coalesce with BASE reg. */ | ||
378 | emit_setgl(as, base, jit_base); | 379 | emit_setgl(as, base, jit_base); |
379 | emit_addptr(as, base, -8*delta); | 380 | emit_addptr(as, base, -8*delta); |
380 | asm_guard(as, MIPSI_BNE, RID_TMP, | 381 | asm_guard(as, MIPSI_BNE, RID_TMP, |
@@ -1697,7 +1698,7 @@ static void asm_head_root_base(ASMState *as) | |||
1697 | if (as->loopinv) as->mctop--; | 1698 | if (as->loopinv) as->mctop--; |
1698 | if (ra_hasreg(r)) { | 1699 | if (ra_hasreg(r)) { |
1699 | ra_free(as, r); | 1700 | ra_free(as, r); |
1700 | if (rset_test(as->modset, r)) | 1701 | if (rset_test(as->modset, r) || irt_ismarked(ir->t)) |
1701 | ir->r = RID_INIT; /* No inheritance for modified BASE register. */ | 1702 | ir->r = RID_INIT; /* No inheritance for modified BASE register. */ |
1702 | if (r != RID_BASE) | 1703 | if (r != RID_BASE) |
1703 | emit_move(as, r, RID_BASE); | 1704 | emit_move(as, r, RID_BASE); |
@@ -1712,7 +1713,7 @@ static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow) | |||
1712 | if (as->loopinv) as->mctop--; | 1713 | if (as->loopinv) as->mctop--; |
1713 | if (ra_hasreg(r)) { | 1714 | if (ra_hasreg(r)) { |
1714 | ra_free(as, r); | 1715 | ra_free(as, r); |
1715 | if (rset_test(as->modset, r)) | 1716 | if (rset_test(as->modset, r) || irt_ismarked(ir->t)) |
1716 | ir->r = RID_INIT; /* No inheritance for modified BASE register. */ | 1717 | ir->r = RID_INIT; /* No inheritance for modified BASE register. */ |
1717 | if (irp->r == r) { | 1718 | if (irp->r == r) { |
1718 | rset_clear(allow, r); /* Mark same BASE register as coalesced. */ | 1719 | rset_clear(allow, r); /* Mark same BASE register as coalesced. */ |
diff --git a/src/lj_asm_ppc.h b/src/lj_asm_ppc.h index ce5cab10..676bfcbf 100644 --- a/src/lj_asm_ppc.h +++ b/src/lj_asm_ppc.h | |||
@@ -362,6 +362,7 @@ static void asm_retf(ASMState *as, IRIns *ir) | |||
362 | int32_t delta = 1+bc_a(*((const BCIns *)pc - 1)); | 362 | int32_t delta = 1+bc_a(*((const BCIns *)pc - 1)); |
363 | as->topslot -= (BCReg)delta; | 363 | as->topslot -= (BCReg)delta; |
364 | if ((int32_t)as->topslot < 0) as->topslot = 0; | 364 | if ((int32_t)as->topslot < 0) as->topslot = 0; |
365 | irt_setmark(IR(REF_BASE)->t); /* Children must not coalesce with BASE reg. */ | ||
365 | emit_setgl(as, base, jit_base); | 366 | emit_setgl(as, base, jit_base); |
366 | emit_addptr(as, base, -8*delta); | 367 | emit_addptr(as, base, -8*delta); |
367 | asm_guardcc(as, CC_NE); | 368 | asm_guardcc(as, CC_NE); |
@@ -1868,7 +1869,7 @@ static void asm_head_root_base(ASMState *as) | |||
1868 | Reg r = ir->r; | 1869 | Reg r = ir->r; |
1869 | if (ra_hasreg(r)) { | 1870 | if (ra_hasreg(r)) { |
1870 | ra_free(as, r); | 1871 | ra_free(as, r); |
1871 | if (rset_test(as->modset, r)) | 1872 | if (rset_test(as->modset, r) || irt_ismarked(ir->t)) |
1872 | ir->r = RID_INIT; /* No inheritance for modified BASE register. */ | 1873 | ir->r = RID_INIT; /* No inheritance for modified BASE register. */ |
1873 | if (r != RID_BASE) | 1874 | if (r != RID_BASE) |
1874 | emit_mr(as, r, RID_BASE); | 1875 | emit_mr(as, r, RID_BASE); |
@@ -1882,7 +1883,7 @@ static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow) | |||
1882 | Reg r = ir->r; | 1883 | Reg r = ir->r; |
1883 | if (ra_hasreg(r)) { | 1884 | if (ra_hasreg(r)) { |
1884 | ra_free(as, r); | 1885 | ra_free(as, r); |
1885 | if (rset_test(as->modset, r)) | 1886 | if (rset_test(as->modset, r) || irt_ismarked(ir->t)) |
1886 | ir->r = RID_INIT; /* No inheritance for modified BASE register. */ | 1887 | ir->r = RID_INIT; /* No inheritance for modified BASE register. */ |
1887 | if (irp->r == r) { | 1888 | if (irp->r == r) { |
1888 | rset_clear(allow, r); /* Mark same BASE register as coalesced. */ | 1889 | rset_clear(allow, r); /* Mark same BASE register as coalesced. */ |
diff --git a/src/lj_asm_x86.h b/src/lj_asm_x86.h index 398d34ef..3e87ba18 100644 --- a/src/lj_asm_x86.h +++ b/src/lj_asm_x86.h | |||
@@ -638,6 +638,7 @@ static void asm_retf(ASMState *as, IRIns *ir) | |||
638 | int32_t delta = 1+bc_a(*((const BCIns *)pc - 1)); | 638 | int32_t delta = 1+bc_a(*((const BCIns *)pc - 1)); |
639 | as->topslot -= (BCReg)delta; | 639 | as->topslot -= (BCReg)delta; |
640 | if ((int32_t)as->topslot < 0) as->topslot = 0; | 640 | if ((int32_t)as->topslot < 0) as->topslot = 0; |
641 | irt_setmark(IR(REF_BASE)->t); /* Children must not coalesce with BASE reg. */ | ||
641 | emit_setgl(as, base, jit_base); | 642 | emit_setgl(as, base, jit_base); |
642 | emit_addptr(as, base, -8*delta); | 643 | emit_addptr(as, base, -8*delta); |
643 | asm_guardcc(as, CC_NE); | 644 | asm_guardcc(as, CC_NE); |
@@ -2508,7 +2509,7 @@ static void asm_head_root_base(ASMState *as) | |||
2508 | Reg r = ir->r; | 2509 | Reg r = ir->r; |
2509 | if (ra_hasreg(r)) { | 2510 | if (ra_hasreg(r)) { |
2510 | ra_free(as, r); | 2511 | ra_free(as, r); |
2511 | if (rset_test(as->modset, r)) | 2512 | if (rset_test(as->modset, r) || irt_ismarked(ir->t)) |
2512 | ir->r = RID_INIT; /* No inheritance for modified BASE register. */ | 2513 | ir->r = RID_INIT; /* No inheritance for modified BASE register. */ |
2513 | if (r != RID_BASE) | 2514 | if (r != RID_BASE) |
2514 | emit_rr(as, XO_MOV, r, RID_BASE); | 2515 | emit_rr(as, XO_MOV, r, RID_BASE); |
@@ -2522,7 +2523,7 @@ static RegSet asm_head_side_base(ASMState *as, IRIns *irp, RegSet allow) | |||
2522 | Reg r = ir->r; | 2523 | Reg r = ir->r; |
2523 | if (ra_hasreg(r)) { | 2524 | if (ra_hasreg(r)) { |
2524 | ra_free(as, r); | 2525 | ra_free(as, r); |
2525 | if (rset_test(as->modset, r)) | 2526 | if (rset_test(as->modset, r) || irt_ismarked(ir->t)) |
2526 | ir->r = RID_INIT; /* No inheritance for modified BASE register. */ | 2527 | ir->r = RID_INIT; /* No inheritance for modified BASE register. */ |
2527 | if (irp->r == r) { | 2528 | if (irp->r == r) { |
2528 | rset_clear(allow, r); /* Mark same BASE register as coalesced. */ | 2529 | rset_clear(allow, r); /* Mark same BASE register as coalesced. */ |
diff --git a/src/lj_cparse.c b/src/lj_cparse.c index 05767e61..fd998adc 100644 --- a/src/lj_cparse.c +++ b/src/lj_cparse.c | |||
@@ -1244,7 +1244,7 @@ static void cp_struct_layout(CPState *cp, CTypeID sid, CTInfo sattr) | |||
1244 | sinfo |= (info & (CTF_QUAL|CTF_VLA)); /* Merge pseudo-qualifiers. */ | 1244 | sinfo |= (info & (CTF_QUAL|CTF_VLA)); /* Merge pseudo-qualifiers. */ |
1245 | 1245 | ||
1246 | /* Check for size overflow and determine alignment. */ | 1246 | /* Check for size overflow and determine alignment. */ |
1247 | if (sz >= 0x20000000u || bofs + csz < bofs) { | 1247 | if (sz >= 0x20000000u || bofs + csz < bofs || (info & CTF_VLA)) { |
1248 | if (!(sz == CTSIZE_INVALID && ctype_isarray(info) && | 1248 | if (!(sz == CTSIZE_INVALID && ctype_isarray(info) && |
1249 | !(sinfo & CTF_UNION))) | 1249 | !(sinfo & CTF_UNION))) |
1250 | cp_err(cp, LJ_ERR_FFI_INVSIZE); | 1250 | cp_err(cp, LJ_ERR_FFI_INVSIZE); |
diff --git a/src/lj_record.c b/src/lj_record.c index 650763fe..5bd2d5db 100644 --- a/src/lj_record.c +++ b/src/lj_record.c | |||
@@ -764,7 +764,7 @@ void lj_record_ret(jit_State *J, BCReg rbase, ptrdiff_t gotresults) | |||
764 | (J->parent == 0 && J->exitno == 0 && | 764 | (J->parent == 0 && J->exitno == 0 && |
765 | !bc_isret(bc_op(J->cur.startins))))) { | 765 | !bc_isret(bc_op(J->cur.startins))))) { |
766 | /* NYI: specialize to frame type and return directly, not via RET*. */ | 766 | /* NYI: specialize to frame type and return directly, not via RET*. */ |
767 | for (i = -1; i < (ptrdiff_t)rbase; i++) | 767 | for (i = 0; i < (ptrdiff_t)rbase; i++) |
768 | J->base[i] = 0; /* Purge dead slots. */ | 768 | J->base[i] = 0; /* Purge dead slots. */ |
769 | J->maxslot = rbase + (BCReg)gotresults; | 769 | J->maxslot = rbase + (BCReg)gotresults; |
770 | lj_record_stop(J, LJ_TRLINK_RETURN, 0); /* Return to interpreter. */ | 770 | lj_record_stop(J, LJ_TRLINK_RETURN, 0); /* Return to interpreter. */ |
diff --git a/src/xedkbuild.bat b/src/xedkbuild.bat index adbce8be..240ec878 100644 --- a/src/xedkbuild.bat +++ b/src/xedkbuild.bat | |||
@@ -54,8 +54,8 @@ buildvm -m folddef -o lj_folddef.h lj_opt_fold.c | |||
54 | @if errorlevel 1 goto :BAD | 54 | @if errorlevel 1 goto :BAD |
55 | 55 | ||
56 | @rem ---- Cross compiler ---- | 56 | @rem ---- Cross compiler ---- |
57 | @set "LJCOMPILE=%XEDK%\bin\win32\cl /nologo /c /MT /O2 /W3 /GF /Gm- /GR- /GS- /Gy /openmp- /D_CRT_SECURE_NO_DEPRECATE /DNDEBUG /D_XBOX /D_LIB /DLUAJIT_USE_SYSMALLOC" | 57 | @set LJCOMPILE="%XEDK%\bin\win32\cl" /nologo /c /MT /O2 /W3 /GF /Gm- /GR- /GS- /Gy /openmp- /D_CRT_SECURE_NO_DEPRECATE /DNDEBUG /D_XBOX /D_LIB /DLUAJIT_USE_SYSMALLOC |
58 | @set "LJLIB=%XEDK%\bin\win32\lib /nologo" | 58 | @set LJLIB="%XEDK%\bin\win32\lib" /nologo |
59 | @set "INCLUDE=%XEDK%\include\xbox" | 59 | @set "INCLUDE=%XEDK%\include\xbox" |
60 | 60 | ||
61 | @if "%1" neq "debug" goto :NODEBUG | 61 | @if "%1" neq "debug" goto :NODEBUG |