diff options
| author | Mike Pall <mike> | 2011-01-17 01:20:10 +0100 |
|---|---|---|
| committer | Mike Pall <mike> | 2011-01-17 01:20:10 +0100 |
| commit | 66ba1e68aab23fa09fcbe84b79d4992c92440b0c (patch) | |
| tree | 6803a405c9a478edac3346cd8eb762b26a6dd314 /src | |
| parent | b2ff889c6e2bd637a906b7b81641faf5682f771e (diff) | |
| download | luajit-66ba1e68aab23fa09fcbe84b79d4992c92440b0c.tar.gz luajit-66ba1e68aab23fa09fcbe84b79d4992c92440b0c.tar.bz2 luajit-66ba1e68aab23fa09fcbe84b79d4992c92440b0c.zip | |
Add trace recorder infrastructure for instruction post-processing.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lj_jit.h | 10 | ||||
| -rw-r--r-- | src/lj_record.c | 20 | ||||
| -rw-r--r-- | src/lj_trace.c | 3 |
3 files changed, 32 insertions, 1 deletions
diff --git a/src/lj_jit.h b/src/lj_jit.h index 6c930034..55d6d0df 100644 --- a/src/lj_jit.h +++ b/src/lj_jit.h | |||
| @@ -104,9 +104,15 @@ typedef enum { | |||
| 104 | LJ_TRACE_START, /* New trace started. */ | 104 | LJ_TRACE_START, /* New trace started. */ |
| 105 | LJ_TRACE_END, /* End of trace. */ | 105 | LJ_TRACE_END, /* End of trace. */ |
| 106 | LJ_TRACE_ASM, /* Assemble trace. */ | 106 | LJ_TRACE_ASM, /* Assemble trace. */ |
| 107 | LJ_TRACE_ERR, /* Trace aborted with error. */ | 107 | LJ_TRACE_ERR /* Trace aborted with error. */ |
| 108 | } TraceState; | 108 | } TraceState; |
| 109 | 109 | ||
| 110 | /* Post-processing action. */ | ||
| 111 | typedef enum { | ||
| 112 | LJ_POST_NONE, /* No action. */ | ||
| 113 | LJ_POST_FIXGUARD /* Fixup and emit pending guard. */ | ||
| 114 | } PostProc; | ||
| 115 | |||
| 110 | /* Machine code type. */ | 116 | /* Machine code type. */ |
| 111 | typedef uint8_t MCode; | 117 | typedef uint8_t MCode; |
| 112 | 118 | ||
| @@ -284,6 +290,8 @@ typedef struct jit_State { | |||
| 284 | SnapEntry *snapmapbuf; /* Temp. snapshot map buffer. */ | 290 | SnapEntry *snapmapbuf; /* Temp. snapshot map buffer. */ |
| 285 | MSize sizesnapmap; /* Size of temp. snapshot map buffer. */ | 291 | MSize sizesnapmap; /* Size of temp. snapshot map buffer. */ |
| 286 | 292 | ||
| 293 | PostProc postproc; /* Required post-processing after execution. */ | ||
| 294 | |||
| 287 | GCRef *trace; /* Array of traces. */ | 295 | GCRef *trace; /* Array of traces. */ |
| 288 | TraceNo freetrace; /* Start of scan for next free trace. */ | 296 | TraceNo freetrace; /* Start of scan for next free trace. */ |
| 289 | MSize sizetrace; /* Size of trace array. */ | 297 | MSize sizetrace; /* Size of trace array. */ |
diff --git a/src/lj_record.c b/src/lj_record.c index dc3f3df0..1669fde1 100644 --- a/src/lj_record.c +++ b/src/lj_record.c | |||
| @@ -1365,6 +1365,26 @@ void lj_record_ins(jit_State *J) | |||
| 1365 | BCOp op; | 1365 | BCOp op; |
| 1366 | TRef ra, rb, rc; | 1366 | TRef ra, rb, rc; |
| 1367 | 1367 | ||
| 1368 | /* Perform post-processing action before recording the next instruction. */ | ||
| 1369 | if (LJ_UNLIKELY(J->postproc != LJ_POST_NONE)) { | ||
| 1370 | switch (J->postproc) { | ||
| 1371 | case LJ_POST_FIXGUARD: /* Fixup and emit pending guard. */ | ||
| 1372 | if (!tvistruecond(&J2G(J)->tmptv2)) { | ||
| 1373 | BCReg s; | ||
| 1374 | J->fold.ins.o ^= 1; /* Flip guard to opposite. */ | ||
| 1375 | for (s = 0; s < J->maxslot; s++) /* Fixup stack slot (if any). */ | ||
| 1376 | if (J->base[s] == TREF_TRUE && tvisfalse(&J->L->base[s])) { | ||
| 1377 | J->base[s] = TREF_FALSE; | ||
| 1378 | break; | ||
| 1379 | } | ||
| 1380 | } | ||
| 1381 | lj_opt_fold(J); /* Emit pending guard. */ | ||
| 1382 | break; | ||
| 1383 | default: lua_assert(0); break; | ||
| 1384 | } | ||
| 1385 | J->postproc = LJ_POST_NONE; | ||
| 1386 | } | ||
| 1387 | |||
| 1368 | /* Need snapshot before recording next bytecode (e.g. after a store). */ | 1388 | /* Need snapshot before recording next bytecode (e.g. after a store). */ |
| 1369 | if (J->needsnap) { | 1389 | if (J->needsnap) { |
| 1370 | J->needsnap = 0; | 1390 | J->needsnap = 0; |
diff --git a/src/lj_trace.c b/src/lj_trace.c index c508c02a..421278e1 100644 --- a/src/lj_trace.c +++ b/src/lj_trace.c | |||
| @@ -388,6 +388,7 @@ static void trace_start(jit_State *J) | |||
| 388 | J->needsnap = 0; | 388 | J->needsnap = 0; |
| 389 | J->bcskip = 0; | 389 | J->bcskip = 0; |
| 390 | J->guardemit.irt = 0; | 390 | J->guardemit.irt = 0; |
| 391 | J->postproc = LJ_POST_NONE; | ||
| 391 | setgcref(J->cur.startpt, obj2gco(J->pt)); | 392 | setgcref(J->cur.startpt, obj2gco(J->pt)); |
| 392 | 393 | ||
| 393 | L = J->L; | 394 | L = J->L; |
| @@ -454,6 +455,7 @@ static void trace_stop(jit_State *J) | |||
| 454 | 455 | ||
| 455 | /* Commit new mcode only after all patching is done. */ | 456 | /* Commit new mcode only after all patching is done. */ |
| 456 | lj_mcode_commit(J, J->cur.mcode); | 457 | lj_mcode_commit(J, J->cur.mcode); |
| 458 | J->postproc = LJ_POST_NONE; | ||
| 457 | trace_save(J); | 459 | trace_save(J); |
| 458 | 460 | ||
| 459 | L = J->L; | 461 | L = J->L; |
| @@ -485,6 +487,7 @@ static int trace_abort(jit_State *J) | |||
| 485 | TraceError e = LJ_TRERR_RECERR; | 487 | TraceError e = LJ_TRERR_RECERR; |
| 486 | TraceNo traceno; | 488 | TraceNo traceno; |
| 487 | 489 | ||
| 490 | J->postproc = LJ_POST_NONE; | ||
| 488 | lj_mcode_abort(J); | 491 | lj_mcode_abort(J); |
| 489 | if (tvisnum(L->top-1)) | 492 | if (tvisnum(L->top-1)) |
| 490 | e = (TraceError)lj_num2int(numV(L->top-1)); | 493 | e = (TraceError)lj_num2int(numV(L->top-1)); |
