aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/lj_asm_arm.h7
-rw-r--r--src/lj_asm_mips.h5
-rw-r--r--src/lj_asm_ppc.h5
-rw-r--r--src/lj_asm_x86.h5
-rw-r--r--src/lj_cparse.c2
-rw-r--r--src/lj_record.c2
-rw-r--r--src/xedkbuild.bat4
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