diff options
author | Mike Pall <mike> | 2015-01-03 15:04:38 +0100 |
---|---|---|
committer | Mike Pall <mike> | 2015-01-03 15:04:38 +0100 |
commit | 054e6abe37450344e20b373ec326055071029e9b (patch) | |
tree | d3abbe61e643f4f59797d2aea24cc3a0643df53b /src/lj_frame.h | |
parent | a13dfd66c3427f9cc94044f261a526042b0d02f5 (diff) | |
download | luajit-054e6abe37450344e20b373ec326055071029e9b.tar.gz luajit-054e6abe37450344e20b373ec326055071029e9b.tar.bz2 luajit-054e6abe37450344e20b373ec326055071029e9b.zip |
Add LJ_FR2 mode: Two-slot frame info.
Diffstat (limited to 'src/lj_frame.h')
-rw-r--r-- | src/lj_frame.h | 57 |
1 files changed, 54 insertions, 3 deletions
diff --git a/src/lj_frame.h b/src/lj_frame.h index 061b396c..226d74f1 100644 --- a/src/lj_frame.h +++ b/src/lj_frame.h | |||
@@ -11,7 +11,16 @@ | |||
11 | 11 | ||
12 | /* -- Lua stack frame ----------------------------------------------------- */ | 12 | /* -- Lua stack frame ----------------------------------------------------- */ |
13 | 13 | ||
14 | /* Frame type markers in callee function slot (callee base-1). */ | 14 | /* Frame type markers in LSB of PC (4-byte aligned) or delta (8-byte aligned: |
15 | ** | ||
16 | ** PC 00 Lua frame | ||
17 | ** delta 001 C frame | ||
18 | ** delta 010 Continuation frame | ||
19 | ** delta 011 Lua vararg frame | ||
20 | ** delta 101 cpcall() frame | ||
21 | ** delta 110 ff pcall() frame | ||
22 | ** delta 111 ff pcall() frame with active hook | ||
23 | */ | ||
15 | enum { | 24 | enum { |
16 | FRAME_LUA, FRAME_C, FRAME_CONT, FRAME_VARG, | 25 | FRAME_LUA, FRAME_C, FRAME_CONT, FRAME_VARG, |
17 | FRAME_LUAP, FRAME_CP, FRAME_PCALL, FRAME_PCALLH | 26 | FRAME_LUAP, FRAME_CP, FRAME_PCALL, FRAME_PCALLH |
@@ -21,12 +30,47 @@ enum { | |||
21 | #define FRAME_TYPEP (FRAME_TYPE|FRAME_P) | 30 | #define FRAME_TYPEP (FRAME_TYPE|FRAME_P) |
22 | 31 | ||
23 | /* Macros to access and modify Lua frames. */ | 32 | /* Macros to access and modify Lua frames. */ |
33 | #if LJ_FR2 | ||
34 | /* Two-slot frame info, required for 64 bit PC/GCRef: | ||
35 | ** | ||
36 | ** base-2 base-1 | base base+1 ... | ||
37 | ** [func PC/delta/ft] | [slots ...] | ||
38 | ** ^-- frame | ^-- base ^-- top | ||
39 | ** | ||
40 | ** Continuation frames: | ||
41 | ** | ||
42 | ** base-4 base-3 base-2 base-1 | base base+1 ... | ||
43 | ** [cont PC ] [func PC/delta/ft] | [slots ...] | ||
44 | ** ^-- frame | ^-- base ^-- top | ||
45 | */ | ||
46 | #define frame_gc(f) (gcval((f)-1)) | ||
47 | #define frame_ftsz(f) ((ptrdiff_t)(f)->ftsz) | ||
48 | #define frame_pc(f) ((const BCIns *)frame_ftsz(f)) | ||
49 | #define setframe_gc(f, p, tp) (setgcVraw((f)-1, (p), (tp))) | ||
50 | #define setframe_ftsz(f, sz) ((f)->ftsz = (sz)) | ||
51 | #define setframe_pc(f, pc) ((f)->ftsz = (int64_t)(intptr_t)(pc)) | ||
52 | #else | ||
53 | /* One-slot frame info, sufficient for 32 bit PC/GCRef: | ||
54 | ** | ||
55 | ** base-1 | base base+1 ... | ||
56 | ** lo hi | | ||
57 | ** [func | PC/delta/ft] | [slots ...] | ||
58 | ** ^-- frame | ^-- base ^-- top | ||
59 | ** | ||
60 | ** Continuation frames: | ||
61 | ** | ||
62 | ** base-2 base-1 | base base+1 ... | ||
63 | ** lo hi lo hi | | ||
64 | ** [cont | PC] [func | PC/delta/ft] | [slots ...] | ||
65 | ** ^-- frame | ^-- base ^-- top | ||
66 | */ | ||
24 | #define frame_gc(f) (gcref((f)->fr.func)) | 67 | #define frame_gc(f) (gcref((f)->fr.func)) |
25 | #define frame_ftsz(f) ((ptrdiff_t)(f)->fr.tp.ftsz) | 68 | #define frame_ftsz(f) ((ptrdiff_t)(f)->fr.tp.ftsz) |
26 | #define frame_pc(f) (mref((f)->fr.tp.pcr, const BCIns)) | 69 | #define frame_pc(f) (mref((f)->fr.tp.pcr, const BCIns)) |
27 | #define setframe_gc(f, p, tp) (setgcref((f)->fr.func, (p)), UNUSED(tp)) | 70 | #define setframe_gc(f, p, tp) (setgcref((f)->fr.func, (p)), UNUSED(tp)) |
28 | #define setframe_ftsz(f, sz) ((f)->fr.tp.ftsz = (int32_t)(sz)) | 71 | #define setframe_ftsz(f, sz) ((f)->fr.tp.ftsz = (int32_t)(sz)) |
29 | #define setframe_pc(f, pc) (setmref((f)->fr.tp.pcr, (pc))) | 72 | #define setframe_pc(f, pc) (setmref((f)->fr.tp.pcr, (pc))) |
73 | #endif | ||
30 | 74 | ||
31 | #define frame_type(f) (frame_ftsz(f) & FRAME_TYPE) | 75 | #define frame_type(f) (frame_ftsz(f) & FRAME_TYPE) |
32 | #define frame_typep(f) (frame_ftsz(f) & FRAME_TYPEP) | 76 | #define frame_typep(f) (frame_ftsz(f) & FRAME_TYPEP) |
@@ -42,9 +86,16 @@ enum { | |||
42 | 86 | ||
43 | enum { LJ_CONT_TAILCALL, LJ_CONT_FFI_CALLBACK }; /* Special continuations. */ | 87 | enum { LJ_CONT_TAILCALL, LJ_CONT_FFI_CALLBACK }; /* Special continuations. */ |
44 | 88 | ||
89 | #if LJ_FR2 | ||
90 | #define frame_contpc(f) (frame_pc((f)-2)) | ||
91 | #define frame_contv(f) (((f)-3)->u64) | ||
92 | #else | ||
45 | #define frame_contpc(f) (frame_pc((f)-1)) | 93 | #define frame_contpc(f) (frame_pc((f)-1)) |
46 | #define frame_contv(f) (((f)-1)->u32.lo) | 94 | #define frame_contv(f) (((f)-1)->u32.lo) |
47 | #if LJ_64 | 95 | #endif |
96 | #if LJ_FR2 | ||
97 | #define frame_contf(f) ((ASMFunction)(uintptr_t)((f)-3)->u64) | ||
98 | #elif LJ_64 | ||
48 | #define frame_contf(f) \ | 99 | #define frame_contf(f) \ |
49 | ((ASMFunction)(void *)((intptr_t)lj_vm_asm_begin + \ | 100 | ((ASMFunction)(void *)((intptr_t)lj_vm_asm_begin + \ |
50 | (intptr_t)(int32_t)((f)-1)->u32.lo)) | 101 | (intptr_t)(int32_t)((f)-1)->u32.lo)) |
@@ -54,7 +105,7 @@ enum { LJ_CONT_TAILCALL, LJ_CONT_FFI_CALLBACK }; /* Special continuations. */ | |||
54 | #define frame_iscont_fficb(f) \ | 105 | #define frame_iscont_fficb(f) \ |
55 | (LJ_HASFFI && frame_contv(f) == LJ_CONT_FFI_CALLBACK) | 106 | (LJ_HASFFI && frame_contv(f) == LJ_CONT_FFI_CALLBACK) |
56 | 107 | ||
57 | #define frame_prevl(f) ((f) - (1+bc_a(frame_pc(f)[-1]))) | 108 | #define frame_prevl(f) ((f) - (1+LJ_FR2+bc_a(frame_pc(f)[-1]))) |
58 | #define frame_prevd(f) ((TValue *)((char *)(f) - frame_sized(f))) | 109 | #define frame_prevd(f) ((TValue *)((char *)(f) - frame_sized(f))) |
59 | #define frame_prev(f) (frame_islua(f)?frame_prevl(f):frame_prevd(f)) | 110 | #define frame_prev(f) (frame_islua(f)?frame_prevl(f):frame_prevd(f)) |
60 | /* Note: this macro does not skip over FRAME_VARG. */ | 111 | /* Note: this macro does not skip over FRAME_VARG. */ |