aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pall <mike>2013-08-26 18:28:58 +0200
committerMike Pall <mike>2013-08-26 18:28:58 +0200
commit5120240b77e4544b9b7405b4849a6cc63cdbbe1e (patch)
tree40bb90b12d912924bc9abf1feb12347b8db6b520
parentb33e96f3522e96e816cc46470b19d121bf88cfc8 (diff)
downloadluajit-5120240b77e4544b9b7405b4849a6cc63cdbbe1e.tar.gz
luajit-5120240b77e4544b9b7405b4849a6cc63cdbbe1e.tar.bz2
luajit-5120240b77e4544b9b7405b4849a6cc63cdbbe1e.zip
Use g->jit_base for on/off-trace detection.
-rw-r--r--src/lj_ccallback.c2
-rw-r--r--src/lj_err.c2
-rw-r--r--src/lj_gc.c8
-rw-r--r--src/lj_obj.h4
-rw-r--r--src/lj_state.c9
-rw-r--r--src/vm_arm.dasc7
-rw-r--r--src/vm_mips.dasc10
-rw-r--r--src/vm_ppc.dasc7
-rw-r--r--src/vm_x86.dasc6
9 files changed, 31 insertions, 24 deletions
diff --git a/src/lj_ccallback.c b/src/lj_ccallback.c
index c975c88f..37f45bf5 100644
--- a/src/lj_ccallback.c
+++ b/src/lj_ccallback.c
@@ -529,7 +529,7 @@ lua_State * LJ_FASTCALL lj_ccallback_enter(CTState *cts, void *cf)
529 lua_State *L = cts->L; 529 lua_State *L = cts->L;
530 global_State *g = cts->g; 530 global_State *g = cts->g;
531 lua_assert(L != NULL); 531 lua_assert(L != NULL);
532 if (gcref(g->jit_L)) { 532 if (tvref(g->jit_base)) {
533 setstrV(L, L->top++, lj_err_str(L, LJ_ERR_FFI_BADCBACK)); 533 setstrV(L, L->top++, lj_err_str(L, LJ_ERR_FFI_BADCBACK));
534 if (g->panic) g->panic(L); 534 if (g->panic) g->panic(L);
535 exit(EXIT_FAILURE); 535 exit(EXIT_FAILURE);
diff --git a/src/lj_err.c b/src/lj_err.c
index 7ae87a82..3b44c984 100644
--- a/src/lj_err.c
+++ b/src/lj_err.c
@@ -453,7 +453,7 @@ LJ_NOINLINE void LJ_FASTCALL lj_err_throw(lua_State *L, int errcode)
453{ 453{
454 global_State *g = G(L); 454 global_State *g = G(L);
455 lj_trace_abort(g); 455 lj_trace_abort(g);
456 setgcrefnull(g->jit_L); 456 setmref(g->jit_base, NULL);
457 L->status = 0; 457 L->status = 0;
458#if LJ_UNWIND_EXT 458#if LJ_UNWIND_EXT
459 err_raise_ext(errcode); 459 err_raise_ext(errcode);
diff --git a/src/lj_gc.c b/src/lj_gc.c
index c9eaf21a..8dbf2090 100644
--- a/src/lj_gc.c
+++ b/src/lj_gc.c
@@ -475,7 +475,7 @@ static void gc_finalize(lua_State *L)
475 global_State *g = G(L); 475 global_State *g = G(L);
476 GCobj *o = gcnext(gcref(g->gc.mmudata)); 476 GCobj *o = gcnext(gcref(g->gc.mmudata));
477 cTValue *mo; 477 cTValue *mo;
478 lua_assert(gcref(g->jit_L) == NULL); /* Must not be called on trace. */ 478 lua_assert(tvref(g->jit_base) == NULL); /* Must not be called on trace. */
479 /* Unchain from list of userdata to be finalized. */ 479 /* Unchain from list of userdata to be finalized. */
480 if (o == gcref(g->gc.mmudata)) 480 if (o == gcref(g->gc.mmudata))
481 setgcrefnull(g->gc.mmudata); 481 setgcrefnull(g->gc.mmudata);
@@ -606,7 +606,7 @@ static size_t gc_onestep(lua_State *L)
606 g->gc.state = GCSatomic; /* End of mark phase. */ 606 g->gc.state = GCSatomic; /* End of mark phase. */
607 return 0; 607 return 0;
608 case GCSatomic: 608 case GCSatomic:
609 if (gcref(g->jit_L)) /* Don't run atomic phase on trace. */ 609 if (tvref(g->jit_base)) /* Don't run atomic phase on trace. */
610 return LJ_MAX_MEM; 610 return LJ_MAX_MEM;
611 atomic(g, L); 611 atomic(g, L);
612 g->gc.state = GCSsweepstring; /* Start of sweep phase. */ 612 g->gc.state = GCSsweepstring; /* Start of sweep phase. */
@@ -640,7 +640,7 @@ static size_t gc_onestep(lua_State *L)
640 } 640 }
641 case GCSfinalize: 641 case GCSfinalize:
642 if (gcref(g->gc.mmudata) != NULL) { 642 if (gcref(g->gc.mmudata) != NULL) {
643 if (gcref(g->jit_L)) /* Don't call finalizers on trace. */ 643 if (tvref(g->jit_base)) /* Don't call finalizers on trace. */
644 return LJ_MAX_MEM; 644 return LJ_MAX_MEM;
645 gc_finalize(L); /* Finalize one userdata object. */ 645 gc_finalize(L); /* Finalize one userdata object. */
646 if (g->gc.estimate > GCFINALIZECOST) 646 if (g->gc.estimate > GCFINALIZECOST)
@@ -697,7 +697,7 @@ void LJ_FASTCALL lj_gc_step_fixtop(lua_State *L)
697int LJ_FASTCALL lj_gc_step_jit(global_State *g, MSize steps) 697int LJ_FASTCALL lj_gc_step_jit(global_State *g, MSize steps)
698{ 698{
699 lua_State *L = gco2th(gcref(g->jit_L)); 699 lua_State *L = gco2th(gcref(g->jit_L));
700 L->base = mref(G(L)->jit_base, TValue); 700 L->base = tvref(G(L)->jit_base);
701 L->top = curr_topL(L); 701 L->top = curr_topL(L);
702 while (steps-- > 0 && lj_gc_step(L) == 0) 702 while (steps-- > 0 && lj_gc_step(L) == 0)
703 ; 703 ;
diff --git a/src/lj_obj.h b/src/lj_obj.h
index 5a05f38d..e97acef0 100644
--- a/src/lj_obj.h
+++ b/src/lj_obj.h
@@ -536,8 +536,8 @@ typedef struct global_State {
536 lua_CFunction panic; /* Called as a last resort for errors. */ 536 lua_CFunction panic; /* Called as a last resort for errors. */
537 BCIns bc_cfunc_int; /* Bytecode for internal C function calls. */ 537 BCIns bc_cfunc_int; /* Bytecode for internal C function calls. */
538 BCIns bc_cfunc_ext; /* Bytecode for external C function calls. */ 538 BCIns bc_cfunc_ext; /* Bytecode for external C function calls. */
539 GCRef jit_L; /* Current JIT code lua_State or NULL. */ 539 GCRef jit_L; /* Current JIT code lua_State. */
540 MRef jit_base; /* Current JIT code L->base. */ 540 MRef jit_base; /* Current JIT code L->base or NULL. */
541 MRef ctype_state; /* Pointer to C type state. */ 541 MRef ctype_state; /* Pointer to C type state. */
542 GCRef gcroot[GCROOT_MAX]; /* GC roots. */ 542 GCRef gcroot[GCROOT_MAX]; /* GC roots. */
543} global_State; 543} global_State;
diff --git a/src/lj_state.c b/src/lj_state.c
index 604ff886..486e66e3 100644
--- a/src/lj_state.c
+++ b/src/lj_state.c
@@ -60,7 +60,7 @@ static void resizestack(lua_State *L, MSize n)
60 GCobj *up; 60 GCobj *up;
61 lua_assert((MSize)(tvref(L->maxstack)-oldst)==L->stacksize-LJ_STACK_EXTRA-1); 61 lua_assert((MSize)(tvref(L->maxstack)-oldst)==L->stacksize-LJ_STACK_EXTRA-1);
62 st = (TValue *)lj_mem_realloc(L, tvref(L->stack), 62 st = (TValue *)lj_mem_realloc(L, tvref(L->stack),
63 (MSize)(L->stacksize*sizeof(TValue)), 63 (MSize)(oldsize*sizeof(TValue)),
64 (MSize)(realsize*sizeof(TValue))); 64 (MSize)(realsize*sizeof(TValue)));
65 setmref(L->stack, st); 65 setmref(L->stack, st);
66 delta = (char *)st - (char *)oldst; 66 delta = (char *)st - (char *)oldst;
@@ -68,12 +68,12 @@ static void resizestack(lua_State *L, MSize n)
68 while (oldsize < realsize) /* Clear new slots. */ 68 while (oldsize < realsize) /* Clear new slots. */
69 setnilV(st + oldsize++); 69 setnilV(st + oldsize++);
70 L->stacksize = realsize; 70 L->stacksize = realsize;
71 if ((size_t)(mref(G(L)->jit_base, char) - (char *)oldst) < oldsize)
72 setmref(G(L)->jit_base, mref(G(L)->jit_base, char) + delta);
71 L->base = (TValue *)((char *)L->base + delta); 73 L->base = (TValue *)((char *)L->base + delta);
72 L->top = (TValue *)((char *)L->top + delta); 74 L->top = (TValue *)((char *)L->top + delta);
73 for (up = gcref(L->openupval); up != NULL; up = gcnext(up)) 75 for (up = gcref(L->openupval); up != NULL; up = gcnext(up))
74 setmref(gco2uv(up)->v, (TValue *)((char *)uvval(gco2uv(up)) + delta)); 76 setmref(gco2uv(up)->v, (TValue *)((char *)uvval(gco2uv(up)) + delta));
75 if (obj2gco(L) == gcref(G(L)->jit_L))
76 setmref(G(L)->jit_base, mref(G(L)->jit_base, char) + delta);
77} 77}
78 78
79/* Relimit stack after error, in case the limit was overdrawn. */ 79/* Relimit stack after error, in case the limit was overdrawn. */
@@ -90,7 +90,8 @@ void lj_state_shrinkstack(lua_State *L, MSize used)
90 return; /* Avoid stack shrinking while handling stack overflow. */ 90 return; /* Avoid stack shrinking while handling stack overflow. */
91 if (4*used < L->stacksize && 91 if (4*used < L->stacksize &&
92 2*(LJ_STACK_START+LJ_STACK_EXTRA) < L->stacksize && 92 2*(LJ_STACK_START+LJ_STACK_EXTRA) < L->stacksize &&
93 obj2gco(L) != gcref(G(L)->jit_L)) /* Don't shrink stack of live trace. */ 93 /* Don't shrink stack of live trace. */
94 (tvref(G(L)->jit_base) == NULL || obj2gco(L) != gcref(G(L)->jit_L)))
94 resizestack(L, L->stacksize >> 1); 95 resizestack(L, L->stacksize >> 1);
95} 96}
96 97
diff --git a/src/vm_arm.dasc b/src/vm_arm.dasc
index 83341e41..b235967f 100644
--- a/src/vm_arm.dasc
+++ b/src/vm_arm.dasc
@@ -2107,9 +2107,9 @@ static void build_subroutines(BuildCtx *ctx)
2107 | ldr BASE, [DISPATCH, #DISPATCH_GL(jit_base)] 2107 | ldr BASE, [DISPATCH, #DISPATCH_GL(jit_base)]
2108 | str CARG1, [DISPATCH, #DISPATCH_J(exitno)] 2108 | str CARG1, [DISPATCH, #DISPATCH_J(exitno)]
2109 | mov CARG4, #0 2109 | mov CARG4, #0
2110 | str L, [DISPATCH, #DISPATCH_J(L)]
2111 | str BASE, L->base 2110 | str BASE, L->base
2112 | str CARG4, [DISPATCH, #DISPATCH_GL(jit_L)] 2111 | str L, [DISPATCH, #DISPATCH_J(L)]
2112 | str CARG4, [DISPATCH, #DISPATCH_GL(jit_base)]
2113 | sub CARG1, DISPATCH, #-GG_DISP2J 2113 | sub CARG1, DISPATCH, #-GG_DISP2J
2114 | mov CARG2, sp 2114 | mov CARG2, sp
2115 | bl extern lj_trace_exit // (jit_State *J, ExitState *ex) 2115 | bl extern lj_trace_exit // (jit_State *J, ExitState *ex)
@@ -2133,8 +2133,9 @@ static void build_subroutines(BuildCtx *ctx)
2133 | ldr LFUNC:CARG2, [BASE, FRAME_FUNC] 2133 | ldr LFUNC:CARG2, [BASE, FRAME_FUNC]
2134 | str RC, SAVE_MULTRES 2134 | str RC, SAVE_MULTRES
2135 | mov CARG3, #0 2135 | mov CARG3, #0
2136 | str BASE, L->base
2136 | ldr CARG2, LFUNC:CARG2->field_pc 2137 | ldr CARG2, LFUNC:CARG2->field_pc
2137 | str CARG3, [DISPATCH, #DISPATCH_GL(jit_L)] 2138 | str CARG3, [DISPATCH, #DISPATCH_GL(jit_base)]
2138 | mv_vmstate CARG4, INTERP 2139 | mv_vmstate CARG4, INTERP
2139 | ldr KBASE, [CARG2, #PC2PROTO(k)] 2140 | ldr KBASE, [CARG2, #PC2PROTO(k)]
2140 | // Modified copy of ins_next which handles function header dispatch, too. 2141 | // Modified copy of ins_next which handles function header dispatch, too.
diff --git a/src/vm_mips.dasc b/src/vm_mips.dasc
index 41ed303d..aad4fccf 100644
--- a/src/vm_mips.dasc
+++ b/src/vm_mips.dasc
@@ -2046,13 +2046,14 @@ static void build_subroutines(BuildCtx *ctx)
2046 | st_vmstate 2046 | st_vmstate
2047 | sw TMP2, 16+32*8+29*4(sp) // Store sp in RID_SP. 2047 | sw TMP2, 16+32*8+29*4(sp) // Store sp in RID_SP.
2048 | lw L, DISPATCH_GL(jit_L)(DISPATCH) 2048 | lw L, DISPATCH_GL(jit_L)(DISPATCH)
2049 | lw BASE, DISPATCH_GL(jit_base)(DISPATCH) 2049 | lw BASE, DISPATCH_GL(jit_base)(DISPATCH)
2050 | load_got lj_trace_exit 2050 | load_got lj_trace_exit
2051 | sw L, DISPATCH_J(L)(DISPATCH) 2051 | sw L, DISPATCH_J(L)(DISPATCH)
2052 | sw ra, DISPATCH_J(parent)(DISPATCH) // Store trace number. 2052 | sw ra, DISPATCH_J(parent)(DISPATCH) // Store trace number.
2053 | sw BASE, L->base
2053 | sw TMP1, DISPATCH_J(exitno)(DISPATCH) // Store exit number. 2054 | sw TMP1, DISPATCH_J(exitno)(DISPATCH) // Store exit number.
2054 | addiu CARG1, DISPATCH, GG_DISP2J 2055 | addiu CARG1, DISPATCH, GG_DISP2J
2055 | sw BASE, L->base 2056 | sw r0, DISPATCH_GL(jit_base)(DISPATCH)
2056 | call_intern lj_trace_exit // (jit_State *J, ExitState *ex) 2057 | call_intern lj_trace_exit // (jit_State *J, ExitState *ex)
2057 |. addiu CARG2, sp, 16 2058 |. addiu CARG2, sp, 16
2058 | // Returns MULTRES (unscaled) or negated error code. 2059 | // Returns MULTRES (unscaled) or negated error code.
@@ -2068,7 +2069,8 @@ static void build_subroutines(BuildCtx *ctx)
2068 |.if JIT 2069 |.if JIT
2069 | // CRET1 = MULTRES or negated error code, BASE, PC and JGL set. 2070 | // CRET1 = MULTRES or negated error code, BASE, PC and JGL set.
2070 | lw L, SAVE_L 2071 | lw L, SAVE_L
2071 | addiu DISPATCH, JGL, -GG_DISP2G-32768 2072 | addiu DISPATCH, JGL, -GG_DISP2G-32768
2073 | sw BASE, L->base
2072 |1: 2074 |1:
2073 | bltz CRET1, >3 // Check for error from exit. 2075 | bltz CRET1, >3 // Check for error from exit.
2074 |. lw LFUNC:TMP1, FRAME_FUNC(BASE) 2076 |. lw LFUNC:TMP1, FRAME_FUNC(BASE)
@@ -2078,7 +2080,7 @@ static void build_subroutines(BuildCtx *ctx)
2078 | sw MULTRES, SAVE_MULTRES 2080 | sw MULTRES, SAVE_MULTRES
2079 | mtc1 TMP3, TOBIT 2081 | mtc1 TMP3, TOBIT
2080 | lw TMP1, LFUNC:TMP1->pc 2082 | lw TMP1, LFUNC:TMP1->pc
2081 | sw r0, DISPATCH_GL(jit_L)(DISPATCH) 2083 | sw r0, DISPATCH_GL(jit_base)(DISPATCH)
2082 | lw KBASE, PC2PROTO(k)(TMP1) 2084 | lw KBASE, PC2PROTO(k)(TMP1)
2083 | cvt.d.s TOBIT, TOBIT 2085 | cvt.d.s TOBIT, TOBIT
2084 | // Modified copy of ins_next which handles function header dispatch, too. 2086 | // Modified copy of ins_next which handles function header dispatch, too.
diff --git a/src/vm_ppc.dasc b/src/vm_ppc.dasc
index a7707ccc..d009d005 100644
--- a/src/vm_ppc.dasc
+++ b/src/vm_ppc.dasc
@@ -2542,9 +2542,9 @@ static void build_subroutines(BuildCtx *ctx)
2542 | srwi CARG3, CARG3, 2 2542 | srwi CARG3, CARG3, 2
2543 | stw L, DISPATCH_J(L)(DISPATCH) 2543 | stw L, DISPATCH_J(L)(DISPATCH)
2544 | subi CARG3, CARG3, 2 2544 | subi CARG3, CARG3, 2
2545 | stw TMP1, DISPATCH_GL(jit_L)(DISPATCH)
2546 | stw CARG4, DISPATCH_J(parent)(DISPATCH)
2547 | stp BASE, L->base 2545 | stp BASE, L->base
2546 | stw CARG4, DISPATCH_J(parent)(DISPATCH)
2547 | stw TMP1, DISPATCH_GL(jit_base)(DISPATCH)
2548 | addi CARG1, DISPATCH, GG_DISP2J 2548 | addi CARG1, DISPATCH, GG_DISP2J
2549 | stw CARG3, DISPATCH_J(exitno)(DISPATCH) 2549 | stw CARG3, DISPATCH_J(exitno)(DISPATCH)
2550 | addi CARG2, sp, 16 2550 | addi CARG2, sp, 16
@@ -2568,6 +2568,7 @@ static void build_subroutines(BuildCtx *ctx)
2568 | // CARG1 = MULTRES or negated error code, BASE, PC and JGL set. 2568 | // CARG1 = MULTRES or negated error code, BASE, PC and JGL set.
2569 | lwz L, SAVE_L 2569 | lwz L, SAVE_L
2570 | addi DISPATCH, JGL, -GG_DISP2G-32768 2570 | addi DISPATCH, JGL, -GG_DISP2G-32768
2571 | stp BASE, L->base
2571 |1: 2572 |1:
2572 | cmpwi CARG1, 0 2573 | cmpwi CARG1, 0
2573 | blt >3 // Check for error from exit. 2574 | blt >3 // Check for error from exit.
@@ -2576,7 +2577,7 @@ static void build_subroutines(BuildCtx *ctx)
2576 | li TMP2, 0 2577 | li TMP2, 0
2577 | stw MULTRES, SAVE_MULTRES 2578 | stw MULTRES, SAVE_MULTRES
2578 | lwz TMP1, LFUNC:TMP1->pc 2579 | lwz TMP1, LFUNC:TMP1->pc
2579 | stw TMP2, DISPATCH_GL(jit_L)(DISPATCH) 2580 | stw TMP2, DISPATCH_GL(jit_base)(DISPATCH)
2580 | lwz KBASE, PC2PROTO(k)(TMP1) 2581 | lwz KBASE, PC2PROTO(k)(TMP1)
2581 | // Setup type comparison constants. 2582 | // Setup type comparison constants.
2582 | li TISNUM, LJ_TISNUM 2583 | li TISNUM, LJ_TISNUM
diff --git a/src/vm_x86.dasc b/src/vm_x86.dasc
index 62a5e139..b8f1c449 100644
--- a/src/vm_x86.dasc
+++ b/src/vm_x86.dasc
@@ -2708,7 +2708,6 @@ static void build_subroutines(BuildCtx *ctx)
2708 | mov L:RB, [DISPATCH+DISPATCH_GL(jit_L)] 2708 | mov L:RB, [DISPATCH+DISPATCH_GL(jit_L)]
2709 | mov BASE, [DISPATCH+DISPATCH_GL(jit_base)] 2709 | mov BASE, [DISPATCH+DISPATCH_GL(jit_base)]
2710 | mov aword [DISPATCH+DISPATCH_J(L)], L:RBa 2710 | mov aword [DISPATCH+DISPATCH_J(L)], L:RBa
2711 | mov dword [DISPATCH+DISPATCH_GL(jit_L)], 0
2712 | mov L:RB->base, BASE 2711 | mov L:RB->base, BASE
2713 |.if X64WIN 2712 |.if X64WIN
2714 | lea CARG2, [rsp+4*8] 2713 | lea CARG2, [rsp+4*8]
@@ -2718,6 +2717,7 @@ static void build_subroutines(BuildCtx *ctx)
2718 | lea FCARG2, [esp+16] 2717 | lea FCARG2, [esp+16]
2719 |.endif 2718 |.endif
2720 | lea FCARG1, [DISPATCH+GG_DISP2J] 2719 | lea FCARG1, [DISPATCH+GG_DISP2J]
2720 | mov dword [DISPATCH+DISPATCH_GL(jit_base)], 0
2721 | call extern lj_trace_exit@8 // (jit_State *J, ExitState *ex) 2721 | call extern lj_trace_exit@8 // (jit_State *J, ExitState *ex)
2722 | // MULTRES or negated error code returned in eax (RD). 2722 | // MULTRES or negated error code returned in eax (RD).
2723 | mov RAa, L:RB->cframe 2723 | mov RAa, L:RB->cframe
@@ -2765,11 +2765,13 @@ static void build_subroutines(BuildCtx *ctx)
2765 | mov r12, TMPQ 2765 | mov r12, TMPQ
2766 |.endif 2766 |.endif
2767 | test RD, RD; js >3 // Check for error from exit. 2767 | test RD, RD; js >3 // Check for error from exit.
2768 | mov L:RB, SAVE_L
2768 | mov MULTRES, RD 2769 | mov MULTRES, RD
2769 | mov LFUNC:KBASE, [BASE-8] 2770 | mov LFUNC:KBASE, [BASE-8]
2770 | mov KBASE, LFUNC:KBASE->pc 2771 | mov KBASE, LFUNC:KBASE->pc
2771 | mov KBASE, [KBASE+PC2PROTO(k)] 2772 | mov KBASE, [KBASE+PC2PROTO(k)]
2772 | mov dword [DISPATCH+DISPATCH_GL(jit_L)], 0 2773 | mov L:RB->base, BASE
2774 | mov dword [DISPATCH+DISPATCH_GL(jit_base)], 0
2773 | set_vmstate INTERP 2775 | set_vmstate INTERP
2774 | // Modified copy of ins_next which handles function header dispatch, too. 2776 | // Modified copy of ins_next which handles function header dispatch, too.
2775 | mov RC, [PC] 2777 | mov RC, [PC]