* [PR PATCH] LuaJIT: import upstream patch to support 64bit lightuserdata on aarch64
@ 2021-09-25 10:19 Johnnynator
2021-09-25 11:29 ` [PR PATCH] [Updated] " Johnnynator
2021-09-26 8:12 ` [PR PATCH] [Merged]: LuaJIT: import upstream patches to fix crashes " Johnnynator
0 siblings, 2 replies; 3+ messages in thread
From: Johnnynator @ 2021-09-25 10:19 UTC (permalink / raw)
To: ml
[-- Attachment #1: Type: text/plain, Size: 1768 bytes --]
There is a new pull request by Johnnynator against master on the void-packages repository
https://github.com/Johnnynator/void-packages luajit-aarch64
https://github.com/void-linux/void-packages/pull/33098
LuaJIT: import upstream patch to support 64bit lightuserdata on aarch64
without this e.g. luajit just crashes on native neovim builds and under
certain conditions also during runtime e.g. with nvim-cmp + nvim-cmp-lsp
<!-- Mark items with [x] where applicable -->
#### General
- [ ] This is a new package and it conforms to the [quality requirements](https://github.com/void-linux/void-packages/blob/master/Manual.md#quality-requirements)
#### Have the results of the proposed changes been tested?
- [ ] I use the packages affected by the proposed changes on a regular basis and confirm this PR works for me
- [ ] I generally don't use the affected packages but briefly tested this PR
<!--
If GitHub CI cannot be used to validate the build result (for example, if the
build is likely to take several hours), make sure to
[skip CI](https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#continuous-integration).
When skipping CI, uncomment and fill out the following section.
Note: for builds that are likely to complete in less than 2 hours, it is not
acceptable to skip CI.
-->
<!--
#### Does it build and run successfully?
(Please choose at least one native build and, if supported, at least one cross build. More are better.)
- [ ] I built this PR locally for my native architecture, (ARCH-LIBC)
- [ ] I built this PR locally for these architectures (if supported. mark crossbuilds):
- [ ] aarch64-musl
- [ ] armv7l
- [ ] armv6l-musl
-->
A patch file from https://github.com/void-linux/void-packages/pull/33098.patch is attached
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-luajit-aarch64-33098.patch --]
[-- Type: text/x-diff, Size: 21344 bytes --]
From a46ed4a0e1d5b83acd176aa505cde8183f50ec3a Mon Sep 17 00:00:00 2001
From: John <me@johnnynator.dev>
Date: Sat, 25 Sep 2021 12:12:27 +0200
Subject: [PATCH] LuaJIT: import upstream patch to support 64bit lightuserdata
on aarch64
without this e.g. luajit just crashes on native neovim builds and under
certain conditions also during runtime e.g. with nvim-cmp + nvim-cmp-lsp
---
...1abec542e6f9851ff2368e7f196b6382a44c.patch | 562 ++++++++++++++++++
srcpkgs/LuaJIT/template | 2 +-
2 files changed, 563 insertions(+), 1 deletion(-)
create mode 100644 srcpkgs/LuaJIT/patches/e9af1abec542e6f9851ff2368e7f196b6382a44c.patch
diff --git a/srcpkgs/LuaJIT/patches/e9af1abec542e6f9851ff2368e7f196b6382a44c.patch b/srcpkgs/LuaJIT/patches/e9af1abec542e6f9851ff2368e7f196b6382a44c.patch
new file mode 100644
index 000000000000..a217866c392c
--- /dev/null
+++ b/srcpkgs/LuaJIT/patches/e9af1abec542e6f9851ff2368e7f196b6382a44c.patch
@@ -0,0 +1,562 @@
+From e9af1abec542e6f9851ff2368e7f196b6382a44c Mon Sep 17 00:00:00 2001
+From: Mike Pall <mike>
+Date: Wed, 30 Sep 2020 01:31:27 +0200
+Subject: [PATCH] Add support for full-range 64 bit lightuserdata.
+
+---
+ doc/status.html | 11 ---------
+ src/jit/dump.lua | 4 +++-
+ src/lib_debug.c | 12 +++++-----
+ src/lib_jit.c | 14 ++++++------
+ src/lib_package.c | 8 +++----
+ src/lib_string.c | 2 +-
+ src/lj_api.c | 40 +++++++++++++++++++++++++++++----
+ src/lj_ccall.c | 2 +-
+ src/lj_cconv.c | 2 +-
+ src/lj_crecord.c | 6 ++---
+ src/lj_dispatch.c | 2 +-
+ src/lj_ir.c | 6 +++--
+ src/lj_obj.c | 5 +++--
+ src/lj_obj.h | 57 ++++++++++++++++++++++++++++++-----------------
+ src/lj_snap.c | 9 +++++++-
+ src/lj_state.c | 6 +++++
+ src/lj_strfmt.c | 2 +-
+ 17 files changed, 121 insertions(+), 67 deletions(-)
+
+#diff --git a/doc/status.html b/doc/status.html
+#index 0aafe13a2..fd0ae8bae 100644
+#--- a/doc/status.html
+#+++ b/doc/status.html
+#@@ -91,17 +91,6 @@ <h2>Current Status</h2>
+# <tt>lua_atpanic</tt> on x64. This issue will be fixed with the new
+# garbage collector.
+# </li>
+#-<li>
+#-LuaJIT on 64 bit systems provides a <b>limited range</b> of 47 bits for the
+#-<b>legacy <tt>lightuserdata</tt></b> data type.
+#-This is only relevant on x64 systems which use the negative part of the
+#-virtual address space in user mode, e.g. Solaris/x64, and on ARM64 systems
+#-configured with a 48 bit or 52 bit VA.
+#-Avoid using <tt>lightuserdata</tt> to hold pointers that may point outside
+#-of that range, e.g. variables on the stack. In general, avoid this data
+#-type for new code and replace it with (much more performant) FFI bindings.
+#-FFI cdata pointers can address the full 64 bit range.
+#-</li>
+# </ul>
+# <br class="flush">
+# </div>
+Index: luajit/src/jit/dump.lua
+===================================================================
+--- luajit.orig/src/jit/dump.lua
++++ luajit/src/jit/dump.lua
+@@ -315,7 +315,9 @@
+ local tn = type(k)
+ local s
+ if tn == "number" then
+- if band(sn or 0, 0x30000) ~= 0 then
++ if t < 12 then
++ s = k == 0 and "NULL" or format("[0x%08x]", k)
++ elseif band(sn or 0, 0x30000) ~= 0 then
+ s = band(sn, 0x20000) ~= 0 and "contpc" or "ftsz"
+ elseif k == 2^52+2^51 then
+ s = "bias"
+Index: luajit/src/lib_debug.c
+===================================================================
+--- luajit.orig/src/lib_debug.c
++++ luajit/src/lib_debug.c
+@@ -231,8 +231,8 @@
+ int32_t n = lj_lib_checkint(L, 2) - 1;
+ if ((uint32_t)n >= fn->l.nupvalues)
+ lj_err_arg(L, 2, LJ_ERR_IDXRNG);
+- setlightudV(L->top-1, isluafunc(fn) ? (void *)gcref(fn->l.uvptr[n]) :
+- (void *)&fn->c.upvalue[n]);
++ lua_pushlightuserdata(L, isluafunc(fn) ? (void *)gcref(fn->l.uvptr[n]) :
++ (void *)&fn->c.upvalue[n]);
+ return 1;
+ }
+
+@@ -283,13 +283,13 @@
+
+ /* ------------------------------------------------------------------------ */
+
+-#define KEY_HOOK ((void *)0x3004)
++#define KEY_HOOK (U64x(80000000,00000000)|'h')
+
+ static void hookf(lua_State *L, lua_Debug *ar)
+ {
+ static const char *const hooknames[] =
+ {"call", "return", "line", "count", "tail return"};
+- lua_pushlightuserdata(L, KEY_HOOK);
++ (L->top++)->u64 = KEY_HOOK;
+ lua_rawget(L, LUA_REGISTRYINDEX);
+ if (lua_isfunction(L, -1)) {
+ lua_pushstring(L, hooknames[(int)ar->event]);
+@@ -334,7 +334,7 @@
+ count = luaL_optint(L, arg+3, 0);
+ func = hookf; mask = makemask(smask, count);
+ }
+- lua_pushlightuserdata(L, KEY_HOOK);
++ (L->top++)->u64 = KEY_HOOK;
+ lua_pushvalue(L, arg+1);
+ lua_rawset(L, LUA_REGISTRYINDEX);
+ lua_sethook(L, func, mask, count);
+@@ -349,7 +349,7 @@
+ if (hook != NULL && hook != hookf) { /* external hook? */
+ lua_pushliteral(L, "external hook");
+ } else {
+- lua_pushlightuserdata(L, KEY_HOOK);
++ (L->top++)->u64 = KEY_HOOK;
+ lua_rawget(L, LUA_REGISTRYINDEX); /* get hook */
+ }
+ lua_pushstring(L, unmakemask(mask, buff));
+Index: luajit/src/lib_jit.c
+===================================================================
+--- luajit.orig/src/lib_jit.c
++++ luajit/src/lib_jit.c
+@@ -540,15 +540,15 @@
+
+ /* Not loaded by default, use: local profile = require("jit.profile") */
+
+-static const char KEY_PROFILE_THREAD = 't';
+-static const char KEY_PROFILE_FUNC = 'f';
++#define KEY_PROFILE_THREAD (U64x(80000000,00000000)|'t')
++#define KEY_PROFILE_FUNC (U64x(80000000,00000000)|'f')
+
+ static void jit_profile_callback(lua_State *L2, lua_State *L, int samples,
+ int vmstate)
+ {
+ TValue key;
+ cTValue *tv;
+- setlightudV(&key, (void *)&KEY_PROFILE_FUNC);
++ key.u64 = KEY_PROFILE_FUNC;
+ tv = lj_tab_get(L, tabV(registry(L)), &key);
+ if (tvisfunc(tv)) {
+ char vmst = (char)vmstate;
+@@ -575,9 +575,9 @@
+ lua_State *L2 = lua_newthread(L); /* Thread that runs profiler callback. */
+ TValue key;
+ /* Anchor thread and function in registry. */
+- setlightudV(&key, (void *)&KEY_PROFILE_THREAD);
++ key.u64 = KEY_PROFILE_THREAD;
+ setthreadV(L, lj_tab_set(L, registry, &key), L2);
+- setlightudV(&key, (void *)&KEY_PROFILE_FUNC);
++ key.u64 = KEY_PROFILE_FUNC;
+ setfuncV(L, lj_tab_set(L, registry, &key), func);
+ lj_gc_anybarriert(L, registry);
+ luaJIT_profile_start(L, mode ? strdata(mode) : "",
+@@ -592,9 +592,9 @@
+ TValue key;
+ luaJIT_profile_stop(L);
+ registry = tabV(registry(L));
+- setlightudV(&key, (void *)&KEY_PROFILE_THREAD);
++ key.u64 = KEY_PROFILE_THREAD;
+ setnilV(lj_tab_set(L, registry, &key));
+- setlightudV(&key, (void *)&KEY_PROFILE_FUNC);
++ key.u64 = KEY_PROFILE_FUNC;
+ setnilV(lj_tab_set(L, registry, &key));
+ lj_gc_anybarriert(L, registry);
+ return 0;
+Index: luajit/src/lib_package.c
+===================================================================
+--- luajit.orig/src/lib_package.c
++++ luajit/src/lib_package.c
+@@ -398,7 +398,7 @@
+
+ /* ------------------------------------------------------------------------ */
+
+-#define sentinel ((void *)0x4004)
++#define KEY_SENTINEL (U64x(80000000,00000000)|'s')
+
+ static int lj_cf_package_require(lua_State *L)
+ {
+@@ -408,7 +408,7 @@
+ lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");
+ lua_getfield(L, 2, name);
+ if (lua_toboolean(L, -1)) { /* is it there? */
+- if (lua_touserdata(L, -1) == sentinel) /* check loops */
++ if ((L->top-1)->u64 == KEY_SENTINEL) /* check loops */
+ luaL_error(L, "loop or previous error loading module " LUA_QS, name);
+ return 1; /* package is already loaded */
+ }
+@@ -431,14 +431,14 @@
+ else
+ lua_pop(L, 1);
+ }
+- lua_pushlightuserdata(L, sentinel);
++ (L->top++)->u64 = KEY_SENTINEL;
+ lua_setfield(L, 2, name); /* _LOADED[name] = sentinel */
+ lua_pushstring(L, name); /* pass name as argument to module */
+ lua_call(L, 1, 1); /* run loaded module */
+ if (!lua_isnil(L, -1)) /* non-nil return? */
+ lua_setfield(L, 2, name); /* _LOADED[name] = returned value */
+ lua_getfield(L, 2, name);
+- if (lua_touserdata(L, -1) == sentinel) { /* module did not set a value? */
++ if ((L->top-1)->u64 == KEY_SENTINEL) { /* module did not set a value? */
+ lua_pushboolean(L, 1); /* use true as result */
+ lua_pushvalue(L, -1); /* extra copy to be returned */
+ lua_setfield(L, 2, name); /* _LOADED[name] = true */
+Index: luajit/src/lib_string.c
+===================================================================
+--- luajit.orig/src/lib_string.c
++++ luajit/src/lib_string.c
+@@ -714,7 +714,7 @@
+ lj_strfmt_putfchar(sb, sf, lj_lib_checkint(L, arg));
+ break;
+ case STRFMT_PTR: /* No formatting. */
+- lj_strfmt_putptr(sb, lj_obj_ptr(L->base+arg-1));
++ lj_strfmt_putptr(sb, lj_obj_ptr(G(L), L->base+arg-1));
+ break;
+ default:
+ lua_assert(0);
+Index: luajit/src/lj_api.c
+===================================================================
+--- luajit.orig/src/lj_api.c
++++ luajit/src/lj_api.c
+@@ -595,7 +595,7 @@
+ if (tvisudata(o))
+ return uddata(udataV(o));
+ else if (tvislightud(o))
+- return lightudV(o);
++ return lightudV(G(L), o);
+ else
+ return NULL;
+ }
+@@ -608,7 +608,7 @@
+
+ LUA_API const void *lua_topointer(lua_State *L, int idx)
+ {
+- return lj_obj_ptr(index2adr(L, idx));
++ return lj_obj_ptr(G(L), index2adr(L, idx));
+ }
+
+ /* -- Stack setters (object creation) ------------------------------------- */
+@@ -694,9 +694,38 @@
+ incr_top(L);
+ }
+
++#if LJ_64
++static void *lightud_intern(lua_State *L, void *p)
++{
++ global_State *g = G(L);
++ uint64_t u = (uint64_t)p;
++ uint32_t up = lightudup(u);
++ uint32_t *segmap = mref(g->gc.lightudseg, uint32_t);
++ MSize segnum = g->gc.lightudnum;
++ if (segmap) {
++ MSize seg;
++ for (seg = 0; seg <= segnum; seg++)
++ if (segmap[seg] == up) /* Fast path. */
++ return (void *)(((uint64_t)seg << LJ_LIGHTUD_BITS_LO) | lightudlo(u));
++ segnum++;
++ }
++ if (!((segnum-1) & segnum) && segnum != 1) {
++ if (segnum >= (1 << LJ_LIGHTUD_BITS_SEG)) lj_err_msg(L, LJ_ERR_BADLU);
++ lj_mem_reallocvec(L, segmap, segnum, segnum ? 2*segnum : 2u, uint32_t);
++ setmref(g->gc.lightudseg, segmap);
++ }
++ g->gc.lightudnum = segnum;
++ segmap[segnum] = up;
++ return (void *)(((uint64_t)segnum << LJ_LIGHTUD_BITS_LO) | lightudlo(u));
++}
++#endif
++
+ LUA_API void lua_pushlightuserdata(lua_State *L, void *p)
+ {
+- setlightudV(L->top, checklightudptr(L, p));
++#if LJ_64
++ p = lightud_intern(L, p);
++#endif
++ setrawlightudV(L->top, p);
+ incr_top(L);
+ }
+
+@@ -1138,7 +1167,10 @@
+ fn->c.f = func;
+ setfuncV(L, top++, fn);
+ if (LJ_FR2) setnilV(top++);
+- setlightudV(top++, checklightudptr(L, ud));
++#if LJ_64
++ ud = lightud_intern(L, ud);
++#endif
++ setrawlightudV(top++, ud);
+ cframe_nres(L->cframe) = 1+0; /* Zero results. */
+ L->top = top;
+ return top-1; /* Now call the newly allocated C function. */
+Index: luajit/src/lj_ccall.c
+===================================================================
+--- luajit.orig/src/lj_ccall.c
++++ luajit/src/lj_ccall.c
+@@ -1314,7 +1314,7 @@
+ lj_vm_ffi_call(&cc);
+ if (cts->cb.slot != ~0u) { /* Blacklist function that called a callback. */
+ TValue tv;
+- setlightudV(&tv, (void *)cc.func);
++ tv.u64 = ((uintptr_t)(void *)cc.func >> 2) | U64x(800000000, 00000000);
+ setboolV(lj_tab_set(L, cts->miscmap, &tv), 1);
+ }
+ ct = (CType *)((intptr_t)ct+(intptr_t)cts->tab); /* May be reallocated. */
+Index: luajit/src/lj_cconv.c
+===================================================================
+--- luajit.orig/src/lj_cconv.c
++++ luajit/src/lj_cconv.c
+@@ -611,7 +611,7 @@
+ if (ud->udtype == UDTYPE_IO_FILE)
+ tmpptr = *(void **)tmpptr;
+ } else if (tvislightud(o)) {
+- tmpptr = lightudV(o);
++ tmpptr = lightudV(cts->g, o);
+ } else if (tvisfunc(o)) {
+ void *p = lj_ccallback_new(cts, d, funcV(o));
+ if (p) {
+Index: luajit/src/lj_crecord.c
+===================================================================
+--- luajit.orig/src/lj_crecord.c
++++ luajit/src/lj_crecord.c
+@@ -643,8 +643,7 @@
+ }
+ } else if (tref_islightud(sp)) {
+ #if LJ_64
+- sp = emitir(IRT(IR_BAND, IRT_P64), sp,
+- lj_ir_kint64(J, U64x(00007fff,ffffffff)));
++ lj_trace_err(J, LJ_TRERR_NYICONV);
+ #endif
+ } else { /* NYI: tref_istab(sp). */
+ IRType t;
+@@ -1209,8 +1208,7 @@
+ TRef tr;
+ TValue tv;
+ /* Check for blacklisted C functions that might call a callback. */
+- setlightudV(&tv,
+- cdata_getptr(cdataptr(cd), (LJ_64 && tp == IRT_P64) ? 8 : 4));
++ tv.u64 = ((uintptr_t)cdata_getptr(cdataptr(cd), (LJ_64 && tp == IRT_P64) ? 8 : 4) >> 2) | U64x(800000000, 00000000);
+ if (tvistrue(lj_tab_get(J->L, cts->miscmap, &tv)))
+ lj_trace_err(J, LJ_TRERR_BLACKL);
+ if (ctype_isvoid(ctr->info)) {
+Index: luajit/src/lj_dispatch.c
+===================================================================
+--- luajit.orig/src/lj_dispatch.c
++++ luajit/src/lj_dispatch.c
+@@ -302,7 +302,7 @@
+ if (idx != 0) {
+ cTValue *tv = idx > 0 ? L->base + (idx-1) : L->top + idx;
+ if (tvislightud(tv))
+- g->wrapf = (lua_CFunction)lightudV(tv);
++ g->wrapf = (lua_CFunction)lightudV(g, tv);
+ else
+ return 0; /* Failed. */
+ } else {
+Index: luajit/src/lj_ir.c
+===================================================================
+--- luajit.orig/src/lj_ir.c
++++ luajit/src/lj_ir.c
+@@ -386,8 +386,10 @@
+ case IR_KPRI: setpriV(tv, irt_toitype(ir->t)); break;
+ case IR_KINT: setintV(tv, ir->i); break;
+ case IR_KGC: setgcV(L, tv, ir_kgc(ir), irt_toitype(ir->t)); break;
+- case IR_KPTR: case IR_KKPTR: setlightudV(tv, ir_kptr(ir)); break;
+- case IR_KNULL: setlightudV(tv, NULL); break;
++ case IR_KPTR: case IR_KKPTR:
++ setnumV(tv, (lua_Number)(uintptr_t)ir_kptr(ir));
++ break;
++ case IR_KNULL: setintV(tv, 0); break;
+ case IR_KNUM: setnumV(tv, ir_knum(ir)->n); break;
+ #if LJ_HASFFI
+ case IR_KINT64: {
+Index: luajit/src/lj_obj.c
+===================================================================
+--- luajit.orig/src/lj_obj.c
++++ luajit/src/lj_obj.c
+@@ -34,12 +34,13 @@
+ }
+
+ /* Return pointer to object or its object data. */
+-const void * LJ_FASTCALL lj_obj_ptr(cTValue *o)
++const void * LJ_FASTCALL lj_obj_ptr(global_State *g, cTValue *o)
+ {
++ UNUSED(g);
+ if (tvisudata(o))
+ return uddata(udataV(o));
+ else if (tvislightud(o))
+- return lightudV(o);
++ return lightudV(g, o);
+ else if (LJ_HASFFI && tviscdata(o))
+ return cdataptr(cdataV(o));
+ else if (tvisgcv(o))
+Index: luajit/src/lj_obj.h
+===================================================================
+--- luajit.orig/src/lj_obj.h
++++ luajit/src/lj_obj.h
+@@ -232,7 +232,7 @@
+ ** ---MSW---.---LSW---
+ ** primitive types | itype | |
+ ** lightuserdata | itype | void * | (32 bit platforms)
+-** lightuserdata |ffff| void * | (64 bit platforms, 47 bit pointers)
++** lightuserdata |ffff|seg| ofs | (64 bit platforms)
+ ** GC objects | itype | GCRef |
+ ** int (LJ_DUALNUM)| itype | int |
+ ** number -------double------
+@@ -245,7 +245,8 @@
+ **
+ ** ------MSW------.------LSW------
+ ** primitive types |1..1|itype|1..................1|
+-** GC objects/lightud |1..1|itype|-------GCRef--------|
++** GC objects |1..1|itype|-------GCRef--------|
++** lightuserdata |1..1|itype|seg|------ofs-------|
+ ** int (LJ_DUALNUM) |1..1|itype|0..0|-----int-------|
+ ** number ------------double-------------
+ **
+@@ -285,6 +286,12 @@
+ #define LJ_GCVMASK (((uint64_t)1 << 47) - 1)
+ #endif
+
++#if LJ_64
++/* To stay within 47 bits, lightuserdata is segmented. */
++#define LJ_LIGHTUD_BITS_SEG 8
++#define LJ_LIGHTUD_BITS_LO (47 - LJ_LIGHTUD_BITS_SEG)
++#endif
++
+ /* -- String object ------------------------------------------------------- */
+
+ /* String object header. String payload follows. */
+@@ -576,7 +583,11 @@
+ uint8_t currentwhite; /* Current white color. */
+ uint8_t state; /* GC state. */
+ uint8_t nocdatafin; /* No cdata finalizer called. */
+- uint8_t unused2;
++#if LJ_64
++ uint8_t lightudnum; /* Number of lightuserdata segments - 1. */
++#else
++ uint8_t unused1;
++#endif
+ MSize sweepstr; /* Sweep position in string table. */
+ GCRef root; /* List of all collectable objects. */
+ MRef sweep; /* Sweep position in root list. */
+@@ -588,6 +599,9 @@
+ GCSize estimate; /* Estimate of memory actually in use. */
+ MSize stepmul; /* Incremental GC step granularity. */
+ MSize pause; /* Pause between successive GC cycles. */
++#if LJ_64
++ MRef lightudseg; /* Upper bits of lightuserdata segments. */
++#endif
+ } GCState;
+
+ /* Global state, shared by all threads of a Lua universe. */
+@@ -795,10 +809,23 @@
+ #endif
+ #define boolV(o) check_exp(tvisbool(o), (LJ_TFALSE - itype(o)))
+ #if LJ_64
+-#define lightudV(o) \
+- check_exp(tvislightud(o), (void *)((o)->u64 & U64x(00007fff,ffffffff)))
++#define lightudseg(u) \
++ (((u) >> LJ_LIGHTUD_BITS_LO) & ((1 << LJ_LIGHTUD_BITS_SEG)-1))
++#define lightudlo(u) \
++ ((u) & (((uint64_t)1 << LJ_LIGHTUD_BITS_LO) - 1))
++#define lightudup(p) \
++ ((uint32_t)(((p) >> LJ_LIGHTUD_BITS_LO) << (LJ_LIGHTUD_BITS_LO-32)))
++static LJ_AINLINE void *lightudV(global_State *g, cTValue *o)
++{
++ uint64_t u = o->u64;
++ uint64_t seg = lightudseg(u);
++ uint32_t *segmap = mref(g->gc.lightudseg, uint32_t);
++ lua_assert(tvislightud(o));
++ lua_assert(seg <= g->gc.lightudnum);
++ return (void *)(((uint64_t)segmap[seg] << 32) | lightudlo(u));
++}
+ #else
+-#define lightudV(o) check_exp(tvislightud(o), gcrefp((o)->gcr, void))
++#define lightudV(g, o) check_exp(tvislightud(o), gcrefp((o)->gcr, void))
+ #endif
+ #define gcV(o) check_exp(tvisgcv(o), gcval(o))
+ #define strV(o) check_exp(tvisstr(o), &gcval(o)->str)
+@@ -824,7 +851,7 @@
+ #define setpriV(o, i) (setitype((o), (i)))
+ #endif
+
+-static LJ_AINLINE void setlightudV(TValue *o, void *p)
++static LJ_AINLINE void setrawlightudV(TValue *o, void *p)
+ {
+ #if LJ_GC64
+ o->u64 = (uint64_t)p | (((uint64_t)LJ_TLIGHTUD) << 47);
+@@ -835,24 +862,14 @@
+ #endif
+ }
+
+-#if LJ_64
+-#define checklightudptr(L, p) \
+- (((uint64_t)(p) >> 47) ? (lj_err_msg(L, LJ_ERR_BADLU), NULL) : (p))
+-#else
+-#define checklightudptr(L, p) (p)
+-#endif
+-
+-#if LJ_FR2
++#if LJ_FR2 || LJ_32
+ #define contptr(f) ((void *)(f))
+ #define setcont(o, f) ((o)->u64 = (uint64_t)(uintptr_t)contptr(f))
+-#elif LJ_64
++#else
+ #define contptr(f) \
+ ((void *)(uintptr_t)(uint32_t)((intptr_t)(f) - (intptr_t)lj_vm_asm_begin))
+ #define setcont(o, f) \
+ ((o)->u64 = (uint64_t)(void *)(f) - (uint64_t)lj_vm_asm_begin)
+-#else
+-#define contptr(f) ((void *)(f))
+-#define setcont(o, f) setlightudV((o), contptr(f))
+ #endif
+
+ #define tvchecklive(L, o) \
+@@ -978,6 +995,6 @@
+
+ /* Compare two objects without calling metamethods. */
+ LJ_FUNC int LJ_FASTCALL lj_obj_equal(cTValue *o1, cTValue *o2);
+-LJ_FUNC const void * LJ_FASTCALL lj_obj_ptr(cTValue *o);
++LJ_FUNC const void * LJ_FASTCALL lj_obj_ptr(global_State *g, cTValue *o);
+
+ #endif
+Index: luajit/src/lj_snap.c
+===================================================================
+--- luajit.orig/src/lj_snap.c
++++ luajit/src/lj_snap.c
+@@ -626,7 +626,12 @@
+ IRType1 t = ir->t;
+ RegSP rs = ir->prev;
+ if (irref_isk(ref)) { /* Restore constant slot. */
+- lj_ir_kvalue(J->L, o, ir);
++ if (ir->o == IR_KPTR) {
++ o->u64 = (uint64_t)(uintptr_t)ir_kptr(ir);
++ } else {
++ lua_assert(!(ir->o == IR_KKPTR || ir->o == IR_KNULL));
++ lj_ir_kvalue(J->L, o, ir);
++ }
+ return;
+ }
+ if (LJ_UNLIKELY(bloomtest(rfilt, ref)))
+Index: luajit/src/lj_state.c
+===================================================================
+--- luajit.orig/src/lj_state.c
++++ luajit/src/lj_state.c
+@@ -171,6 +171,12 @@
+ lj_mem_freevec(g, g->strhash, g->strmask+1, GCRef);
+ lj_buf_free(g, &g->tmpbuf);
+ lj_mem_freevec(g, tvref(L->stack), L->stacksize, TValue);
++#if LJ_64
++ if (mref(g->gc.lightudseg, uint32_t)) {
++ MSize segnum = g->gc.lightudnum ? (2 << lj_fls(g->gc.lightudnum)) : 2;
++ lj_mem_freevec(g, mref(g->gc.lightudseg, uint32_t), segnum, uint32_t);
++ }
++#endif
+ lua_assert(g->gc.total == sizeof(GG_State));
+ #ifndef LUAJIT_USE_SYSMALLOC
+ if (g->allocf == lj_alloc_f)
+Index: luajit/src/lj_strfmt.c
+===================================================================
+--- luajit.orig/src/lj_strfmt.c
++++ luajit/src/lj_strfmt.c
+@@ -393,7 +393,7 @@
+ p = lj_buf_wmem(p, "builtin#", 8);
+ p = lj_strfmt_wint(p, funcV(o)->c.ffid);
+ } else {
+- p = lj_strfmt_wptr(p, lj_obj_ptr(o));
++ p = lj_strfmt_wptr(p, lj_obj_ptr(G(L), o));
+ }
+ return lj_str_new(L, buf, (size_t)(p - buf));
+ }
diff --git a/srcpkgs/LuaJIT/template b/srcpkgs/LuaJIT/template
index 5b8ab1beda11..778a8df0e593 100644
--- a/srcpkgs/LuaJIT/template
+++ b/srcpkgs/LuaJIT/template
@@ -1,7 +1,7 @@
# Template file for 'LuaJIT'
pkgname=LuaJIT
version=2.1.0beta3
-revision=1
+revision=2
_so_version=2.1.0
_dist_version=${_so_version}-beta3
wrksrc="${pkgname}-${_dist_version}"
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PR PATCH] [Updated] LuaJIT: import upstream patch to support 64bit lightuserdata on aarch64
2021-09-25 10:19 [PR PATCH] LuaJIT: import upstream patch to support 64bit lightuserdata on aarch64 Johnnynator
@ 2021-09-25 11:29 ` Johnnynator
2021-09-26 8:12 ` [PR PATCH] [Merged]: LuaJIT: import upstream patches to fix crashes " Johnnynator
1 sibling, 0 replies; 3+ messages in thread
From: Johnnynator @ 2021-09-25 11:29 UTC (permalink / raw)
To: ml
[-- Attachment #1: Type: text/plain, Size: 1773 bytes --]
There is an updated pull request by Johnnynator against master on the void-packages repository
https://github.com/Johnnynator/void-packages luajit-aarch64
https://github.com/void-linux/void-packages/pull/33098
LuaJIT: import upstream patch to support 64bit lightuserdata on aarch64
without this e.g. luajit just crashes on native neovim builds and under
certain conditions also during runtime e.g. with nvim-cmp + nvim-cmp-lsp
<!-- Mark items with [x] where applicable -->
#### General
- [ ] This is a new package and it conforms to the [quality requirements](https://github.com/void-linux/void-packages/blob/master/Manual.md#quality-requirements)
#### Have the results of the proposed changes been tested?
- [ ] I use the packages affected by the proposed changes on a regular basis and confirm this PR works for me
- [ ] I generally don't use the affected packages but briefly tested this PR
<!--
If GitHub CI cannot be used to validate the build result (for example, if the
build is likely to take several hours), make sure to
[skip CI](https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#continuous-integration).
When skipping CI, uncomment and fill out the following section.
Note: for builds that are likely to complete in less than 2 hours, it is not
acceptable to skip CI.
-->
<!--
#### Does it build and run successfully?
(Please choose at least one native build and, if supported, at least one cross build. More are better.)
- [ ] I built this PR locally for my native architecture, (ARCH-LIBC)
- [ ] I built this PR locally for these architectures (if supported. mark crossbuilds):
- [ ] aarch64-musl
- [ ] armv7l
- [ ] armv6l-musl
-->
A patch file from https://github.com/void-linux/void-packages/pull/33098.patch is attached
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-luajit-aarch64-33098.patch --]
[-- Type: text/x-diff, Size: 30511 bytes --]
From 4cc5853c29495a17b0a94093358617feda209261 Mon Sep 17 00:00:00 2001
From: John <me@johnnynator.dev>
Date: Sat, 25 Sep 2021 12:12:27 +0200
Subject: [PATCH] LuaJIT: import upstream patches to fix crashes on aarch64
without this luajit just crashes on e.g. native neovim builds and under
certain conditions also during running neovim e.g. with nvim-cmp + nvim-cmp-lsp
---
.../aarch64-Fix-exit-stub-patching.patch | 231 +++++++
...1abec542e6f9851ff2368e7f196b6382a44c.patch | 562 ++++++++++++++++++
srcpkgs/LuaJIT/template | 2 +-
3 files changed, 794 insertions(+), 1 deletion(-)
create mode 100644 srcpkgs/LuaJIT/patches/aarch64-Fix-exit-stub-patching.patch
create mode 100644 srcpkgs/LuaJIT/patches/e9af1abec542e6f9851ff2368e7f196b6382a44c.patch
diff --git a/srcpkgs/LuaJIT/patches/aarch64-Fix-exit-stub-patching.patch b/srcpkgs/LuaJIT/patches/aarch64-Fix-exit-stub-patching.patch
new file mode 100644
index 000000000000..487a1cd1ca78
--- /dev/null
+++ b/srcpkgs/LuaJIT/patches/aarch64-Fix-exit-stub-patching.patch
@@ -0,0 +1,231 @@
+commit 9da06535092d6d9dec442641a26c64bce5574322
+Author: Mike Pall <mike>
+Date: Sun Jun 24 14:08:59 2018 +0200
+
+ ARM64: Fix exit stub patching.
+
+ Contributed by Javier Guerra Giraldez.
+
+diff --git a/src/lj_asm_arm64.h b/src/lj_asm_arm64.h
+index cbb186d3..baafa21a 100644
+--- a/src/lj_asm_arm64.h
++++ b/src/lj_asm_arm64.h
+@@ -56,11 +56,11 @@ static void asm_exitstub_setup(ASMState *as, ExitNo nexits)
+ asm_mclimit(as);
+ /* 1: str lr,[sp]; bl ->vm_exit_handler; movz w0,traceno; bl <1; bl <1; ... */
+ for (i = nexits-1; (int32_t)i >= 0; i--)
+- *--mxp = A64I_LE(A64I_BL|((-3-i)&0x03ffffffu));
+- *--mxp = A64I_LE(A64I_MOVZw|A64F_U16(as->T->traceno));
++ *--mxp = A64I_LE(A64I_BL | A64F_S26(-3-i));
++ *--mxp = A64I_LE(A64I_MOVZw | A64F_U16(as->T->traceno));
+ mxp--;
+- *mxp = A64I_LE(A64I_BL|(((MCode *)(void *)lj_vm_exit_handler-mxp)&0x03ffffffu));
+- *--mxp = A64I_LE(A64I_STRx|A64F_D(RID_LR)|A64F_N(RID_SP));
++ *mxp = A64I_LE(A64I_BL | A64F_S26(((MCode *)(void *)lj_vm_exit_handler-mxp)));
++ *--mxp = A64I_LE(A64I_STRx | A64F_D(RID_LR) | A64F_N(RID_SP));
+ as->mctop = mxp;
+ }
+
+@@ -77,7 +77,7 @@ static void asm_guardcc(ASMState *as, A64CC cc)
+ MCode *p = as->mcp;
+ if (LJ_UNLIKELY(p == as->invmcp)) {
+ as->loopinv = 1;
+- *p = A64I_B | ((target-p) & 0x03ffffffu);
++ *p = A64I_B | A64F_S26(target-p);
+ emit_cond_branch(as, cc^1, p-1);
+ return;
+ }
+@@ -91,7 +91,7 @@ static void asm_guardtnb(ASMState *as, A64Ins ai, Reg r, uint32_t bit)
+ MCode *p = as->mcp;
+ if (LJ_UNLIKELY(p == as->invmcp)) {
+ as->loopinv = 1;
+- *p = A64I_B | ((target-p) & 0x03ffffffu);
++ *p = A64I_B | A64F_S26(target-p);
+ emit_tnb(as, ai^0x01000000u, r, bit, p-1);
+ return;
+ }
+@@ -105,7 +105,7 @@ static void asm_guardcnb(ASMState *as, A64Ins ai, Reg r)
+ MCode *p = as->mcp;
+ if (LJ_UNLIKELY(p == as->invmcp)) {
+ as->loopinv = 1;
+- *p = A64I_B | ((target-p) & 0x03ffffffu);
++ *p = A64I_B | A64F_S26(target-p);
+ emit_cnb(as, ai^0x01000000u, r, p-1);
+ return;
+ }
+@@ -1850,7 +1850,7 @@ static void asm_loop_fixup(ASMState *as)
+ p[-2] |= ((uint32_t)delta & mask) << 5;
+ } else {
+ ptrdiff_t delta = target - (p - 1);
+- p[-1] = A64I_B | ((uint32_t)(delta) & 0x03ffffffu);
++ p[-1] = A64I_B | A64F_S26(delta);
+ }
+ }
+
+@@ -1919,7 +1919,7 @@ static void asm_tail_fixup(ASMState *as, TraceNo lnk)
+ }
+ /* Patch exit branch. */
+ target = lnk ? traceref(as->J, lnk)->mcode : (MCode *)lj_vm_exit_interp;
+- p[-1] = A64I_B | (((target-p)+1)&0x03ffffffu);
++ p[-1] = A64I_B | A64F_S26((target-p)+1);
+ }
+
+ /* Prepare tail of code. */
+@@ -1982,40 +1982,50 @@ void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno, MCode *target)
+ {
+ MCode *p = T->mcode;
+ MCode *pe = (MCode *)((char *)p + T->szmcode);
+- MCode *cstart = NULL, *cend = p;
++ MCode *cstart = NULL;
+ MCode *mcarea = lj_mcode_patch(J, p, 0);
+ MCode *px = exitstub_trace_addr(T, exitno);
++ /* Note: this assumes a trace exit is only ever patched once. */
+ for (; p < pe; p++) {
+ /* Look for exitstub branch, replace with branch to target. */
++ ptrdiff_t delta = target - p;
+ MCode ins = A64I_LE(*p);
+ if ((ins & 0xff000000u) == 0x54000000u &&
+ ((ins ^ ((px-p)<<5)) & 0x00ffffe0u) == 0) {
+- /* Patch bcc exitstub. */
+- *p = A64I_LE((ins & 0xff00001fu) | (((target-p)<<5) & 0x00ffffe0u));
+- cend = p+1;
+- if (!cstart) cstart = p;
++ /* Patch bcc, if within range. */
++ if (A64F_S_OK(delta, 19)) {
++ *p = A64I_LE((ins & 0xff00001fu) | A64F_S19(delta));
++ if (!cstart) cstart = p;
++ }
+ } else if ((ins & 0xfc000000u) == 0x14000000u &&
+ ((ins ^ (px-p)) & 0x03ffffffu) == 0) {
+- /* Patch b exitstub. */
+- *p = A64I_LE((ins & 0xfc000000u) | ((target-p) & 0x03ffffffu));
+- cend = p+1;
++ /* Patch b. */
++ lua_assert(A64F_S_OK(delta, 26));
++ *p = A64I_LE((ins & 0xfc000000u) | A64F_S26(delta));
+ if (!cstart) cstart = p;
+ } else if ((ins & 0x7e000000u) == 0x34000000u &&
+ ((ins ^ ((px-p)<<5)) & 0x00ffffe0u) == 0) {
+- /* Patch cbz/cbnz exitstub. */
+- *p = A64I_LE((ins & 0xff00001f) | (((target-p)<<5) & 0x00ffffe0u));
+- cend = p+1;
+- if (!cstart) cstart = p;
++ /* Patch cbz/cbnz, if within range. */
++ if (A64F_S_OK(delta, 19)) {
++ *p = A64I_LE((ins & 0xff00001fu) | A64F_S19(delta));
++ if (!cstart) cstart = p;
++ }
+ } else if ((ins & 0x7e000000u) == 0x36000000u &&
+ ((ins ^ ((px-p)<<5)) & 0x0007ffe0u) == 0) {
+- /* Patch tbz/tbnz exitstub. */
+- *p = A64I_LE((ins & 0xfff8001fu) | (((target-p)<<5) & 0x0007ffe0u));
+- cend = p+1;
+- if (!cstart) cstart = p;
++ /* Patch tbz/tbnz, if within range. */
++ if (A64F_S_OK(delta, 14)) {
++ *p = A64I_LE((ins & 0xfff8001fu) | A64F_S14(delta));
++ if (!cstart) cstart = p;
++ }
+ }
+ }
+- lua_assert(cstart != NULL);
+- lj_mcode_sync(cstart, cend);
++ { /* Always patch long-range branch in exit stub itself. */
++ ptrdiff_t delta = target - px;
++ lua_assert(A64F_S_OK(delta, 26));
++ *px = A64I_B | A64F_S26(delta);
++ if (!cstart) cstart = px;
++ }
++ lj_mcode_sync(cstart, px+1);
+ lj_mcode_patch(J, mcarea, 1);
+ }
+
+diff --git a/src/lj_emit_arm64.h b/src/lj_emit_arm64.h
+index 6da4c7d4..1001b1d8 100644
+--- a/src/lj_emit_arm64.h
++++ b/src/lj_emit_arm64.h
+@@ -241,7 +241,7 @@ static void emit_loadk(ASMState *as, Reg rd, uint64_t u64, int is64)
+ #define mcpofs(as, k) \
+ ((intptr_t)((uintptr_t)(k) - (uintptr_t)(as->mcp - 1)))
+ #define checkmcpofs(as, k) \
+- ((((mcpofs(as, k)>>2) + 0x00040000) >> 19) == 0)
++ (A64F_S_OK(mcpofs(as, k)>>2, 19))
+
+ static Reg ra_allock(ASMState *as, intptr_t k, RegSet allow);
+
+@@ -312,7 +312,7 @@ static void emit_cond_branch(ASMState *as, A64CC cond, MCode *target)
+ {
+ MCode *p = --as->mcp;
+ ptrdiff_t delta = target - p;
+- lua_assert(((delta + 0x40000) >> 19) == 0);
++ lua_assert(A64F_S_OK(delta, 19));
+ *p = A64I_BCC | A64F_S19(delta) | cond;
+ }
+
+@@ -320,24 +320,24 @@ static void emit_branch(ASMState *as, A64Ins ai, MCode *target)
+ {
+ MCode *p = --as->mcp;
+ ptrdiff_t delta = target - p;
+- lua_assert(((delta + 0x02000000) >> 26) == 0);
+- *p = ai | ((uint32_t)delta & 0x03ffffffu);
++ lua_assert(A64F_S_OK(delta, 26));
++ *p = ai | A64F_S26(delta);
+ }
+
+ static void emit_tnb(ASMState *as, A64Ins ai, Reg r, uint32_t bit, MCode *target)
+ {
+ MCode *p = --as->mcp;
+ ptrdiff_t delta = target - p;
+- lua_assert(bit < 63 && ((delta + 0x2000) >> 14) == 0);
++ lua_assert(bit < 63 && A64F_S_OK(delta, 14));
+ if (bit > 31) ai |= A64I_X;
+- *p = ai | A64F_BIT(bit & 31) | A64F_S14((uint32_t)delta & 0x3fffu) | r;
++ *p = ai | A64F_BIT(bit & 31) | A64F_S14(delta) | r;
+ }
+
+ static void emit_cnb(ASMState *as, A64Ins ai, Reg r, MCode *target)
+ {
+ MCode *p = --as->mcp;
+ ptrdiff_t delta = target - p;
+- lua_assert(((delta + 0x40000) >> 19) == 0);
++ lua_assert(A64F_S_OK(delta, 19));
+ *p = ai | A64F_S19(delta) | r;
+ }
+
+@@ -347,8 +347,8 @@ static void emit_call(ASMState *as, void *target)
+ {
+ MCode *p = --as->mcp;
+ ptrdiff_t delta = (char *)target - (char *)p;
+- if ((((delta>>2) + 0x02000000) >> 26) == 0) {
+- *p = A64I_BL | ((uint32_t)(delta>>2) & 0x03ffffffu);
++ if (A64F_S_OK(delta>>2, 26)) {
++ *p = A64I_BL | A64F_S26(delta>>2);
+ } else { /* Target out of range: need indirect call. But don't use R0-R7. */
+ Reg r = ra_allock(as, i64ptr(target),
+ RSET_RANGE(RID_X8, RID_MAX_GPR)-RSET_FIXED);
+diff --git a/src/lj_target_arm64.h b/src/lj_target_arm64.h
+index 520023ae..a207a2ba 100644
+--- a/src/lj_target_arm64.h
++++ b/src/lj_target_arm64.h
+@@ -132,9 +132,9 @@ static LJ_AINLINE uint32_t *exitstub_trace_addr_(uint32_t *p, uint32_t exitno)
+ #define A64F_IMMR(x) ((x) << 16)
+ #define A64F_U16(x) ((x) << 5)
+ #define A64F_U12(x) ((x) << 10)
+-#define A64F_S26(x) (x)
++#define A64F_S26(x) (((uint32_t)(x) & 0x03ffffffu))
+ #define A64F_S19(x) (((uint32_t)(x) & 0x7ffffu) << 5)
+-#define A64F_S14(x) ((x) << 5)
++#define A64F_S14(x) (((uint32_t)(x) & 0x3fffu) << 5)
+ #define A64F_S9(x) ((x) << 12)
+ #define A64F_BIT(x) ((x) << 19)
+ #define A64F_SH(sh, x) (((sh) << 22) | ((x) << 10))
+@@ -145,6 +145,9 @@ static LJ_AINLINE uint32_t *exitstub_trace_addr_(uint32_t *p, uint32_t exitno)
+ #define A64F_LSL16(x) (((x) / 16) << 21)
+ #define A64F_BSH(sh) ((sh) << 10)
+
++/* Check for valid field range. */
++#define A64F_S_OK(x, b) ((((x) + (1 << (b-1))) >> (b)) == 0)
++
+ typedef enum A64Ins {
+ A64I_S = 0x20000000,
+ A64I_X = 0x80000000,
diff --git a/srcpkgs/LuaJIT/patches/e9af1abec542e6f9851ff2368e7f196b6382a44c.patch b/srcpkgs/LuaJIT/patches/e9af1abec542e6f9851ff2368e7f196b6382a44c.patch
new file mode 100644
index 000000000000..a217866c392c
--- /dev/null
+++ b/srcpkgs/LuaJIT/patches/e9af1abec542e6f9851ff2368e7f196b6382a44c.patch
@@ -0,0 +1,562 @@
+From e9af1abec542e6f9851ff2368e7f196b6382a44c Mon Sep 17 00:00:00 2001
+From: Mike Pall <mike>
+Date: Wed, 30 Sep 2020 01:31:27 +0200
+Subject: [PATCH] Add support for full-range 64 bit lightuserdata.
+
+---
+ doc/status.html | 11 ---------
+ src/jit/dump.lua | 4 +++-
+ src/lib_debug.c | 12 +++++-----
+ src/lib_jit.c | 14 ++++++------
+ src/lib_package.c | 8 +++----
+ src/lib_string.c | 2 +-
+ src/lj_api.c | 40 +++++++++++++++++++++++++++++----
+ src/lj_ccall.c | 2 +-
+ src/lj_cconv.c | 2 +-
+ src/lj_crecord.c | 6 ++---
+ src/lj_dispatch.c | 2 +-
+ src/lj_ir.c | 6 +++--
+ src/lj_obj.c | 5 +++--
+ src/lj_obj.h | 57 ++++++++++++++++++++++++++++++-----------------
+ src/lj_snap.c | 9 +++++++-
+ src/lj_state.c | 6 +++++
+ src/lj_strfmt.c | 2 +-
+ 17 files changed, 121 insertions(+), 67 deletions(-)
+
+#diff --git a/doc/status.html b/doc/status.html
+#index 0aafe13a2..fd0ae8bae 100644
+#--- a/doc/status.html
+#+++ b/doc/status.html
+#@@ -91,17 +91,6 @@ <h2>Current Status</h2>
+# <tt>lua_atpanic</tt> on x64. This issue will be fixed with the new
+# garbage collector.
+# </li>
+#-<li>
+#-LuaJIT on 64 bit systems provides a <b>limited range</b> of 47 bits for the
+#-<b>legacy <tt>lightuserdata</tt></b> data type.
+#-This is only relevant on x64 systems which use the negative part of the
+#-virtual address space in user mode, e.g. Solaris/x64, and on ARM64 systems
+#-configured with a 48 bit or 52 bit VA.
+#-Avoid using <tt>lightuserdata</tt> to hold pointers that may point outside
+#-of that range, e.g. variables on the stack. In general, avoid this data
+#-type for new code and replace it with (much more performant) FFI bindings.
+#-FFI cdata pointers can address the full 64 bit range.
+#-</li>
+# </ul>
+# <br class="flush">
+# </div>
+Index: luajit/src/jit/dump.lua
+===================================================================
+--- luajit.orig/src/jit/dump.lua
++++ luajit/src/jit/dump.lua
+@@ -315,7 +315,9 @@
+ local tn = type(k)
+ local s
+ if tn == "number" then
+- if band(sn or 0, 0x30000) ~= 0 then
++ if t < 12 then
++ s = k == 0 and "NULL" or format("[0x%08x]", k)
++ elseif band(sn or 0, 0x30000) ~= 0 then
+ s = band(sn, 0x20000) ~= 0 and "contpc" or "ftsz"
+ elseif k == 2^52+2^51 then
+ s = "bias"
+Index: luajit/src/lib_debug.c
+===================================================================
+--- luajit.orig/src/lib_debug.c
++++ luajit/src/lib_debug.c
+@@ -231,8 +231,8 @@
+ int32_t n = lj_lib_checkint(L, 2) - 1;
+ if ((uint32_t)n >= fn->l.nupvalues)
+ lj_err_arg(L, 2, LJ_ERR_IDXRNG);
+- setlightudV(L->top-1, isluafunc(fn) ? (void *)gcref(fn->l.uvptr[n]) :
+- (void *)&fn->c.upvalue[n]);
++ lua_pushlightuserdata(L, isluafunc(fn) ? (void *)gcref(fn->l.uvptr[n]) :
++ (void *)&fn->c.upvalue[n]);
+ return 1;
+ }
+
+@@ -283,13 +283,13 @@
+
+ /* ------------------------------------------------------------------------ */
+
+-#define KEY_HOOK ((void *)0x3004)
++#define KEY_HOOK (U64x(80000000,00000000)|'h')
+
+ static void hookf(lua_State *L, lua_Debug *ar)
+ {
+ static const char *const hooknames[] =
+ {"call", "return", "line", "count", "tail return"};
+- lua_pushlightuserdata(L, KEY_HOOK);
++ (L->top++)->u64 = KEY_HOOK;
+ lua_rawget(L, LUA_REGISTRYINDEX);
+ if (lua_isfunction(L, -1)) {
+ lua_pushstring(L, hooknames[(int)ar->event]);
+@@ -334,7 +334,7 @@
+ count = luaL_optint(L, arg+3, 0);
+ func = hookf; mask = makemask(smask, count);
+ }
+- lua_pushlightuserdata(L, KEY_HOOK);
++ (L->top++)->u64 = KEY_HOOK;
+ lua_pushvalue(L, arg+1);
+ lua_rawset(L, LUA_REGISTRYINDEX);
+ lua_sethook(L, func, mask, count);
+@@ -349,7 +349,7 @@
+ if (hook != NULL && hook != hookf) { /* external hook? */
+ lua_pushliteral(L, "external hook");
+ } else {
+- lua_pushlightuserdata(L, KEY_HOOK);
++ (L->top++)->u64 = KEY_HOOK;
+ lua_rawget(L, LUA_REGISTRYINDEX); /* get hook */
+ }
+ lua_pushstring(L, unmakemask(mask, buff));
+Index: luajit/src/lib_jit.c
+===================================================================
+--- luajit.orig/src/lib_jit.c
++++ luajit/src/lib_jit.c
+@@ -540,15 +540,15 @@
+
+ /* Not loaded by default, use: local profile = require("jit.profile") */
+
+-static const char KEY_PROFILE_THREAD = 't';
+-static const char KEY_PROFILE_FUNC = 'f';
++#define KEY_PROFILE_THREAD (U64x(80000000,00000000)|'t')
++#define KEY_PROFILE_FUNC (U64x(80000000,00000000)|'f')
+
+ static void jit_profile_callback(lua_State *L2, lua_State *L, int samples,
+ int vmstate)
+ {
+ TValue key;
+ cTValue *tv;
+- setlightudV(&key, (void *)&KEY_PROFILE_FUNC);
++ key.u64 = KEY_PROFILE_FUNC;
+ tv = lj_tab_get(L, tabV(registry(L)), &key);
+ if (tvisfunc(tv)) {
+ char vmst = (char)vmstate;
+@@ -575,9 +575,9 @@
+ lua_State *L2 = lua_newthread(L); /* Thread that runs profiler callback. */
+ TValue key;
+ /* Anchor thread and function in registry. */
+- setlightudV(&key, (void *)&KEY_PROFILE_THREAD);
++ key.u64 = KEY_PROFILE_THREAD;
+ setthreadV(L, lj_tab_set(L, registry, &key), L2);
+- setlightudV(&key, (void *)&KEY_PROFILE_FUNC);
++ key.u64 = KEY_PROFILE_FUNC;
+ setfuncV(L, lj_tab_set(L, registry, &key), func);
+ lj_gc_anybarriert(L, registry);
+ luaJIT_profile_start(L, mode ? strdata(mode) : "",
+@@ -592,9 +592,9 @@
+ TValue key;
+ luaJIT_profile_stop(L);
+ registry = tabV(registry(L));
+- setlightudV(&key, (void *)&KEY_PROFILE_THREAD);
++ key.u64 = KEY_PROFILE_THREAD;
+ setnilV(lj_tab_set(L, registry, &key));
+- setlightudV(&key, (void *)&KEY_PROFILE_FUNC);
++ key.u64 = KEY_PROFILE_FUNC;
+ setnilV(lj_tab_set(L, registry, &key));
+ lj_gc_anybarriert(L, registry);
+ return 0;
+Index: luajit/src/lib_package.c
+===================================================================
+--- luajit.orig/src/lib_package.c
++++ luajit/src/lib_package.c
+@@ -398,7 +398,7 @@
+
+ /* ------------------------------------------------------------------------ */
+
+-#define sentinel ((void *)0x4004)
++#define KEY_SENTINEL (U64x(80000000,00000000)|'s')
+
+ static int lj_cf_package_require(lua_State *L)
+ {
+@@ -408,7 +408,7 @@
+ lua_getfield(L, LUA_REGISTRYINDEX, "_LOADED");
+ lua_getfield(L, 2, name);
+ if (lua_toboolean(L, -1)) { /* is it there? */
+- if (lua_touserdata(L, -1) == sentinel) /* check loops */
++ if ((L->top-1)->u64 == KEY_SENTINEL) /* check loops */
+ luaL_error(L, "loop or previous error loading module " LUA_QS, name);
+ return 1; /* package is already loaded */
+ }
+@@ -431,14 +431,14 @@
+ else
+ lua_pop(L, 1);
+ }
+- lua_pushlightuserdata(L, sentinel);
++ (L->top++)->u64 = KEY_SENTINEL;
+ lua_setfield(L, 2, name); /* _LOADED[name] = sentinel */
+ lua_pushstring(L, name); /* pass name as argument to module */
+ lua_call(L, 1, 1); /* run loaded module */
+ if (!lua_isnil(L, -1)) /* non-nil return? */
+ lua_setfield(L, 2, name); /* _LOADED[name] = returned value */
+ lua_getfield(L, 2, name);
+- if (lua_touserdata(L, -1) == sentinel) { /* module did not set a value? */
++ if ((L->top-1)->u64 == KEY_SENTINEL) { /* module did not set a value? */
+ lua_pushboolean(L, 1); /* use true as result */
+ lua_pushvalue(L, -1); /* extra copy to be returned */
+ lua_setfield(L, 2, name); /* _LOADED[name] = true */
+Index: luajit/src/lib_string.c
+===================================================================
+--- luajit.orig/src/lib_string.c
++++ luajit/src/lib_string.c
+@@ -714,7 +714,7 @@
+ lj_strfmt_putfchar(sb, sf, lj_lib_checkint(L, arg));
+ break;
+ case STRFMT_PTR: /* No formatting. */
+- lj_strfmt_putptr(sb, lj_obj_ptr(L->base+arg-1));
++ lj_strfmt_putptr(sb, lj_obj_ptr(G(L), L->base+arg-1));
+ break;
+ default:
+ lua_assert(0);
+Index: luajit/src/lj_api.c
+===================================================================
+--- luajit.orig/src/lj_api.c
++++ luajit/src/lj_api.c
+@@ -595,7 +595,7 @@
+ if (tvisudata(o))
+ return uddata(udataV(o));
+ else if (tvislightud(o))
+- return lightudV(o);
++ return lightudV(G(L), o);
+ else
+ return NULL;
+ }
+@@ -608,7 +608,7 @@
+
+ LUA_API const void *lua_topointer(lua_State *L, int idx)
+ {
+- return lj_obj_ptr(index2adr(L, idx));
++ return lj_obj_ptr(G(L), index2adr(L, idx));
+ }
+
+ /* -- Stack setters (object creation) ------------------------------------- */
+@@ -694,9 +694,38 @@
+ incr_top(L);
+ }
+
++#if LJ_64
++static void *lightud_intern(lua_State *L, void *p)
++{
++ global_State *g = G(L);
++ uint64_t u = (uint64_t)p;
++ uint32_t up = lightudup(u);
++ uint32_t *segmap = mref(g->gc.lightudseg, uint32_t);
++ MSize segnum = g->gc.lightudnum;
++ if (segmap) {
++ MSize seg;
++ for (seg = 0; seg <= segnum; seg++)
++ if (segmap[seg] == up) /* Fast path. */
++ return (void *)(((uint64_t)seg << LJ_LIGHTUD_BITS_LO) | lightudlo(u));
++ segnum++;
++ }
++ if (!((segnum-1) & segnum) && segnum != 1) {
++ if (segnum >= (1 << LJ_LIGHTUD_BITS_SEG)) lj_err_msg(L, LJ_ERR_BADLU);
++ lj_mem_reallocvec(L, segmap, segnum, segnum ? 2*segnum : 2u, uint32_t);
++ setmref(g->gc.lightudseg, segmap);
++ }
++ g->gc.lightudnum = segnum;
++ segmap[segnum] = up;
++ return (void *)(((uint64_t)segnum << LJ_LIGHTUD_BITS_LO) | lightudlo(u));
++}
++#endif
++
+ LUA_API void lua_pushlightuserdata(lua_State *L, void *p)
+ {
+- setlightudV(L->top, checklightudptr(L, p));
++#if LJ_64
++ p = lightud_intern(L, p);
++#endif
++ setrawlightudV(L->top, p);
+ incr_top(L);
+ }
+
+@@ -1138,7 +1167,10 @@
+ fn->c.f = func;
+ setfuncV(L, top++, fn);
+ if (LJ_FR2) setnilV(top++);
+- setlightudV(top++, checklightudptr(L, ud));
++#if LJ_64
++ ud = lightud_intern(L, ud);
++#endif
++ setrawlightudV(top++, ud);
+ cframe_nres(L->cframe) = 1+0; /* Zero results. */
+ L->top = top;
+ return top-1; /* Now call the newly allocated C function. */
+Index: luajit/src/lj_ccall.c
+===================================================================
+--- luajit.orig/src/lj_ccall.c
++++ luajit/src/lj_ccall.c
+@@ -1314,7 +1314,7 @@
+ lj_vm_ffi_call(&cc);
+ if (cts->cb.slot != ~0u) { /* Blacklist function that called a callback. */
+ TValue tv;
+- setlightudV(&tv, (void *)cc.func);
++ tv.u64 = ((uintptr_t)(void *)cc.func >> 2) | U64x(800000000, 00000000);
+ setboolV(lj_tab_set(L, cts->miscmap, &tv), 1);
+ }
+ ct = (CType *)((intptr_t)ct+(intptr_t)cts->tab); /* May be reallocated. */
+Index: luajit/src/lj_cconv.c
+===================================================================
+--- luajit.orig/src/lj_cconv.c
++++ luajit/src/lj_cconv.c
+@@ -611,7 +611,7 @@
+ if (ud->udtype == UDTYPE_IO_FILE)
+ tmpptr = *(void **)tmpptr;
+ } else if (tvislightud(o)) {
+- tmpptr = lightudV(o);
++ tmpptr = lightudV(cts->g, o);
+ } else if (tvisfunc(o)) {
+ void *p = lj_ccallback_new(cts, d, funcV(o));
+ if (p) {
+Index: luajit/src/lj_crecord.c
+===================================================================
+--- luajit.orig/src/lj_crecord.c
++++ luajit/src/lj_crecord.c
+@@ -643,8 +643,7 @@
+ }
+ } else if (tref_islightud(sp)) {
+ #if LJ_64
+- sp = emitir(IRT(IR_BAND, IRT_P64), sp,
+- lj_ir_kint64(J, U64x(00007fff,ffffffff)));
++ lj_trace_err(J, LJ_TRERR_NYICONV);
+ #endif
+ } else { /* NYI: tref_istab(sp). */
+ IRType t;
+@@ -1209,8 +1208,7 @@
+ TRef tr;
+ TValue tv;
+ /* Check for blacklisted C functions that might call a callback. */
+- setlightudV(&tv,
+- cdata_getptr(cdataptr(cd), (LJ_64 && tp == IRT_P64) ? 8 : 4));
++ tv.u64 = ((uintptr_t)cdata_getptr(cdataptr(cd), (LJ_64 && tp == IRT_P64) ? 8 : 4) >> 2) | U64x(800000000, 00000000);
+ if (tvistrue(lj_tab_get(J->L, cts->miscmap, &tv)))
+ lj_trace_err(J, LJ_TRERR_BLACKL);
+ if (ctype_isvoid(ctr->info)) {
+Index: luajit/src/lj_dispatch.c
+===================================================================
+--- luajit.orig/src/lj_dispatch.c
++++ luajit/src/lj_dispatch.c
+@@ -302,7 +302,7 @@
+ if (idx != 0) {
+ cTValue *tv = idx > 0 ? L->base + (idx-1) : L->top + idx;
+ if (tvislightud(tv))
+- g->wrapf = (lua_CFunction)lightudV(tv);
++ g->wrapf = (lua_CFunction)lightudV(g, tv);
+ else
+ return 0; /* Failed. */
+ } else {
+Index: luajit/src/lj_ir.c
+===================================================================
+--- luajit.orig/src/lj_ir.c
++++ luajit/src/lj_ir.c
+@@ -386,8 +386,10 @@
+ case IR_KPRI: setpriV(tv, irt_toitype(ir->t)); break;
+ case IR_KINT: setintV(tv, ir->i); break;
+ case IR_KGC: setgcV(L, tv, ir_kgc(ir), irt_toitype(ir->t)); break;
+- case IR_KPTR: case IR_KKPTR: setlightudV(tv, ir_kptr(ir)); break;
+- case IR_KNULL: setlightudV(tv, NULL); break;
++ case IR_KPTR: case IR_KKPTR:
++ setnumV(tv, (lua_Number)(uintptr_t)ir_kptr(ir));
++ break;
++ case IR_KNULL: setintV(tv, 0); break;
+ case IR_KNUM: setnumV(tv, ir_knum(ir)->n); break;
+ #if LJ_HASFFI
+ case IR_KINT64: {
+Index: luajit/src/lj_obj.c
+===================================================================
+--- luajit.orig/src/lj_obj.c
++++ luajit/src/lj_obj.c
+@@ -34,12 +34,13 @@
+ }
+
+ /* Return pointer to object or its object data. */
+-const void * LJ_FASTCALL lj_obj_ptr(cTValue *o)
++const void * LJ_FASTCALL lj_obj_ptr(global_State *g, cTValue *o)
+ {
++ UNUSED(g);
+ if (tvisudata(o))
+ return uddata(udataV(o));
+ else if (tvislightud(o))
+- return lightudV(o);
++ return lightudV(g, o);
+ else if (LJ_HASFFI && tviscdata(o))
+ return cdataptr(cdataV(o));
+ else if (tvisgcv(o))
+Index: luajit/src/lj_obj.h
+===================================================================
+--- luajit.orig/src/lj_obj.h
++++ luajit/src/lj_obj.h
+@@ -232,7 +232,7 @@
+ ** ---MSW---.---LSW---
+ ** primitive types | itype | |
+ ** lightuserdata | itype | void * | (32 bit platforms)
+-** lightuserdata |ffff| void * | (64 bit platforms, 47 bit pointers)
++** lightuserdata |ffff|seg| ofs | (64 bit platforms)
+ ** GC objects | itype | GCRef |
+ ** int (LJ_DUALNUM)| itype | int |
+ ** number -------double------
+@@ -245,7 +245,8 @@
+ **
+ ** ------MSW------.------LSW------
+ ** primitive types |1..1|itype|1..................1|
+-** GC objects/lightud |1..1|itype|-------GCRef--------|
++** GC objects |1..1|itype|-------GCRef--------|
++** lightuserdata |1..1|itype|seg|------ofs-------|
+ ** int (LJ_DUALNUM) |1..1|itype|0..0|-----int-------|
+ ** number ------------double-------------
+ **
+@@ -285,6 +286,12 @@
+ #define LJ_GCVMASK (((uint64_t)1 << 47) - 1)
+ #endif
+
++#if LJ_64
++/* To stay within 47 bits, lightuserdata is segmented. */
++#define LJ_LIGHTUD_BITS_SEG 8
++#define LJ_LIGHTUD_BITS_LO (47 - LJ_LIGHTUD_BITS_SEG)
++#endif
++
+ /* -- String object ------------------------------------------------------- */
+
+ /* String object header. String payload follows. */
+@@ -576,7 +583,11 @@
+ uint8_t currentwhite; /* Current white color. */
+ uint8_t state; /* GC state. */
+ uint8_t nocdatafin; /* No cdata finalizer called. */
+- uint8_t unused2;
++#if LJ_64
++ uint8_t lightudnum; /* Number of lightuserdata segments - 1. */
++#else
++ uint8_t unused1;
++#endif
+ MSize sweepstr; /* Sweep position in string table. */
+ GCRef root; /* List of all collectable objects. */
+ MRef sweep; /* Sweep position in root list. */
+@@ -588,6 +599,9 @@
+ GCSize estimate; /* Estimate of memory actually in use. */
+ MSize stepmul; /* Incremental GC step granularity. */
+ MSize pause; /* Pause between successive GC cycles. */
++#if LJ_64
++ MRef lightudseg; /* Upper bits of lightuserdata segments. */
++#endif
+ } GCState;
+
+ /* Global state, shared by all threads of a Lua universe. */
+@@ -795,10 +809,23 @@
+ #endif
+ #define boolV(o) check_exp(tvisbool(o), (LJ_TFALSE - itype(o)))
+ #if LJ_64
+-#define lightudV(o) \
+- check_exp(tvislightud(o), (void *)((o)->u64 & U64x(00007fff,ffffffff)))
++#define lightudseg(u) \
++ (((u) >> LJ_LIGHTUD_BITS_LO) & ((1 << LJ_LIGHTUD_BITS_SEG)-1))
++#define lightudlo(u) \
++ ((u) & (((uint64_t)1 << LJ_LIGHTUD_BITS_LO) - 1))
++#define lightudup(p) \
++ ((uint32_t)(((p) >> LJ_LIGHTUD_BITS_LO) << (LJ_LIGHTUD_BITS_LO-32)))
++static LJ_AINLINE void *lightudV(global_State *g, cTValue *o)
++{
++ uint64_t u = o->u64;
++ uint64_t seg = lightudseg(u);
++ uint32_t *segmap = mref(g->gc.lightudseg, uint32_t);
++ lua_assert(tvislightud(o));
++ lua_assert(seg <= g->gc.lightudnum);
++ return (void *)(((uint64_t)segmap[seg] << 32) | lightudlo(u));
++}
+ #else
+-#define lightudV(o) check_exp(tvislightud(o), gcrefp((o)->gcr, void))
++#define lightudV(g, o) check_exp(tvislightud(o), gcrefp((o)->gcr, void))
+ #endif
+ #define gcV(o) check_exp(tvisgcv(o), gcval(o))
+ #define strV(o) check_exp(tvisstr(o), &gcval(o)->str)
+@@ -824,7 +851,7 @@
+ #define setpriV(o, i) (setitype((o), (i)))
+ #endif
+
+-static LJ_AINLINE void setlightudV(TValue *o, void *p)
++static LJ_AINLINE void setrawlightudV(TValue *o, void *p)
+ {
+ #if LJ_GC64
+ o->u64 = (uint64_t)p | (((uint64_t)LJ_TLIGHTUD) << 47);
+@@ -835,24 +862,14 @@
+ #endif
+ }
+
+-#if LJ_64
+-#define checklightudptr(L, p) \
+- (((uint64_t)(p) >> 47) ? (lj_err_msg(L, LJ_ERR_BADLU), NULL) : (p))
+-#else
+-#define checklightudptr(L, p) (p)
+-#endif
+-
+-#if LJ_FR2
++#if LJ_FR2 || LJ_32
+ #define contptr(f) ((void *)(f))
+ #define setcont(o, f) ((o)->u64 = (uint64_t)(uintptr_t)contptr(f))
+-#elif LJ_64
++#else
+ #define contptr(f) \
+ ((void *)(uintptr_t)(uint32_t)((intptr_t)(f) - (intptr_t)lj_vm_asm_begin))
+ #define setcont(o, f) \
+ ((o)->u64 = (uint64_t)(void *)(f) - (uint64_t)lj_vm_asm_begin)
+-#else
+-#define contptr(f) ((void *)(f))
+-#define setcont(o, f) setlightudV((o), contptr(f))
+ #endif
+
+ #define tvchecklive(L, o) \
+@@ -978,6 +995,6 @@
+
+ /* Compare two objects without calling metamethods. */
+ LJ_FUNC int LJ_FASTCALL lj_obj_equal(cTValue *o1, cTValue *o2);
+-LJ_FUNC const void * LJ_FASTCALL lj_obj_ptr(cTValue *o);
++LJ_FUNC const void * LJ_FASTCALL lj_obj_ptr(global_State *g, cTValue *o);
+
+ #endif
+Index: luajit/src/lj_snap.c
+===================================================================
+--- luajit.orig/src/lj_snap.c
++++ luajit/src/lj_snap.c
+@@ -626,7 +626,12 @@
+ IRType1 t = ir->t;
+ RegSP rs = ir->prev;
+ if (irref_isk(ref)) { /* Restore constant slot. */
+- lj_ir_kvalue(J->L, o, ir);
++ if (ir->o == IR_KPTR) {
++ o->u64 = (uint64_t)(uintptr_t)ir_kptr(ir);
++ } else {
++ lua_assert(!(ir->o == IR_KKPTR || ir->o == IR_KNULL));
++ lj_ir_kvalue(J->L, o, ir);
++ }
+ return;
+ }
+ if (LJ_UNLIKELY(bloomtest(rfilt, ref)))
+Index: luajit/src/lj_state.c
+===================================================================
+--- luajit.orig/src/lj_state.c
++++ luajit/src/lj_state.c
+@@ -171,6 +171,12 @@
+ lj_mem_freevec(g, g->strhash, g->strmask+1, GCRef);
+ lj_buf_free(g, &g->tmpbuf);
+ lj_mem_freevec(g, tvref(L->stack), L->stacksize, TValue);
++#if LJ_64
++ if (mref(g->gc.lightudseg, uint32_t)) {
++ MSize segnum = g->gc.lightudnum ? (2 << lj_fls(g->gc.lightudnum)) : 2;
++ lj_mem_freevec(g, mref(g->gc.lightudseg, uint32_t), segnum, uint32_t);
++ }
++#endif
+ lua_assert(g->gc.total == sizeof(GG_State));
+ #ifndef LUAJIT_USE_SYSMALLOC
+ if (g->allocf == lj_alloc_f)
+Index: luajit/src/lj_strfmt.c
+===================================================================
+--- luajit.orig/src/lj_strfmt.c
++++ luajit/src/lj_strfmt.c
+@@ -393,7 +393,7 @@
+ p = lj_buf_wmem(p, "builtin#", 8);
+ p = lj_strfmt_wint(p, funcV(o)->c.ffid);
+ } else {
+- p = lj_strfmt_wptr(p, lj_obj_ptr(o));
++ p = lj_strfmt_wptr(p, lj_obj_ptr(G(L), o));
+ }
+ return lj_str_new(L, buf, (size_t)(p - buf));
+ }
diff --git a/srcpkgs/LuaJIT/template b/srcpkgs/LuaJIT/template
index 5b8ab1beda11..778a8df0e593 100644
--- a/srcpkgs/LuaJIT/template
+++ b/srcpkgs/LuaJIT/template
@@ -1,7 +1,7 @@
# Template file for 'LuaJIT'
pkgname=LuaJIT
version=2.1.0beta3
-revision=1
+revision=2
_so_version=2.1.0
_dist_version=${_so_version}-beta3
wrksrc="${pkgname}-${_dist_version}"
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PR PATCH] [Merged]: LuaJIT: import upstream patches to fix crashes on aarch64
2021-09-25 10:19 [PR PATCH] LuaJIT: import upstream patch to support 64bit lightuserdata on aarch64 Johnnynator
2021-09-25 11:29 ` [PR PATCH] [Updated] " Johnnynator
@ 2021-09-26 8:12 ` Johnnynator
1 sibling, 0 replies; 3+ messages in thread
From: Johnnynator @ 2021-09-26 8:12 UTC (permalink / raw)
To: ml
[-- Attachment #1: Type: text/plain, Size: 1589 bytes --]
There's a merged pull request on the void-packages repository
LuaJIT: import upstream patches to fix crashes on aarch64
https://github.com/void-linux/void-packages/pull/33098
Description:
without this e.g. luajit just crashes on native neovim builds and under
certain conditions also during runtime e.g. with nvim-cmp + nvim-cmp-lsp
<!-- Mark items with [x] where applicable -->
#### General
- [ ] This is a new package and it conforms to the [quality requirements](https://github.com/void-linux/void-packages/blob/master/Manual.md#quality-requirements)
#### Have the results of the proposed changes been tested?
- [ ] I use the packages affected by the proposed changes on a regular basis and confirm this PR works for me
- [ ] I generally don't use the affected packages but briefly tested this PR
<!--
If GitHub CI cannot be used to validate the build result (for example, if the
build is likely to take several hours), make sure to
[skip CI](https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#continuous-integration).
When skipping CI, uncomment and fill out the following section.
Note: for builds that are likely to complete in less than 2 hours, it is not
acceptable to skip CI.
-->
<!--
#### Does it build and run successfully?
(Please choose at least one native build and, if supported, at least one cross build. More are better.)
- [ ] I built this PR locally for my native architecture, (ARCH-LIBC)
- [ ] I built this PR locally for these architectures (if supported. mark crossbuilds):
- [ ] aarch64-musl
- [ ] armv7l
- [ ] armv6l-musl
-->
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2021-09-26 8:12 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-09-25 10:19 [PR PATCH] LuaJIT: import upstream patch to support 64bit lightuserdata on aarch64 Johnnynator
2021-09-25 11:29 ` [PR PATCH] [Updated] " Johnnynator
2021-09-26 8:12 ` [PR PATCH] [Merged]: LuaJIT: import upstream patches to fix crashes " Johnnynator
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).