aboutsummaryrefslogtreecommitdiff
path: root/src/lj_trace.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_trace.c')
-rw-r--r--src/lj_trace.c48
1 files changed, 27 insertions, 21 deletions
diff --git a/src/lj_trace.c b/src/lj_trace.c
index a43c8c4e..c4e728c6 100644
--- a/src/lj_trace.c
+++ b/src/lj_trace.c
@@ -104,7 +104,8 @@ static void perftools_addtrace(GCtrace *T)
104 name++; 104 name++;
105 else 105 else
106 name = "(string)"; 106 name = "(string)";
107 lua_assert(startpc >= proto_bc(pt) && startpc < proto_bc(pt) + pt->sizebc); 107 lj_assertX(startpc >= proto_bc(pt) && startpc < proto_bc(pt) + pt->sizebc,
108 "trace PC out of range");
108 lineno = lj_debug_line(pt, proto_bcpos(pt, startpc)); 109 lineno = lj_debug_line(pt, proto_bcpos(pt, startpc));
109 if (!fp) { 110 if (!fp) {
110 char fname[40]; 111 char fname[40];
@@ -183,7 +184,7 @@ void lj_trace_reenableproto(GCproto *pt)
183{ 184{
184 if ((pt->flags & PROTO_ILOOP)) { 185 if ((pt->flags & PROTO_ILOOP)) {
185 BCIns *bc = proto_bc(pt); 186 BCIns *bc = proto_bc(pt);
186 BCPos i, sizebc = pt->sizebc;; 187 BCPos i, sizebc = pt->sizebc;
187 pt->flags &= ~PROTO_ILOOP; 188 pt->flags &= ~PROTO_ILOOP;
188 if (bc_op(bc[0]) == BC_IFUNCF) 189 if (bc_op(bc[0]) == BC_IFUNCF)
189 setbc_op(&bc[0], BC_FUNCF); 190 setbc_op(&bc[0], BC_FUNCF);
@@ -205,27 +206,28 @@ static void trace_unpatch(jit_State *J, GCtrace *T)
205 return; /* No need to unpatch branches in parent traces (yet). */ 206 return; /* No need to unpatch branches in parent traces (yet). */
206 switch (bc_op(*pc)) { 207 switch (bc_op(*pc)) {
207 case BC_JFORL: 208 case BC_JFORL:
208 lua_assert(traceref(J, bc_d(*pc)) == T); 209 lj_assertJ(traceref(J, bc_d(*pc)) == T, "JFORL references other trace");
209 *pc = T->startins; 210 *pc = T->startins;
210 pc += bc_j(T->startins); 211 pc += bc_j(T->startins);
211 lua_assert(bc_op(*pc) == BC_JFORI); 212 lj_assertJ(bc_op(*pc) == BC_JFORI, "FORL does not point to JFORI");
212 setbc_op(pc, BC_FORI); 213 setbc_op(pc, BC_FORI);
213 break; 214 break;
214 case BC_JITERL: 215 case BC_JITERL:
215 case BC_JLOOP: 216 case BC_JLOOP:
216 lua_assert(op == BC_ITERL || op == BC_LOOP || bc_isret(op)); 217 lj_assertJ(op == BC_ITERL || op == BC_LOOP || bc_isret(op),
218 "bad original bytecode %d", op);
217 *pc = T->startins; 219 *pc = T->startins;
218 break; 220 break;
219 case BC_JMP: 221 case BC_JMP:
220 lua_assert(op == BC_ITERL); 222 lj_assertJ(op == BC_ITERL, "bad original bytecode %d", op);
221 pc += bc_j(*pc)+2; 223 pc += bc_j(*pc)+2;
222 if (bc_op(*pc) == BC_JITERL) { 224 if (bc_op(*pc) == BC_JITERL) {
223 lua_assert(traceref(J, bc_d(*pc)) == T); 225 lj_assertJ(traceref(J, bc_d(*pc)) == T, "JITERL references other trace");
224 *pc = T->startins; 226 *pc = T->startins;
225 } 227 }
226 break; 228 break;
227 case BC_JFUNCF: 229 case BC_JFUNCF:
228 lua_assert(op == BC_FUNCF); 230 lj_assertJ(op == BC_FUNCF, "bad original bytecode %d", op);
229 *pc = T->startins; 231 *pc = T->startins;
230 break; 232 break;
231 default: /* Already unpatched. */ 233 default: /* Already unpatched. */
@@ -237,7 +239,8 @@ static void trace_unpatch(jit_State *J, GCtrace *T)
237static void trace_flushroot(jit_State *J, GCtrace *T) 239static void trace_flushroot(jit_State *J, GCtrace *T)
238{ 240{
239 GCproto *pt = &gcref(T->startpt)->pt; 241 GCproto *pt = &gcref(T->startpt)->pt;
240 lua_assert(T->root == 0 && pt != NULL); 242 lj_assertJ(T->root == 0, "not a root trace");
243 lj_assertJ(pt != NULL, "trace has no prototype");
241 /* First unpatch any modified bytecode. */ 244 /* First unpatch any modified bytecode. */
242 trace_unpatch(J, T); 245 trace_unpatch(J, T);
243 /* Unlink root trace from chain anchored in prototype. */ 246 /* Unlink root trace from chain anchored in prototype. */
@@ -353,7 +356,8 @@ void lj_trace_freestate(global_State *g)
353 { /* This assumes all traces have already been freed. */ 356 { /* This assumes all traces have already been freed. */
354 ptrdiff_t i; 357 ptrdiff_t i;
355 for (i = 1; i < (ptrdiff_t)J->sizetrace; i++) 358 for (i = 1; i < (ptrdiff_t)J->sizetrace; i++)
356 lua_assert(i == (ptrdiff_t)J->cur.traceno || traceref(J, i) == NULL); 359 lj_assertG(i == (ptrdiff_t)J->cur.traceno || traceref(J, i) == NULL,
360 "trace still allocated");
357 } 361 }
358#endif 362#endif
359 lj_mcode_free(J); 363 lj_mcode_free(J);
@@ -408,8 +412,9 @@ static void trace_start(jit_State *J)
408 if ((J->pt->flags & PROTO_NOJIT)) { /* JIT disabled for this proto? */ 412 if ((J->pt->flags & PROTO_NOJIT)) { /* JIT disabled for this proto? */
409 if (J->parent == 0 && J->exitno == 0) { 413 if (J->parent == 0 && J->exitno == 0) {
410 /* Lazy bytecode patching to disable hotcount events. */ 414 /* Lazy bytecode patching to disable hotcount events. */
411 lua_assert(bc_op(*J->pc) == BC_FORL || bc_op(*J->pc) == BC_ITERL || 415 lj_assertJ(bc_op(*J->pc) == BC_FORL || bc_op(*J->pc) == BC_ITERL ||
412 bc_op(*J->pc) == BC_LOOP || bc_op(*J->pc) == BC_FUNCF); 416 bc_op(*J->pc) == BC_LOOP || bc_op(*J->pc) == BC_FUNCF,
417 "bad hot bytecode %d", bc_op(*J->pc));
413 setbc_op(J->pc, (int)bc_op(*J->pc)+(int)BC_ILOOP-(int)BC_LOOP); 418 setbc_op(J->pc, (int)bc_op(*J->pc)+(int)BC_ILOOP-(int)BC_LOOP);
414 J->pt->flags |= PROTO_ILOOP; 419 J->pt->flags |= PROTO_ILOOP;
415 } 420 }
@@ -420,7 +425,8 @@ static void trace_start(jit_State *J)
420 /* Get a new trace number. */ 425 /* Get a new trace number. */
421 traceno = trace_findfree(J); 426 traceno = trace_findfree(J);
422 if (LJ_UNLIKELY(traceno == 0)) { /* No free trace? */ 427 if (LJ_UNLIKELY(traceno == 0)) { /* No free trace? */
423 lua_assert((J2G(J)->hookmask & HOOK_GC) == 0); 428 lj_assertJ((J2G(J)->hookmask & HOOK_GC) == 0,
429 "recorder called from GC hook");
424 lj_trace_flushall(J->L); 430 lj_trace_flushall(J->L);
425 J->state = LJ_TRACE_IDLE; /* Silently ignored. */ 431 J->state = LJ_TRACE_IDLE; /* Silently ignored. */
426 return; 432 return;
@@ -496,7 +502,7 @@ static void trace_stop(jit_State *J)
496 goto addroot; 502 goto addroot;
497 case BC_JMP: 503 case BC_JMP:
498 /* Patch exit branch in parent to side trace entry. */ 504 /* Patch exit branch in parent to side trace entry. */
499 lua_assert(J->parent != 0 && J->cur.root != 0); 505 lj_assertJ(J->parent != 0 && J->cur.root != 0, "not a side trace");
500 lj_asm_patchexit(J, traceref(J, J->parent), J->exitno, J->cur.mcode); 506 lj_asm_patchexit(J, traceref(J, J->parent), J->exitno, J->cur.mcode);
501 /* Avoid compiling a side trace twice (stack resizing uses parent exit). */ 507 /* Avoid compiling a side trace twice (stack resizing uses parent exit). */
502 traceref(J, J->parent)->snap[J->exitno].count = SNAPCOUNT_DONE; 508 traceref(J, J->parent)->snap[J->exitno].count = SNAPCOUNT_DONE;
@@ -515,7 +521,7 @@ static void trace_stop(jit_State *J)
515 traceref(J, J->exitno)->link = traceno; 521 traceref(J, J->exitno)->link = traceno;
516 break; 522 break;
517 default: 523 default:
518 lua_assert(0); 524 lj_assertJ(0, "bad stop bytecode %d", op);
519 break; 525 break;
520 } 526 }
521 527
@@ -536,8 +542,8 @@ static void trace_stop(jit_State *J)
536static int trace_downrec(jit_State *J) 542static int trace_downrec(jit_State *J)
537{ 543{
538 /* Restart recording at the return instruction. */ 544 /* Restart recording at the return instruction. */
539 lua_assert(J->pt != NULL); 545 lj_assertJ(J->pt != NULL, "no active prototype");
540 lua_assert(bc_isret(bc_op(*J->pc))); 546 lj_assertJ(bc_isret(bc_op(*J->pc)), "not at a return bytecode");
541 if (bc_op(*J->pc) == BC_RETM) 547 if (bc_op(*J->pc) == BC_RETM)
542 return 0; /* NYI: down-recursion with RETM. */ 548 return 0; /* NYI: down-recursion with RETM. */
543 J->parent = 0; 549 J->parent = 0;
@@ -750,7 +756,7 @@ static void trace_hotside(jit_State *J, const BCIns *pc)
750 isluafunc(curr_func(J->L)) && 756 isluafunc(curr_func(J->L)) &&
751 snap->count != SNAPCOUNT_DONE && 757 snap->count != SNAPCOUNT_DONE &&
752 ++snap->count >= J->param[JIT_P_hotexit]) { 758 ++snap->count >= J->param[JIT_P_hotexit]) {
753 lua_assert(J->state == LJ_TRACE_IDLE); 759 lj_assertJ(J->state == LJ_TRACE_IDLE, "hot side exit while recording");
754 /* J->parent is non-zero for a side trace. */ 760 /* J->parent is non-zero for a side trace. */
755 J->state = LJ_TRACE_START; 761 J->state = LJ_TRACE_START;
756 lj_trace_ins(J, pc); 762 lj_trace_ins(J, pc);
@@ -822,7 +828,7 @@ static TraceNo trace_exit_find(jit_State *J, MCode *pc)
822 if (T && pc >= T->mcode && pc < (MCode *)((char *)T->mcode + T->szmcode)) 828 if (T && pc >= T->mcode && pc < (MCode *)((char *)T->mcode + T->szmcode))
823 return traceno; 829 return traceno;
824 } 830 }
825 lua_assert(0); 831 lj_assertJ(0, "bad exit pc");
826 return 0; 832 return 0;
827} 833}
828#endif 834#endif
@@ -844,13 +850,13 @@ int LJ_FASTCALL lj_trace_exit(jit_State *J, void *exptr)
844 T = traceref(J, J->parent); UNUSED(T); 850 T = traceref(J, J->parent); UNUSED(T);
845#ifdef EXITSTATE_CHECKEXIT 851#ifdef EXITSTATE_CHECKEXIT
846 if (J->exitno == T->nsnap) { /* Treat stack check like a parent exit. */ 852 if (J->exitno == T->nsnap) { /* Treat stack check like a parent exit. */
847 lua_assert(T->root != 0); 853 lj_assertJ(T->root != 0, "stack check in root trace");
848 J->exitno = T->ir[REF_BASE].op2; 854 J->exitno = T->ir[REF_BASE].op2;
849 J->parent = T->ir[REF_BASE].op1; 855 J->parent = T->ir[REF_BASE].op1;
850 T = traceref(J, J->parent); 856 T = traceref(J, J->parent);
851 } 857 }
852#endif 858#endif
853 lua_assert(T != NULL && J->exitno < T->nsnap); 859 lj_assertJ(T != NULL && J->exitno < T->nsnap, "bad trace or exit number");
854 exd.J = J; 860 exd.J = J;
855 exd.exptr = exptr; 861 exd.exptr = exptr;
856 errcode = lj_vm_cpcall(L, NULL, &exd, trace_exit_cp); 862 errcode = lj_vm_cpcall(L, NULL, &exd, trace_exit_cp);