diff options
Diffstat (limited to 'src/lj_trace.c')
-rw-r--r-- | src/lj_trace.c | 48 |
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) | |||
237 | static void trace_flushroot(jit_State *J, GCtrace *T) | 239 | static 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) | |||
536 | static int trace_downrec(jit_State *J) | 542 | static 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); |