aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2016-10-16 21:04:38 +0200
committerMike Pall <mike>2016-10-16 21:04:38 +0200
commit6a25014c1c33448cabdc013ccb9e5c4fc98a0238 (patch)
treec3c3bfc7ceadd3f38c02e31fa8754bfaea90c323
parent3f43f09413c49a1f4cffc0e060d755e84c5df85e (diff)
downloadluajit-6a25014c1c33448cabdc013ccb9e5c4fc98a0238.tar.gz
luajit-6a25014c1c33448cabdc013ccb9e5c4fc98a0238.tar.bz2
luajit-6a25014c1c33448cabdc013ccb9e5c4fc98a0238.zip
LJ_FR2: Fix slot 1 handling.
Contributed by Peter Cawley.
-rw-r--r--src/jit/dump.lua2
-rw-r--r--src/lj_record.c4
-rw-r--r--src/lj_snap.c16
3 files changed, 16 insertions, 6 deletions
diff --git a/src/jit/dump.lua b/src/jit/dump.lua
index fbadccec..a8bc2af2 100644
--- a/src/jit/dump.lua
+++ b/src/jit/dump.lua
@@ -338,6 +338,8 @@ local function formatk(tr, idx, sn)
338 elseif t == 21 then -- int64_t 338 elseif t == 21 then -- int64_t
339 s = sub(tostring(k), 1, -3) 339 s = sub(tostring(k), 1, -3)
340 if sub(s, 1, 1) ~= "-" then s = "+"..s end 340 if sub(s, 1, 1) ~= "-" then s = "+"..s end
341 elseif sn == 0x1057fff then -- SNAP(1, SNAP_FRAME | SNAP_NORESTORE, REF_NIL)
342 return "----" -- Special case for LJ_FR2 slot 1.
341 else 343 else
342 s = tostring(k) -- For primitives. 344 s = tostring(k) -- For primitives.
343 end 345 end
diff --git a/src/lj_record.c b/src/lj_record.c
index 48018f42..a858ffa9 100644
--- a/src/lj_record.c
+++ b/src/lj_record.c
@@ -105,7 +105,7 @@ static void rec_check_slots(jit_State *J)
105 lua_assert(tref_isfunc(tr)); 105 lua_assert(tref_isfunc(tr));
106#if LJ_FR2 106#if LJ_FR2
107 } else if (s == 1) { 107 } else if (s == 1) {
108 lua_assert(0); 108 lua_assert((tr & ~TREF_FRAME) == 0);
109#endif 109#endif
110 } else if ((tr & TREF_FRAME)) { 110 } else if ((tr & TREF_FRAME)) {
111 GCfunc *fn = gco2func(frame_gc(tv)); 111 GCfunc *fn = gco2func(frame_gc(tv));
@@ -747,7 +747,7 @@ void lj_record_tailcall(jit_State *J, BCReg func, ptrdiff_t nargs)
747 } 747 }
748 /* Move func + args down. */ 748 /* Move func + args down. */
749 if (LJ_FR2 && J->baseslot == 2) 749 if (LJ_FR2 && J->baseslot == 2)
750 J->base[func+1] = 0; 750 J->base[func+1] = TREF_FRAME;
751 memmove(&J->base[-1-LJ_FR2], &J->base[func], sizeof(TRef)*(J->maxslot+1+LJ_FR2)); 751 memmove(&J->base[-1-LJ_FR2], &J->base[func], sizeof(TRef)*(J->maxslot+1+LJ_FR2));
752 /* Note: the new TREF_FRAME is now at J->base[-1] (even for slot #0). */ 752 /* Note: the new TREF_FRAME is now at J->base[-1] (even for slot #0). */
753 /* Tailcalls can form a loop, so count towards the loop unroll limit. */ 753 /* Tailcalls can form a loop, so count towards the loop unroll limit. */
diff --git a/src/lj_snap.c b/src/lj_snap.c
index 48259972..8ca6deb7 100644
--- a/src/lj_snap.c
+++ b/src/lj_snap.c
@@ -69,9 +69,13 @@ static MSize snapshot_slots(jit_State *J, SnapEntry *map, BCReg nslots)
69 TRef tr = J->slot[s]; 69 TRef tr = J->slot[s];
70 IRRef ref = tref_ref(tr); 70 IRRef ref = tref_ref(tr);
71#if LJ_FR2 71#if LJ_FR2
72 if (s == 1) continue; 72 if (s == 1) { /* Ignore slot 1 in LJ_FR2 mode, except if tailcalled. */
73 if ((tr & TREF_FRAME))
74 map[n++] = SNAP(1, SNAP_FRAME | SNAP_NORESTORE, REF_NIL);
75 continue;
76 }
73 if ((tr & (TREF_FRAME | TREF_CONT)) && !ref) { 77 if ((tr & (TREF_FRAME | TREF_CONT)) && !ref) {
74 TValue *base = J->L->base - J->baseslot; 78 cTValue *base = J->L->base - J->baseslot;
75 tr = J->slot[s] = (tr & 0xff0000) | lj_ir_k64(J, IR_KNUM, base[s].u64); 79 tr = J->slot[s] = (tr & 0xff0000) | lj_ir_k64(J, IR_KNUM, base[s].u64);
76 ref = tref_ref(tr); 80 ref = tref_ref(tr);
77 } 81 }
@@ -470,7 +474,11 @@ void lj_snap_replay(jit_State *J, GCtrace *T)
470 goto setslot; 474 goto setslot;
471 bloomset(seen, ref); 475 bloomset(seen, ref);
472 if (irref_isk(ref)) { 476 if (irref_isk(ref)) {
473 tr = snap_replay_const(J, ir); 477 /* See special treatment of LJ_FR2 slot 1 in snapshot_slots() above. */
478 if (LJ_FR2 && (sn == SNAP(1, SNAP_FRAME | SNAP_NORESTORE, REF_NIL)))
479 tr = 0;
480 else
481 tr = snap_replay_const(J, ir);
474 } else if (!regsp_used(ir->prev)) { 482 } else if (!regsp_used(ir->prev)) {
475 pass23 = 1; 483 pass23 = 1;
476 lua_assert(s != 0); 484 lua_assert(s != 0);
@@ -484,7 +492,7 @@ void lj_snap_replay(jit_State *J, GCtrace *T)
484 } 492 }
485 setslot: 493 setslot:
486 J->slot[s] = tr | (sn&(SNAP_CONT|SNAP_FRAME)); /* Same as TREF_* flags. */ 494 J->slot[s] = tr | (sn&(SNAP_CONT|SNAP_FRAME)); /* Same as TREF_* flags. */
487 J->framedepth += ((sn & (SNAP_CONT|SNAP_FRAME)) && s); 495 J->framedepth += ((sn & (SNAP_CONT|SNAP_FRAME)) && (s != LJ_FR2));
488 if ((sn & SNAP_FRAME)) 496 if ((sn & SNAP_FRAME))
489 J->baseslot = s+1; 497 J->baseslot = s+1;
490 } 498 }