diff --git a/third_party/luajit/luajit/dynasm/dasm_mips.lua b/third_party/luajit/luajit/dynasm/dasm_mips.lua index 78a4e34..bd2a2b4 100644 --- a/third_party/luajit/luajit/dynasm/dasm_mips.lua +++ b/third_party/luajit/luajit/dynasm/dasm_mips.lua @@ -809,9 +809,9 @@ map_op[".template__"] = function(params, template, nparams) elseif p == "X" then op = op + parse_index(params[n]); n = n + 1 elseif p == "B" or p == "J" then - local mode, n, s = parse_label(params[n], false) - if p == "B" then n = n + 2048 end - waction("REL_"..mode, n, s, 1) + local mode, m, s = parse_label(params[n], false) + if p == "B" then m = m + 2048 end + waction("REL_"..mode, m, s, 1) n = n + 1 elseif p == "A" then op = op + parse_imm(params[n], 5, 6, 0, false); n = n + 1 diff --git a/third_party/luajit/luajit/dynasm/dasm_ppc.lua b/third_party/luajit/luajit/dynasm/dasm_ppc.lua index 4dc39da..4ead397 100644 --- a/third_party/luajit/luajit/dynasm/dasm_ppc.lua +++ b/third_party/luajit/luajit/dynasm/dasm_ppc.lua @@ -1729,9 +1729,9 @@ op_template = function(params, template, nparams) elseif p == "M" then op = op + parse_shiftmask(params[n], false); n = n + 1 elseif p == "J" or p == "K" then - local mode, n, s = parse_label(params[n], false) - if p == "K" then n = n + 2048 end - waction("REL_"..mode, n, s, 1) + local mode, m, s = parse_label(params[n], false) + if p == "K" then m = m + 2048 end + waction("REL_"..mode, m, s, 1) n = n + 1 elseif p == "0" then if band(shr(op, rs), 31) == 0 then werror("cannot use r0") end diff --git a/third_party/luajit/luajit/dynasm/dasm_x86.lua b/third_party/luajit/luajit/dynasm/dasm_x86.lua index 73502f6..7f536af 100644 --- a/third_party/luajit/luajit/dynasm/dasm_x86.lua +++ b/third_party/luajit/luajit/dynasm/dasm_x86.lua @@ -1537,8 +1537,8 @@ local map_op = { vrcpss_3 = "rrro:F30FV53rM|rrx/ood:", vrsqrtps_2 = "rmoy:0Fu52rM", vrsqrtss_3 = "rrro:F30FV52rM|rrx/ood:", - vroundpd_3 = "rmioy:660F3AV09rMU", - vroundps_3 = "rmioy:660F3AV08rMU", + vroundpd_3 = "rmioy:660F3Au09rMU", + vroundps_3 = "rmioy:660F3Au08rMU", vroundsd_4 = "rrrio:660F3AV0BrMU|rrxi/ooq:", vroundss_4 = "rrrio:660F3AV0ArMU|rrxi/ood:", vshufpd_4 = "rrmioy:660FVC6rMU", diff --git a/third_party/luajit/luajit/src/Makefile b/third_party/luajit/luajit/src/Makefile index dd32324..45bc8aa 100644 --- a/third_party/luajit/luajit/src/Makefile +++ b/third_party/luajit/luajit/src/Makefile @@ -165,6 +165,10 @@ else HOST_SYS= Windows HOST_MSYS= mingw endif + ifneq (,$(findstring MSYS,$(HOST_SYS))) + HOST_SYS= Windows + HOST_MSYS= mingw + endif ifneq (,$(findstring CYGWIN,$(HOST_SYS))) HOST_SYS= Windows HOST_MSYS= cygwin @@ -191,7 +195,7 @@ CCOPTIONS= $(CCDEBUG) $(ASOPTIONS) LDOPTIONS= $(CCDEBUG) $(LDFLAGS) HOST_CC= $(CC) -HOST_RM= rm -f +HOST_RM?= rm -f # If left blank, minilua is built and used. You can supply an installed # copy of (plain) Lua 5.1 or 5.2, plus Lua BitOp. E.g. with: HOST_LUA=lua HOST_LUA= diff --git a/third_party/luajit/luajit/src/lib_aux.c b/third_party/luajit/luajit/src/lib_aux.c index c40565c..2682a38 100644 --- a/third_party/luajit/luajit/src/lib_aux.c +++ b/third_party/luajit/luajit/src/lib_aux.c @@ -218,8 +218,15 @@ LUALIB_API char *luaL_prepbuffer(luaL_Buffer *B) LUALIB_API void luaL_addlstring(luaL_Buffer *B, const char *s, size_t l) { - while (l--) - luaL_addchar(B, *s++); + if (l <= bufffree(B)) { + memcpy(B->p, s, l); + B->p += l; + } else { + emptybuffer(B); + lua_pushlstring(B->L, s, l); + B->lvl++; + adjuststack(B); + } } LUALIB_API void luaL_addstring(luaL_Buffer *B, const char *s) diff --git a/third_party/luajit/luajit/src/lib_os.c b/third_party/luajit/luajit/src/lib_os.c index 9e78d49..ffbc3fd 100644 --- a/third_party/luajit/luajit/src/lib_os.c +++ b/third_party/luajit/luajit/src/lib_os.c @@ -205,12 +205,12 @@ LJLIB_CF(os_date) setboolfield(L, "isdst", stm->tm_isdst); } else if (*s) { SBuf *sb = &G(L)->tmpbuf; - MSize sz = 0; + MSize sz = 0, retry = 4; const char *q; for (q = s; *q; q++) sz += (*q == '%') ? 30 : 1; /* Overflow doesn't matter. */ setsbufL(sb, L); - for (;;) { + while (retry--) { /* Limit growth for invalid format or empty result. */ char *buf = lj_buf_need(sb, sz); size_t len = strftime(buf, sbufsz(sb), s, stm); if (len) { diff --git a/third_party/luajit/luajit/src/lj_alloc.c b/third_party/luajit/luajit/src/lj_alloc.c index f3b6a54..33a2eb8 100644 --- a/third_party/luajit/luajit/src/lj_alloc.c +++ b/third_party/luajit/luajit/src/lj_alloc.c @@ -255,7 +255,8 @@ static void *mmap_probe(size_t size) for (retry = 0; retry < LJ_ALLOC_MMAP_PROBE_MAX; retry++) { void *p = mmap((void *)hint_addr, size, MMAP_PROT, MMAP_FLAGS_PROBE, -1, 0); uintptr_t addr = (uintptr_t)p; - if ((addr >> LJ_ALLOC_MBITS) == 0 && addr >= LJ_ALLOC_MMAP_PROBE_LOWER) { + if ((addr >> LJ_ALLOC_MBITS) == 0 && addr >= LJ_ALLOC_MMAP_PROBE_LOWER && + ((addr + size) >> LJ_ALLOC_MBITS) == 0) { /* We got a suitable address. Bump the hint address. */ hint_addr = addr + size; errno = olderr; diff --git a/third_party/luajit/luajit/src/lj_jit.h b/third_party/luajit/luajit/src/lj_jit.h index 8e1ebda..bcbbc37 100644 --- a/third_party/luajit/luajit/src/lj_jit.h +++ b/third_party/luajit/luajit/src/lj_jit.h @@ -166,7 +166,7 @@ typedef struct MCLink { /* Stack snapshot header. */ typedef struct SnapShot { - uint16_t mapofs; /* Offset into snapshot map. */ + uint32_t mapofs; /* Offset into snapshot map. */ IRRef1 ref; /* First IR ref for this snapshot. */ uint8_t nslots; /* Number of valid slots. */ uint8_t topslot; /* Maximum frame extent. */ @@ -233,8 +233,7 @@ typedef enum { /* Trace object. */ typedef struct GCtrace { GCHeader; - uint8_t topslot; /* Top stack slot already checked to be allocated. */ - uint8_t linktype; /* Type of link. */ + uint16_t nsnap; /* Number of snapshots. */ IRRef nins; /* Next IR instruction. Biased with REF_BIAS. */ #if LJ_GC64 uint32_t unused_gc64; @@ -242,8 +241,7 @@ typedef struct GCtrace { GCRef gclist; IRIns *ir; /* IR instructions/constants. Biased with REF_BIAS. */ IRRef nk; /* Lowest IR constant. Biased with REF_BIAS. */ - uint16_t nsnap; /* Number of snapshots. */ - uint16_t nsnapmap; /* Number of snapshot map elements. */ + uint32_t nsnapmap; /* Number of snapshot map elements. */ SnapShot *snap; /* Snapshot array. */ SnapEntry *snapmap; /* Snapshot map. */ GCRef startpt; /* Starting prototype. */ @@ -260,6 +258,8 @@ typedef struct GCtrace { TraceNo1 nextroot; /* Next root trace for same prototype. */ TraceNo1 nextside; /* Next side trace of same root trace. */ uint8_t sinktags; /* Trace has SINK tags. */ + uint8_t topslot; /* Top stack slot already checked to be allocated. */ + uint8_t linktype; /* Type of link. */ uint8_t unused1; #ifdef LUAJIT_USE_GDBJIT void *gdbjit_entry; /* GDB JIT entry. */ diff --git a/third_party/luajit/luajit/src/lj_opt_loop.c b/third_party/luajit/luajit/src/lj_opt_loop.c index 04c6d06..441b8ad 100644 --- a/third_party/luajit/luajit/src/lj_opt_loop.c +++ b/third_party/luajit/luajit/src/lj_opt_loop.c @@ -223,7 +223,7 @@ static void loop_subst_snap(jit_State *J, SnapShot *osnap, } J->guardemit.irt = 0; /* Setup new snapshot. */ - snap->mapofs = (uint16_t)nmapofs; + snap->mapofs = (uint32_t)nmapofs; snap->ref = (IRRef1)J->cur.nins; snap->nslots = nslots; snap->topslot = osnap->topslot; @@ -251,7 +251,7 @@ static void loop_subst_snap(jit_State *J, SnapShot *osnap, nmap += nn; while (omap < nextmap) /* Copy PC + frame links. */ *nmap++ = *omap++; - J->cur.nsnapmap = (uint16_t)(nmap - J->cur.snapmap); + J->cur.nsnapmap = (uint32_t)(nmap - J->cur.snapmap); } typedef struct LoopState { @@ -369,7 +369,7 @@ static void loop_unroll(LoopState *lps) } } if (!irt_isguard(J->guardemit)) /* Drop redundant snapshot. */ - J->cur.nsnapmap = (uint16_t)J->cur.snap[--J->cur.nsnap].mapofs; + J->cur.nsnapmap = (uint32_t)J->cur.snap[--J->cur.nsnap].mapofs; lua_assert(J->cur.nsnapmap <= J->sizesnapmap); *psentinel = J->cur.snapmap[J->cur.snap[0].nent]; /* Restore PC. */ @@ -383,7 +383,7 @@ static void loop_undo(jit_State *J, IRRef ins, SnapNo nsnap, MSize nsnapmap) SnapShot *snap = &J->cur.snap[nsnap-1]; SnapEntry *map = J->cur.snapmap; map[snap->mapofs + snap->nent] = map[J->cur.snap[0].nent]; /* Restore PC. */ - J->cur.nsnapmap = (uint16_t)nsnapmap; + J->cur.nsnapmap = (uint32_t)nsnapmap; J->cur.nsnap = nsnap; J->guardemit.irt = 0; lj_ir_rollback(J, ins); diff --git a/third_party/luajit/luajit/src/lj_record.c b/third_party/luajit/luajit/src/lj_record.c index 1a2b1c5..7f37d6c 100644 --- a/third_party/luajit/luajit/src/lj_record.c +++ b/third_party/luajit/luajit/src/lj_record.c @@ -2470,8 +2470,9 @@ void lj_record_ins(jit_State *J) #undef rbv #undef rcv - /* Limit the number of recorded IR instructions. */ - if (J->cur.nins > REF_FIRST+(IRRef)J->param[JIT_P_maxrecord]) + /* Limit the number of recorded IR instructions and constants. */ + if (J->cur.nins > REF_FIRST+(IRRef)J->param[JIT_P_maxrecord] || + J->cur.nk < REF_BIAS-(IRRef)J->param[JIT_P_maxirconst]) lj_trace_err(J, LJ_TRERR_TRACEOV); } diff --git a/third_party/luajit/luajit/src/lj_snap.c b/third_party/luajit/luajit/src/lj_snap.c index 44fa379..ceaf2ca 100644 --- a/third_party/luajit/luajit/src/lj_snap.c +++ b/third_party/luajit/luajit/src/lj_snap.c @@ -161,11 +161,11 @@ static void snapshot_stack(jit_State *J, SnapShot *snap, MSize nsnapmap) nent = snapshot_slots(J, p, nslots); snap->nent = (uint8_t)nent; nent += snapshot_framelinks(J, p + nent, &snap->topslot); - snap->mapofs = (uint16_t)nsnapmap; + snap->mapofs = (uint32_t)nsnapmap; snap->ref = (IRRef1)J->cur.nins; snap->nslots = (uint8_t)nslots; snap->count = 0; - J->cur.nsnapmap = (uint16_t)(nsnapmap + nent); + J->cur.nsnapmap = (uint32_t)(nsnapmap + nent); } /* Add or merge a snapshot. */ @@ -326,7 +326,7 @@ void lj_snap_shrink(jit_State *J) snap->nent = (uint8_t)m; nlim = J->cur.nsnapmap - snap->mapofs - 1; while (n <= nlim) map[m++] = map[n++]; /* Move PC + frame links down. */ - J->cur.nsnapmap = (uint16_t)(snap->mapofs + m); /* Free up space in map. */ + J->cur.nsnapmap = (uint32_t)(snap->mapofs + m); /* Free up space in map. */ } /* -- Snapshot access ----------------------------------------------------- */ diff --git a/third_party/luajit/luajit/src/lj_state.c b/third_party/luajit/luajit/src/lj_state.c index dff40ae..e10fd63 100644 --- a/third_party/luajit/luajit/src/lj_state.c +++ b/third_party/luajit/luajit/src/lj_state.c @@ -224,7 +224,6 @@ LUA_API lua_State *lua_newstate(lua_Alloc f, void *ud) close_state(L); return NULL; } - G2J(g)->prngstate = rand(); #ifdef LJ_TARGET_JUMPRANGE #if LJ_TARGET_MIPS /* Use the middle of the 256MB-aligned region. */ @@ -233,8 +232,10 @@ LUA_API lua_State *lua_newstate(lua_Alloc f, void *ud) #else uintptr_t target = (uintptr_t)(void *)lj_vm_exit_handler & ~(uintptr_t)0xffff; #endif +#ifdef LJ_HASJIT uintptr_t range = (1u << LJ_TARGET_JUMPRANGE) - (1u << 21); uintptr_t allocbase; + G2J(g)->prngstate = rand(); if (LJ_PRNG_BITS(G2J(g), 1)) { allocbase = (target - range > target) ? 0 : target - range; } else { diff --git a/third_party/luajit/luajit/src/vm_mips.dasc b/third_party/luajit/luajit/src/vm_mips.dasc index 1afd611..f324812 100644 --- a/third_party/luajit/luajit/src/vm_mips.dasc +++ b/third_party/luajit/luajit/src/vm_mips.dasc @@ -4317,7 +4317,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | ins_next2 | |7: // Possible table write barrier for the value. Skip valiswhite check. - | barrierback TAB:CARG2, TMP3, TMP0, <2 + | barrierback TAB:CARG2, TMP3, CRET1, <2 break; case BC_TSETM: diff --git a/third_party/luajit/luajit/src/vm_mips64.dasc b/third_party/luajit/luajit/src/vm_mips64.dasc index 0a3f8e5..1682c81 100644 --- a/third_party/luajit/luajit/src/vm_mips64.dasc +++ b/third_party/luajit/luajit/src/vm_mips64.dasc @@ -4263,7 +4263,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | ins_next2 | |7: // Possible table write barrier for the value. Skip valiswhite check. - | barrierback TAB:CARG2, TMP3, TMP0, <2 + | barrierback TAB:CARG2, TMP3, CRET1, <2 break; case BC_TSETM: