mirror of
https://github.com/LuaJIT/LuaJIT.git
synced 2025-02-07 23:24:09 +00:00
Move helper for syncing data/instruction cache to lj_mcode.c.
Sync caches after dynamic code generation for FFI callbacks.
This commit is contained in:
parent
2d8f3d75df
commit
10474987bd
@ -75,7 +75,7 @@ lj_ccall.o: lj_ccall.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
|
|||||||
lj_ccallback.o: lj_ccallback.c lj_obj.h lua.h luaconf.h lj_def.h \
|
lj_ccallback.o: lj_ccallback.c lj_obj.h lua.h luaconf.h lj_def.h \
|
||||||
lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_tab.h lj_state.h lj_frame.h \
|
lj_arch.h lj_gc.h lj_err.h lj_errmsg.h lj_tab.h lj_state.h lj_frame.h \
|
||||||
lj_bc.h lj_ctype.h lj_cconv.h lj_ccall.h lj_ccallback.h lj_target.h \
|
lj_bc.h lj_ctype.h lj_cconv.h lj_ccall.h lj_ccallback.h lj_target.h \
|
||||||
lj_target_*.h lj_vm.h
|
lj_target_*.h lj_mcode.h lj_jit.h lj_ir.h lj_vm.h
|
||||||
lj_cconv.o: lj_cconv.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
|
lj_cconv.o: lj_cconv.c lj_obj.h lua.h luaconf.h lj_def.h lj_arch.h \
|
||||||
lj_err.h lj_errmsg.h lj_tab.h lj_ctype.h lj_gc.h lj_cdata.h lj_cconv.h \
|
lj_err.h lj_errmsg.h lj_tab.h lj_ctype.h lj_gc.h lj_cdata.h lj_cconv.h \
|
||||||
lj_ccallback.h
|
lj_ccallback.h
|
||||||
@ -195,10 +195,10 @@ ljamalg.o: ljamalg.c lua.h luaconf.h lauxlib.h lj_gc.c lj_obj.h lj_def.h \
|
|||||||
lj_vmevent.h lj_vmmath.c lj_api.c lj_bcdump.h lj_parse.h lj_lex.c \
|
lj_vmevent.h lj_vmmath.c lj_api.c lj_bcdump.h lj_parse.h lj_lex.c \
|
||||||
lualib.h lj_parse.c lj_bcread.c lj_bcwrite.c lj_ctype.c lj_ccallback.h \
|
lualib.h lj_parse.c lj_bcread.c lj_bcwrite.c lj_ctype.c lj_ccallback.h \
|
||||||
lj_cdata.c lj_cconv.h lj_cconv.c lj_ccall.c lj_ccall.h lj_ccallback.c \
|
lj_cdata.c lj_cconv.h lj_cconv.c lj_ccall.c lj_ccall.h lj_ccallback.c \
|
||||||
lj_target.h lj_target_*.h lj_carith.c lj_carith.h lj_clib.c lj_clib.h \
|
lj_target.h lj_target_*.h lj_mcode.h lj_carith.c lj_carith.h lj_clib.c \
|
||||||
lj_cparse.c lj_cparse.h lj_lib.c lj_lib.h lj_ir.c lj_ircall.h lj_iropt.h \
|
lj_clib.h lj_cparse.c lj_cparse.h lj_lib.c lj_lib.h lj_ir.c lj_ircall.h \
|
||||||
lj_opt_mem.c lj_opt_fold.c lj_folddef.h lj_opt_narrow.c lj_opt_dce.c \
|
lj_iropt.h lj_opt_mem.c lj_opt_fold.c lj_folddef.h lj_opt_narrow.c \
|
||||||
lj_opt_loop.c lj_snap.h lj_opt_split.c lj_mcode.c lj_mcode.h lj_snap.c \
|
lj_opt_dce.c lj_opt_loop.c lj_snap.h lj_opt_split.c lj_mcode.c lj_snap.c \
|
||||||
lj_record.c lj_record.h lj_ffrecord.h lj_crecord.c lj_crecord.h \
|
lj_record.c lj_record.h lj_ffrecord.h lj_crecord.c lj_crecord.h \
|
||||||
lj_ffrecord.c lj_recdef.h lj_asm.c lj_asm.h lj_emit_*.h lj_asm_*.h \
|
lj_ffrecord.c lj_recdef.h lj_asm.c lj_asm.h lj_emit_*.h lj_asm_*.h \
|
||||||
lj_trace.c lj_gdbjit.h lj_gdbjit.c lj_alloc.c lib_aux.c lib_base.c \
|
lj_trace.c lj_gdbjit.h lj_gdbjit.c lj_alloc.c lib_aux.c lib_base.c \
|
||||||
|
45
src/lj_asm.c
45
src/lj_asm.c
@ -147,14 +147,6 @@ IRFLDEF(FLOFS)
|
|||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Define this if you want to run LuaJIT with Valgrind. */
|
|
||||||
#ifdef LUAJIT_USE_VALGRIND
|
|
||||||
#include <valgrind/valgrind.h>
|
|
||||||
#define VG_INVALIDATE(p, sz) VALGRIND_DISCARD_TRANSLATIONS(p, sz)
|
|
||||||
#else
|
|
||||||
#define VG_INVALIDATE(p, sz) ((void)0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* -- Target-specific instruction emitter --------------------------------- */
|
/* -- Target-specific instruction emitter --------------------------------- */
|
||||||
|
|
||||||
#if LJ_TARGET_X86ORX64
|
#if LJ_TARGET_X86ORX64
|
||||||
@ -931,41 +923,6 @@ static uint32_t ir_khash(IRIns *ir)
|
|||||||
return hashrot(lo, hi);
|
return hashrot(lo, hi);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !LJ_TARGET_X86ORX64 && LJ_TARGET_OSX
|
|
||||||
void sys_icache_invalidate(void *start, size_t len);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if LJ_TARGET_LINUX && LJ_TARGET_PPC
|
|
||||||
#include <dlfcn.h>
|
|
||||||
static void (*asm_ppc_cache_flush)(MCode *start, MCode *end);
|
|
||||||
static void asm_dummy_cache_flush(MCode *start, MCode *end)
|
|
||||||
{
|
|
||||||
UNUSED(start); UNUSED(end);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Flush instruction cache. */
|
|
||||||
static void asm_cache_flush(MCode *start, MCode *end)
|
|
||||||
{
|
|
||||||
VG_INVALIDATE(start, (char *)end-(char *)start);
|
|
||||||
#if LJ_TARGET_X86ORX64
|
|
||||||
UNUSED(start); UNUSED(end);
|
|
||||||
#elif LJ_TARGET_OSX
|
|
||||||
sys_icache_invalidate(start, end-start);
|
|
||||||
#elif LJ_TARGET_LINUX && LJ_TARGET_PPC
|
|
||||||
if (!asm_ppc_cache_flush) {
|
|
||||||
void *vdso = dlopen("linux-vdso32.so.1", RTLD_LAZY);
|
|
||||||
if (!vdso || !(asm_ppc_cache_flush = dlsym(vdso, "__kernel_sync_dicache")))
|
|
||||||
asm_ppc_cache_flush = asm_dummy_cache_flush;
|
|
||||||
}
|
|
||||||
asm_ppc_cache_flush(start, end);
|
|
||||||
#elif defined(__GNUC__) && !LJ_TARGET_PPC
|
|
||||||
__clear_cache(start, end);
|
|
||||||
#else
|
|
||||||
#error "Missing builtin to flush instruction cache"
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* -- Allocations --------------------------------------------------------- */
|
/* -- Allocations --------------------------------------------------------- */
|
||||||
|
|
||||||
static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args);
|
static void asm_gencall(ASMState *as, const CCallInfo *ci, IRRef *args);
|
||||||
@ -1776,7 +1733,7 @@ void lj_asm_trace(jit_State *J, GCtrace *T)
|
|||||||
if (!as->loopref)
|
if (!as->loopref)
|
||||||
asm_tail_fixup(as, T->link); /* Note: this may change as->mctop! */
|
asm_tail_fixup(as, T->link); /* Note: this may change as->mctop! */
|
||||||
T->szmcode = (MSize)((char *)as->mctop - (char *)as->mcp);
|
T->szmcode = (MSize)((char *)as->mctop - (char *)as->mcp);
|
||||||
asm_cache_flush(T->mcode, origtop);
|
lj_mcode_sync(T->mcode, origtop);
|
||||||
}
|
}
|
||||||
|
|
||||||
#undef IR
|
#undef IR
|
||||||
|
@ -1779,7 +1779,7 @@ void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno, MCode *target)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
lua_assert(cstart != NULL);
|
lua_assert(cstart != NULL);
|
||||||
asm_cache_flush(cstart, cend);
|
lj_mcode_sync(cstart, cend);
|
||||||
lj_mcode_patch(J, mcarea, 1);
|
lj_mcode_patch(J, mcarea, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2130,13 +2130,13 @@ void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno, MCode *target)
|
|||||||
*px = PPCI_B | ((uint32_t)delta & 0x03ffffffu);
|
*px = PPCI_B | ((uint32_t)delta & 0x03ffffffu);
|
||||||
}
|
}
|
||||||
if (!cstart) cstart = px;
|
if (!cstart) cstart = px;
|
||||||
asm_cache_flush(cstart, px+1);
|
lj_mcode_sync(cstart, px+1);
|
||||||
if (clearso) { /* Extend the current trace. Ugly workaround. */
|
if (clearso) { /* Extend the current trace. Ugly workaround. */
|
||||||
MCode *pp = J->cur.mcode;
|
MCode *pp = J->cur.mcode;
|
||||||
J->cur.szmcode += sizeof(MCode);
|
J->cur.szmcode += sizeof(MCode);
|
||||||
*--pp = PPCI_MCRXR; /* Clear SO flag. */
|
*--pp = PPCI_MCRXR; /* Clear SO flag. */
|
||||||
J->cur.mcode = pp;
|
J->cur.mcode = pp;
|
||||||
asm_cache_flush(pp, pp+1);
|
lj_mcode_sync(pp, pp+1);
|
||||||
}
|
}
|
||||||
lj_mcode_patch(J, mcarea, 1);
|
lj_mcode_patch(J, mcarea, 1);
|
||||||
}
|
}
|
||||||
|
@ -2745,7 +2745,7 @@ void lj_asm_patchexit(jit_State *J, GCtrace *T, ExitNo exitno, MCode *target)
|
|||||||
p += 5;
|
p += 5;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
lj_mcode_sync(T->mcode, T->mcode + T->szmcode);
|
||||||
lj_mcode_patch(J, mcarea, 1);
|
lj_mcode_patch(J, mcarea, 1);
|
||||||
VG_INVALIDATE(T->mcode, T->szmcode);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#include "lj_ccall.h"
|
#include "lj_ccall.h"
|
||||||
#include "lj_ccallback.h"
|
#include "lj_ccallback.h"
|
||||||
#include "lj_target.h"
|
#include "lj_target.h"
|
||||||
|
#include "lj_mcode.h"
|
||||||
#include "lj_vm.h"
|
#include "lj_vm.h"
|
||||||
|
|
||||||
/* -- Target-specific handling of callback slots -------------------------- */
|
/* -- Target-specific handling of callback slots -------------------------- */
|
||||||
@ -145,6 +146,7 @@ static void callback_mcode_new(CTState *cts)
|
|||||||
#endif
|
#endif
|
||||||
cts->cb.mcode = p;
|
cts->cb.mcode = p;
|
||||||
callback_mcode_init(cts->g, p);
|
callback_mcode_init(cts->g, p);
|
||||||
|
lj_mcode_sync(p, (char *)p + sz);
|
||||||
#if LJ_TARGET_WINDOWS
|
#if LJ_TARGET_WINDOWS
|
||||||
{
|
{
|
||||||
DWORD oprot;
|
DWORD oprot;
|
||||||
|
@ -7,18 +7,65 @@
|
|||||||
#define LUA_CORE
|
#define LUA_CORE
|
||||||
|
|
||||||
#include "lj_obj.h"
|
#include "lj_obj.h"
|
||||||
|
|
||||||
#if LJ_HASJIT
|
#if LJ_HASJIT
|
||||||
|
|
||||||
#include "lj_gc.h"
|
#include "lj_gc.h"
|
||||||
#include "lj_jit.h"
|
#include "lj_jit.h"
|
||||||
#include "lj_mcode.h"
|
#include "lj_mcode.h"
|
||||||
#include "lj_trace.h"
|
#include "lj_trace.h"
|
||||||
#include "lj_dispatch.h"
|
#include "lj_dispatch.h"
|
||||||
#include "lj_vm.h"
|
#include "lj_vm.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
/* -- OS-specific functions ----------------------------------------------- */
|
/* -- OS-specific functions ----------------------------------------------- */
|
||||||
|
|
||||||
|
#if LJ_HASJIT || LJ_HASFFI
|
||||||
|
|
||||||
|
/* Define this if you want to run LuaJIT with Valgrind. */
|
||||||
|
#ifdef LUAJIT_USE_VALGRIND
|
||||||
|
#include <valgrind/valgrind.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if !LJ_TARGET_X86ORX64 && LJ_TARGET_OSX
|
||||||
|
void sys_icache_invalidate(void *start, size_t len);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if LJ_TARGET_LINUX && LJ_TARGET_PPC
|
||||||
|
#include <dlfcn.h>
|
||||||
|
static void (*mcode_sync_ppc)(void *start, void *end);
|
||||||
|
static void mcode_sync_dummy(void *start, void *end)
|
||||||
|
{
|
||||||
|
UNUSED(start); UNUSED(end);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Synchronize data/instruction cache. */
|
||||||
|
void lj_mcode_sync(void *start, void *end)
|
||||||
|
{
|
||||||
|
#ifdef LUAJIT_USE_VALGRIND
|
||||||
|
VALGRIND_DISCARD_TRANSLATIONS(start, (char *)end-(char *)start);
|
||||||
|
#endif
|
||||||
|
#if LJ_TARGET_X86ORX64
|
||||||
|
UNUSED(start); UNUSED(end);
|
||||||
|
#elif LJ_TARGET_OSX
|
||||||
|
sys_icache_invalidate(start, (char *)end-(char *)start);
|
||||||
|
#elif LJ_TARGET_LINUX && LJ_TARGET_PPC
|
||||||
|
if (!mcode_sync_ppc) {
|
||||||
|
void *vdso = dlopen("linux-vdso32.so.1", RTLD_LAZY);
|
||||||
|
if (!vdso || !(mcode_sync_ppc = dlsym(vdso, "__kernel_sync_dicache")))
|
||||||
|
mcode_sync_ppc = mcode_sync_dummy;
|
||||||
|
}
|
||||||
|
mcode_sync_ppc(start, end);
|
||||||
|
#elif defined(__GNUC__) && !LJ_TARGET_PPC
|
||||||
|
__clear_cache(start, end);
|
||||||
|
#else
|
||||||
|
#error "Missing builtin to flush instruction cache"
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if LJ_HASJIT
|
||||||
|
|
||||||
#if LJ_TARGET_WINDOWS
|
#if LJ_TARGET_WINDOWS
|
||||||
|
|
||||||
#define WIN32_LEAN_AND_MEAN
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
@ -6,9 +6,16 @@
|
|||||||
#ifndef _LJ_MCODE_H
|
#ifndef _LJ_MCODE_H
|
||||||
#define _LJ_MCODE_H
|
#define _LJ_MCODE_H
|
||||||
|
|
||||||
#include "lj_jit.h"
|
#include "lj_obj.h"
|
||||||
|
|
||||||
|
#if LJ_HASJIT || LJ_HASFFI
|
||||||
|
LJ_FUNC void lj_mcode_sync(void *start, void *end);
|
||||||
|
#endif
|
||||||
|
|
||||||
#if LJ_HASJIT
|
#if LJ_HASJIT
|
||||||
|
|
||||||
|
#include "lj_jit.h"
|
||||||
|
|
||||||
LJ_FUNC void lj_mcode_free(jit_State *J);
|
LJ_FUNC void lj_mcode_free(jit_State *J);
|
||||||
LJ_FUNC MCode *lj_mcode_reserve(jit_State *J, MCode **lim);
|
LJ_FUNC MCode *lj_mcode_reserve(jit_State *J, MCode **lim);
|
||||||
LJ_FUNC void lj_mcode_commit(jit_State *J, MCode *m);
|
LJ_FUNC void lj_mcode_commit(jit_State *J, MCode *m);
|
||||||
|
Loading…
Reference in New Issue
Block a user