|
 |
006bc1 |
From c7c3c4da432ddb543d4b0a9abbb245f11b26afd0 Mon Sep 17 00:00:00 2001
|
|
 |
006bc1 |
From: Mike Pall <mike>
|
|
 |
006bc1 |
Date: Wed, 7 Jun 2017 19:36:46 +0200
|
|
 |
006bc1 |
Subject: [PATCH 04/72] MIPS: Fix handling of spare long-range jump slots.
|
|
 |
006bc1 |
|
|
 |
006bc1 |
Contributed by Djordje Kovacevic and Stefan Pejic.
|
|
 |
006bc1 |
---
|
|
 |
006bc1 |
src/lj_asm_mips.h | 9 +++++----
|
|
 |
006bc1 |
src/lj_jit.h | 6 ++++++
|
|
 |
006bc1 |
src/lj_mcode.c | 6 ------
|
|
 |
006bc1 |
3 files changed, 11 insertions(+), 10 deletions(-)
|
|
 |
006bc1 |
|
|
 |
006bc1 |
diff --git a/src/lj_asm_mips.h b/src/lj_asm_mips.h
|
|
 |
006bc1 |
index d0a1ca5..7631190 100644
|
|
 |
006bc1 |
--- a/src/lj_asm_mips.h
|
|
 |
006bc1 |
+++ b/src/lj_asm_mips.h
|
|
 |
006bc1 |
@@ -65,10 +65,9 @@ static Reg ra_alloc2(ASMState *as, IRIns *ir, RegSet allow)
|
|
 |
006bc1 |
static void asm_sparejump_setup(ASMState *as)
|
|
 |
006bc1 |
{
|
|
 |
006bc1 |
MCode *mxp = as->mcbot;
|
|
 |
006bc1 |
- /* Assumes sizeof(MCLink) == 8. */
|
|
 |
006bc1 |
- if (((uintptr_t)mxp & (LJ_PAGESIZE-1)) == 8) {
|
|
 |
006bc1 |
+ if (((uintptr_t)mxp & (LJ_PAGESIZE-1)) == sizeof(MCLink)) {
|
|
 |
006bc1 |
lua_assert(MIPSI_NOP == 0);
|
|
 |
006bc1 |
- memset(mxp+2, 0, MIPS_SPAREJUMP*8);
|
|
 |
006bc1 |
+ memset(mxp, 0, MIPS_SPAREJUMP*2*sizeof(MCode));
|
|
 |
006bc1 |
mxp += MIPS_SPAREJUMP*2;
|
|
 |
006bc1 |
lua_assert(mxp < as->mctop);
|
|
 |
006bc1 |
lj_mcode_sync(as->mcbot, mxp);
|
|
 |
006bc1 |
@@ -1947,7 +1946,9 @@ void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno, MCode *target)
|
|
 |
006bc1 |
if (!cstart) cstart = p-1;
|
|
 |
006bc1 |
} else { /* Branch out of range. Use spare jump slot in mcarea. */
|
|
 |
006bc1 |
int i;
|
|
 |
006bc1 |
- for (i = 2; i < 2+MIPS_SPAREJUMP*2; i += 2) {
|
|
 |
006bc1 |
+ for (i = (int)(sizeof(MCLink)/sizeof(MCode));
|
|
 |
006bc1 |
+ i < (int)(sizeof(MCLink)/sizeof(MCode)+MIPS_SPAREJUMP*2);
|
|
 |
006bc1 |
+ i += 2) {
|
|
 |
006bc1 |
if (mcarea[i] == tjump) {
|
|
 |
006bc1 |
delta = mcarea+i - p;
|
|
 |
006bc1 |
goto patchbranch;
|
|
 |
006bc1 |
diff --git a/src/lj_jit.h b/src/lj_jit.h
|
|
 |
006bc1 |
index a2e8fd9..3f38d28 100644
|
|
 |
006bc1 |
--- a/src/lj_jit.h
|
|
 |
006bc1 |
+++ b/src/lj_jit.h
|
|
 |
006bc1 |
@@ -155,6 +155,12 @@ typedef uint8_t MCode;
|
|
 |
006bc1 |
typedef uint32_t MCode;
|
|
 |
006bc1 |
#endif
|
|
 |
006bc1 |
|
|
 |
006bc1 |
+/* Linked list of MCode areas. */
|
|
 |
006bc1 |
+typedef struct MCLink {
|
|
 |
006bc1 |
+ MCode *next; /* Next area. */
|
|
 |
006bc1 |
+ size_t size; /* Size of current area. */
|
|
 |
006bc1 |
+} MCLink;
|
|
 |
006bc1 |
+
|
|
 |
006bc1 |
/* Stack snapshot header. */
|
|
 |
006bc1 |
typedef struct SnapShot {
|
|
 |
006bc1 |
uint16_t mapofs; /* Offset into snapshot map. */
|
|
 |
006bc1 |
diff --git a/src/lj_mcode.c b/src/lj_mcode.c
|
|
 |
006bc1 |
index f0a1f69..5ea89f6 100644
|
|
 |
006bc1 |
--- a/src/lj_mcode.c
|
|
 |
006bc1 |
+++ b/src/lj_mcode.c
|
|
 |
006bc1 |
@@ -272,12 +272,6 @@ static void *mcode_alloc(jit_State *J, size_t sz)
|
|
 |
006bc1 |
|
|
 |
006bc1 |
/* -- MCode area management ----------------------------------------------- */
|
|
 |
006bc1 |
|
|
 |
006bc1 |
-/* Linked list of MCode areas. */
|
|
 |
006bc1 |
-typedef struct MCLink {
|
|
 |
006bc1 |
- MCode *next; /* Next area. */
|
|
 |
006bc1 |
- size_t size; /* Size of current area. */
|
|
 |
006bc1 |
-} MCLink;
|
|
 |
006bc1 |
-
|
|
 |
006bc1 |
/* Allocate a new MCode area. */
|
|
 |
006bc1 |
static void mcode_allocarea(jit_State *J)
|
|
 |
006bc1 |
{
|
|
 |
006bc1 |
--
|
|
 |
006bc1 |
2.20.1
|
|
 |
006bc1 |
|