diff options
author | Mike Pall <mike> | 2010-02-18 03:43:09 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2010-02-18 06:07:31 +0100 |
commit | 59f54be9d362514724b033d3f2959f215b05957f (patch) | |
tree | 62cc4cc8008ceed2f4b842c213fab384410de32f | |
parent | 2f300fb66a17e513669eb9cc3b4d85295a38a471 (diff) | |
download | luajit-59f54be9d362514724b033d3f2959f215b05957f.tar.gz luajit-59f54be9d362514724b033d3f2959f215b05957f.tar.bz2 luajit-59f54be9d362514724b033d3f2959f215b05957f.zip |
Update trace recorder infrastructure for hot calls.
-rw-r--r-- | src/lj_dispatch.c | 3 | ||||
-rw-r--r-- | src/lj_record.c | 19 | ||||
-rw-r--r-- | src/lj_trace.c | 10 |
3 files changed, 17 insertions, 15 deletions
diff --git a/src/lj_dispatch.c b/src/lj_dispatch.c index 7b3ff80b..83bb4fd8 100644 --- a/src/lj_dispatch.c +++ b/src/lj_dispatch.c | |||
@@ -414,7 +414,8 @@ ASMFunction LJ_FASTCALL lj_dispatch_call(lua_State *L, const BCIns *pc) | |||
414 | #if LJ_HASJIT | 414 | #if LJ_HASJIT |
415 | J->L = L; | 415 | J->L = L; |
416 | if ((uintptr_t)pc & 1) { /* Marker for hot call. */ | 416 | if ((uintptr_t)pc & 1) { /* Marker for hot call. */ |
417 | lj_trace_hot(J, (const BCIns *)((uintptr_t)pc & ~(uintptr_t)1)); | 417 | pc = (const BCIns *)((uintptr_t)pc & ~(uintptr_t)1); |
418 | lj_trace_hot(J, pc); | ||
418 | goto out; | 419 | goto out; |
419 | } else if (J->state != LJ_TRACE_IDLE && | 420 | } else if (J->state != LJ_TRACE_IDLE && |
420 | !(g->hookmask & (HOOK_GC|HOOK_VMEVENT))) { | 421 | !(g->hookmask & (HOOK_GC|HOOK_VMEVENT))) { |
diff --git a/src/lj_record.c b/src/lj_record.c index e5a8b208..f4bfd5f7 100644 --- a/src/lj_record.c +++ b/src/lj_record.c | |||
@@ -2248,6 +2248,11 @@ static const BCIns *rec_setup_root(jit_State *J) | |||
2248 | J->maxslot = ra; | 2248 | J->maxslot = ra; |
2249 | pc++; | 2249 | pc++; |
2250 | break; | 2250 | break; |
2251 | case BC_FUNCF: | ||
2252 | /* No bytecode range check for root traces started by a hot call. */ | ||
2253 | J->maxslot = J->pt->numparams; | ||
2254 | pc++; | ||
2255 | break; | ||
2251 | default: | 2256 | default: |
2252 | lua_assert(0); | 2257 | lua_assert(0); |
2253 | break; | 2258 | break; |
@@ -2370,15 +2375,11 @@ void lj_record_setup(jit_State *J) | |||
2370 | rec_stop(J, TRACE_INTERP); | 2375 | rec_stop(J, TRACE_INTERP); |
2371 | } else { /* Root trace. */ | 2376 | } else { /* Root trace. */ |
2372 | J->cur.root = 0; | 2377 | J->cur.root = 0; |
2373 | if (J->pc >= proto_bc(J->pt)) { /* Not a hot CALL? */ | 2378 | J->cur.startins = *J->pc; |
2374 | J->cur.startins = *J->pc; | 2379 | J->pc = rec_setup_root(J); |
2375 | J->pc = rec_setup_root(J); | 2380 | /* Note: the loop instruction itself is recorded at the end and not |
2376 | /* Note: the loop instruction itself is recorded at the end and not | 2381 | ** at the start! So snapshot #0 needs to point to the *next* instruction. |
2377 | ** at the start! So snapshot #0 needs to point to the *next* instruction. | 2382 | */ |
2378 | */ | ||
2379 | } else { | ||
2380 | J->cur.startins = BCINS_ABC(BC_CALL, 0, 0, 0); | ||
2381 | } | ||
2382 | lj_snap_add(J); | 2383 | lj_snap_add(J); |
2383 | if (bc_op(J->cur.startins) == BC_FORL) | 2384 | if (bc_op(J->cur.startins) == BC_FORL) |
2384 | rec_setup_forl(J, J->pc-1); | 2385 | rec_setup_forl(J, J->pc-1); |
diff --git a/src/lj_trace.c b/src/lj_trace.c index ae88f844..3773cffe 100644 --- a/src/lj_trace.c +++ b/src/lj_trace.c | |||
@@ -163,6 +163,7 @@ static void trace_unpatch(jit_State *J, Trace *T) | |||
163 | BCOp op = bc_op(T->startins); | 163 | BCOp op = bc_op(T->startins); |
164 | MSize pcofs = T->snap[0].mapofs + T->snap[0].nent; | 164 | MSize pcofs = T->snap[0].mapofs + T->snap[0].nent; |
165 | BCIns *pc = ((BCIns *)snap_pc(T->snapmap[pcofs])) - 1; | 165 | BCIns *pc = ((BCIns *)snap_pc(T->snapmap[pcofs])) - 1; |
166 | UNUSED(J); | ||
166 | switch (op) { | 167 | switch (op) { |
167 | case BC_FORL: | 168 | case BC_FORL: |
168 | lua_assert(bc_op(*pc) == BC_JFORI); | 169 | lua_assert(bc_op(*pc) == BC_JFORI); |
@@ -181,8 +182,9 @@ static void trace_unpatch(jit_State *J, Trace *T) | |||
181 | lua_assert(bc_op(*pc) == BC_JITERL && J->trace[bc_d(*pc)] == T); | 182 | lua_assert(bc_op(*pc) == BC_JITERL && J->trace[bc_d(*pc)] == T); |
182 | *pc = T->startins; | 183 | *pc = T->startins; |
183 | break; | 184 | break; |
184 | case BC_CALL: | 185 | case BC_FUNCF: |
185 | lj_trace_err(J, LJ_TRERR_NYILNKF); | 186 | lua_assert(bc_op(*pc) == BC_JFUNCF && J->trace[bc_d(*pc)] == T); |
187 | *pc = T->startins; | ||
186 | break; | 188 | break; |
187 | case BC_JMP: /* No need to unpatch branches in parent traces (yet). */ | 189 | case BC_JMP: /* No need to unpatch branches in parent traces (yet). */ |
188 | default: | 190 | default: |
@@ -384,6 +386,7 @@ static void trace_stop(jit_State *J) | |||
384 | /* fallthrough */ | 386 | /* fallthrough */ |
385 | case BC_LOOP: | 387 | case BC_LOOP: |
386 | case BC_ITERL: | 388 | case BC_ITERL: |
389 | case BC_FUNCF: | ||
387 | /* Patch bytecode of starting instruction in root trace. */ | 390 | /* Patch bytecode of starting instruction in root trace. */ |
388 | setbc_op(pc, (int)op+(int)BC_JLOOP-(int)BC_LOOP); | 391 | setbc_op(pc, (int)op+(int)BC_JLOOP-(int)BC_LOOP); |
389 | setbc_d(pc, J->curtrace); | 392 | setbc_d(pc, J->curtrace); |
@@ -391,9 +394,6 @@ static void trace_stop(jit_State *J) | |||
391 | J->cur.nextroot = pt->trace; | 394 | J->cur.nextroot = pt->trace; |
392 | pt->trace = (TraceNo1)J->curtrace; | 395 | pt->trace = (TraceNo1)J->curtrace; |
393 | break; | 396 | break; |
394 | case BC_CALL: | ||
395 | lj_trace_err(J, LJ_TRERR_NYILNKF); | ||
396 | break; | ||
397 | case BC_JMP: | 397 | case BC_JMP: |
398 | /* Patch exit branch in parent to side trace entry. */ | 398 | /* Patch exit branch in parent to side trace entry. */ |
399 | lua_assert(J->parent != 0 && J->cur.root != 0); | 399 | lua_assert(J->parent != 0 && J->cur.root != 0); |