diff options
author | Mike Pall <mike> | 2017-06-07 19:36:46 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2017-06-07 19:36:46 +0200 |
commit | c7c3c4da432ddb543d4b0a9abbb245f11b26afd0 (patch) | |
tree | d153382bd0121bb289984d4270bd8f8cc9926144 /src | |
parent | 7381b620358c2561e8690149f1d25828fdad6675 (diff) | |
download | luajit-c7c3c4da432ddb543d4b0a9abbb245f11b26afd0.tar.gz luajit-c7c3c4da432ddb543d4b0a9abbb245f11b26afd0.tar.bz2 luajit-c7c3c4da432ddb543d4b0a9abbb245f11b26afd0.zip |
MIPS: Fix handling of spare long-range jump slots.
Contributed by Djordje Kovacevic and Stefan Pejic.
Diffstat (limited to 'src')
-rw-r--r-- | src/lj_asm_mips.h | 9 | ||||
-rw-r--r-- | src/lj_jit.h | 6 | ||||
-rw-r--r-- | src/lj_mcode.c | 6 |
3 files changed, 11 insertions, 10 deletions
diff --git a/src/lj_asm_mips.h b/src/lj_asm_mips.h index d0a1ca51..76311903 100644 --- a/src/lj_asm_mips.h +++ b/src/lj_asm_mips.h | |||
@@ -65,10 +65,9 @@ static Reg ra_alloc2(ASMState *as, IRIns *ir, RegSet allow) | |||
65 | static void asm_sparejump_setup(ASMState *as) | 65 | static void asm_sparejump_setup(ASMState *as) |
66 | { | 66 | { |
67 | MCode *mxp = as->mcbot; | 67 | MCode *mxp = as->mcbot; |
68 | /* Assumes sizeof(MCLink) == 8. */ | 68 | if (((uintptr_t)mxp & (LJ_PAGESIZE-1)) == sizeof(MCLink)) { |
69 | if (((uintptr_t)mxp & (LJ_PAGESIZE-1)) == 8) { | ||
70 | lua_assert(MIPSI_NOP == 0); | 69 | lua_assert(MIPSI_NOP == 0); |
71 | memset(mxp+2, 0, MIPS_SPAREJUMP*8); | 70 | memset(mxp, 0, MIPS_SPAREJUMP*2*sizeof(MCode)); |
72 | mxp += MIPS_SPAREJUMP*2; | 71 | mxp += MIPS_SPAREJUMP*2; |
73 | lua_assert(mxp < as->mctop); | 72 | lua_assert(mxp < as->mctop); |
74 | lj_mcode_sync(as->mcbot, mxp); | 73 | lj_mcode_sync(as->mcbot, mxp); |
@@ -1947,7 +1946,9 @@ void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno, MCode *target) | |||
1947 | if (!cstart) cstart = p-1; | 1946 | if (!cstart) cstart = p-1; |
1948 | } else { /* Branch out of range. Use spare jump slot in mcarea. */ | 1947 | } else { /* Branch out of range. Use spare jump slot in mcarea. */ |
1949 | int i; | 1948 | int i; |
1950 | for (i = 2; i < 2+MIPS_SPAREJUMP*2; i += 2) { | 1949 | for (i = (int)(sizeof(MCLink)/sizeof(MCode)); |
1950 | i < (int)(sizeof(MCLink)/sizeof(MCode)+MIPS_SPAREJUMP*2); | ||
1951 | i += 2) { | ||
1951 | if (mcarea[i] == tjump) { | 1952 | if (mcarea[i] == tjump) { |
1952 | delta = mcarea+i - p; | 1953 | delta = mcarea+i - p; |
1953 | goto patchbranch; | 1954 | goto patchbranch; |
diff --git a/src/lj_jit.h b/src/lj_jit.h index a2e8fd92..3f38d289 100644 --- a/src/lj_jit.h +++ b/src/lj_jit.h | |||
@@ -155,6 +155,12 @@ typedef uint8_t MCode; | |||
155 | typedef uint32_t MCode; | 155 | typedef uint32_t MCode; |
156 | #endif | 156 | #endif |
157 | 157 | ||
158 | /* Linked list of MCode areas. */ | ||
159 | typedef struct MCLink { | ||
160 | MCode *next; /* Next area. */ | ||
161 | size_t size; /* Size of current area. */ | ||
162 | } MCLink; | ||
163 | |||
158 | /* Stack snapshot header. */ | 164 | /* Stack snapshot header. */ |
159 | typedef struct SnapShot { | 165 | typedef struct SnapShot { |
160 | uint16_t mapofs; /* Offset into snapshot map. */ | 166 | uint16_t mapofs; /* Offset into snapshot map. */ |
diff --git a/src/lj_mcode.c b/src/lj_mcode.c index f0a1f699..5ea89f66 100644 --- a/src/lj_mcode.c +++ b/src/lj_mcode.c | |||
@@ -272,12 +272,6 @@ static void *mcode_alloc(jit_State *J, size_t sz) | |||
272 | 272 | ||
273 | /* -- MCode area management ----------------------------------------------- */ | 273 | /* -- MCode area management ----------------------------------------------- */ |
274 | 274 | ||
275 | /* Linked list of MCode areas. */ | ||
276 | typedef struct MCLink { | ||
277 | MCode *next; /* Next area. */ | ||
278 | size_t size; /* Size of current area. */ | ||
279 | } MCLink; | ||
280 | |||
281 | /* Allocate a new MCode area. */ | 275 | /* Allocate a new MCode area. */ |
282 | static void mcode_allocarea(jit_State *J) | 276 | static void mcode_allocarea(jit_State *J) |
283 | { | 277 | { |